1.前言
很多同学进入公司就开始参与项目开发,大多数情况是对某个项目进行维护或者需求迭代,能够从0到1参与到项目中的机会很少,因此并没有多少机会了解某些技术的运行机制。换句话说,有的面试官在面试的时候就会探讨深层的技术问题,而不是关心你知道什么业务,怎么用技术去实现业务。
今天要讲的就是SpringBoot操纵数据库,这个大家做得比较多的就是去写一个Dao的类,然后在mapper.xml文件里面写SQL,最后封装成Service供Controller调。如果让你去搭建好这个项目的基础框架,你该怎么做呢,我们今天就来看看。
2.Spring架构
下面这张图是我最喜欢看的一张图,也是对Spring体系结构描述最准确的一张图,大家学习Spring了解最多的可能是IOC、DI、AOP这些名词,其实Spring还有一个很强大的组件就是Spring Data。
如果是只用Spring,则需要采用下面依赖,就可以进行数据库的访问了:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
3.SpringBoot操纵数据库
现在的项目一般都是基于SpringBoot的,我们只需通过下面的依赖即可访问数据源:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
点进这个依赖进去看,会发现它又依赖于:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.4.RELEASE</version>
<scope>compile</scope>
</dependency>
我们知道了SpringBoot的默认连接池用的HikariCP。因为我们连接的是mysql数据库,因此除了依赖spring-boot-starter-jdbc,还需要依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
下面在数据库建一张student的表(这个不需要讲如何建吧,如果需要欢迎留言),然后写一个controller类如下:
@RestController
public class StudentController {
@Autowired
JdbcTemplate jdbcTemplate;
@GetMapping("/students")
public List<Map<String,Object>> userList(){
String sql = "select * from student";
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
return maps;
}
}
启动SpringBoot,如何建一个SpringBoot项目如果不会可以参考我的文章:
在浏览器中输入:http://localhost:8080/students
结果就来了,如何结果没出来的欢迎留言,我会及时解答。这个时候看控制台的输出,会发现是使用的HikariPool
2023-04-13 22:47:56.526 INFO 22916 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2023-04-13 22:47:58.365 INFO 22916 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
4.配置数据库连接池Druid
不用SpringBoot自带的连接池,使用阿里巴巴的Druid连接池,添加pom依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
在application.yml里面增加数据源类型:
type: com.alibaba.druid.pool.DruidDataSource
重新启动服务,调用上面的接口:
2023-04-13 22:57:26.563 INFO 18764 --- [nio-8080-exec-1] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
5.使用MyBatis
好的数据访问离不开优秀的持久层框架,这时就要用MyBatis,用了它不仅可以将SQL和Java代码分离,还能非常方便的讲Java实体与数据库数据做映射。添加pom依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
写一个实体类接收数据,字段和数据库里一致即可,这里就不贴代码了。再写一个接口:
@Mapper
public interface StudentDao {
List<Student> getAll();
}
在mapper.xml文件里写:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.dao.StudentDao">
<select id="getAll" resultType="com.example.entity.Student">
select * from student
</select>
</mapper>
最后在controller里写:
@GetMapping("/studentList")
public List<Student> studentList(){
List<Student> list = studentDao.getAll();
return list;
}
总结
今天一步步从架构谈起,讲到如何去使用更优秀的连接池以及持久层框架去做数据存储,希望能让大家更清楚这里面的原理。