ElasticSearch
- 依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 版本一致
<properties>
<java.version>1.8</java.version>
<!--自定义ES版本保证本地和SpringBoot一致-->
<elasticsearch.version>7.3.1</elasticsearch.version>
</properties>
- ES配置
@Configuration
public class EsConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")));
return client;
}
}
- 单元测试
@SpringBootTest
class DemoApplicationTests {
@Autowired
@Qualifier("restHighLevelClient") //配置类中的方法名
private RestHighLevelClient client;
//测试索引的创建
@Test
void testCreateIndex() throws IOException {
//1.创建索引
CreateIndexRequest request = new CreateIndexRequest("yaojun_index");
//2.客户端执行请求 获得响应
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(response);
}
//获取索引
@Test
void testGetIndex() throws IOException {
//1.获取索引
GetIndexRequest request = new GetIndexRequest("yaojun_index");
//2.客户端执行请求 获得响应
boolean response = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(response);
}
//删除索引,注意只能删除一次
@Test
void testDeleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("yaojun_index");
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(response.isAcknowledged());
}
//测试添加文档
@Test
void testAddDocument() throws Exception{
//1.创建对象
User user = new User("yaojun", 3);
// 2.创建请求
IndexRequest request = new IndexRequest("yaojun");
//3.规则 put /yaojun_index/doc/1
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
//4.将我们的数据放入请求 json
IndexRequest source = request.source(JSON.toJSONString(user), XContentType.JSON);
//5.客户端发送请求 获取响应结果
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
System.out.println(response.status());
}
//获取文档 判断是否存在get /yaojun/doc/1
@Test
void testIsExist() throws Exception{
GetRequest getRequest = new GetRequest("yaojun", "1");
//不获取返回的_source的上下文了
getRequest.fetchSourceContext(new FetchSourceContext(false));
boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
//获取文档
@Test
void testGetDocument()throws Exception{
GetRequest getRequest = new GetRequest("yaojun", "1");
GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString()); //打印文档的内容
System.out.println(response);
}
//更新文档
@Test
void testUpdateDocument()throws Exception{
UpdateRequest updateRequest = new UpdateRequest("yaojun", "1");
updateRequest.timeout("1s");
User user = new User("姚军",18);
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
UpdateResponse response = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(response.status());
}
//删除文档
@Test
void testDeleteDocument()throws Exception{
DeleteRequest request = new DeleteRequest("yaojun", "1");
request.timeout("1s");
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
//删除文档
@Test
void testBulkDocument()throws Exception{
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> userList = new ArrayList<>();
userList.add(new User("姚军1", 18));
userList.add(new User("姚军2", 19));
userList.add(new User("姚军3", 8));
userList.add(new User("姚军4", 8));
userList.add(new User("姚军5", 8));
//批处理请求
for(int i = 0; i < userList.size(); i++){
bulkRequest.add(
new IndexRequest("yaojun").id(""+(i+1)).source(JSON.toJSONString(userList.get(i)), XContentType.JSON)
);
}
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); //判断是否失败
}
//查询
@Test
void testSearchDocument()throws Exception{
SearchRequest request = new SearchRequest("yaojun");
//构建搜索条件
SearchSourceBuilder searchSource = new SearchSourceBuilder();
//查询语句
//QueryBuilders.termQuery() 精确匹配
// QueryBuilders.matchAllQuery() 匹配全部
TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "yaojun");
searchSource.query(termQuery);
//searchSource.from(); 构建分页
//searchSource.size();
searchSource.timeout(new TimeValue(60, TimeUnit.SECONDS));
request.source(searchSource);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(response.getHits()));
System.out.println("====================");
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
}
}
集成Redis
-
默认使用的jdk序列化,可以重写redisTemplate配置类,配置具体的序列化方式。
-
在企业中,我们所有的pojo类都需要序列化。
-
依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
配置参数
spring.redis.host=127.0.0.1 spring.redis.port=6379
-
yaml
spring: redis: host: 127.0.0.1 port: 6379
-
RedisTemplate键值对为对象
@SpringBootTest class DemoApplicationTests { @Autowired private RedisTemplate redisTemplate; @Test void contextLoads() { //opsForValue() 操作字符串 //opsForList() 操作列表 //opsForSet() redisTemplate.opsForValue().set("myKey","YaoJun"); System.out.println(redisTemplate.opsForValue().get("myKey")); } }
-
StringRedisTemplate键值对为字符串
@SpringBootTest(classes = DemoApplication.class) @RunWith(SpringRunner.class) class DemoApplicationTests { /*key和value都是字符串*/ @Autowired private StringRedisTemplate template; /*opsForValue实际操作的是字符串get和set*/ @Test void testStringRedisTemplate() { template.opsForValue().set("name","jun"); System.out.println(template.opsForValue().get("myKey")); } @Test void testKey() { /*删除一个key*/ template.delete("name"); /*判断某个key是否存在*/ Boolean hasKey = template.hasKey("myKey"); System.out.println(hasKey); /*判断key所对应的类型*/ DataType myKey = template.type("myKey"); System.out.println(myKey); /*获取redis中所有key*/ Set<String> keys = template.keys("*"); keys.forEach(k-> System.out.println("key = "+k)); } }
整合JDBC
Spring Boot底层统一采用Spring data进行处理
-
控制层
@RestController public class JdbcController { @Autowired JdbcTemplate jdbcTemplate; //查询数据库的所有信息 @GetMapping("/userList") public List<Map<String, Object>> userList(){ String sql = "select * from department"; List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql); return maps; } @GetMapping("/addUser") public String addUser(){ String sql = "insert into yaojun.department(id,name,phone) values(3, 'Jack',8910)"; jdbcTemplate.update(sql); return "update_ok"; } }
-
依赖包
<dependencies> <!--1.jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--2.mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> <scope>runtime</scope> </dependency> <!--3.web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
-
配置文件
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/yaojun?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver
整合Mybatis
遇到的坑
- mysql-connector的版本必须和本地mysql版本一致,特别是mysql8.0以上的。
- mybatis.mapper目录是两层目录的叠加,但是不能像创建Java文件一样一步创建完,必须一层一层创建,不然找不到mapper.xml文件。【经常在这里掉链子】
- mybatis是简化jdbc的操作,所以必须先判断数据库是否能连接上。
主要是将sql语句的编写统一放到了配置文件中,需要结合jdbc使用。
-
依赖包
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency>
-
附加配置
# 整合mybatis mybatis: type-aliases-package: com.bytedance.pojo mapper-locations: mybatis/mapper/*.xml
-
Mapper配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.bytedance.mapper.UserMapper"> <!--查询数据--> <select id="queryUserList" resultType="User"> select * from user; </select> <!--添加数据--> <insert id="addUser" parameterType="User"> insert into user (id, name, pwd) values (#{id}, #{name}, #{pwd}) </insert> </mapper>
-
模型层
@Repository @Mapper //表示这是一个mybatis的mapper类 public interface UserMapper { List<User> queryUserList(); User queryUserById(int id); int addUser(User user); int updateUser(User user); int deleteUser(int id); }
-
实体类
@Data @NoArgsConstructor public class User { private int id; private String name; private int pwd; public User(int id, String name, int pwd) { this.id = id; this.name = name; this.pwd = pwd; } }
-
控制层
@RestController public class UserController { @Autowired private UserMapper userMapper; //查询用户 @GetMapping("/queryUserList") public List<User> queryUserList(){ List<User> users = userMapper.queryUserList(); for (User user : users) { System.out.println(user); } return users; } //添加用户 @GetMapping("/addUser") public String addUser(){ userMapper.addUser(new User(5,"Tim",12345)); return "addUser_ok"; } }
邮件Email
- 依赖包
<!--email-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 配置
spring.mail.host=smtp.qq.com
spring.mail.username=940334249@qq.com
#qq设置账户里面获取
spring.mail.password=xxx
#开启加密验证
spring.mail.properties.mail.smtp.ssl.enable=true
- 单元测试
package com.bytedance;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@SpringBootTest
public class EmailTest {
@Autowired
JavaMailSenderImpl mailSender;
@Test
void test(){
//一个简单的邮件
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setSubject("主题");
mailMessage.setText("正文");
mailMessage.setTo("[email protected]");
mailMessage.setFrom("[email protected]");
mailSender.send(mailMessage);
}
@Test
void mimeEmailTest() throws MessagingException {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setSubject("主题_mime");
helper.setText("<p style='color:red'>你好牛逼MIME<p>", true);
//附件
helper.addAttachment("神乐板真冬.jpg", new File("E:\\image\\red.jpg"));
helper.setTo("[email protected]");
helper.setFrom("[email protected]");
mailSender.send(mimeMessage);
}
}