Springboot数据层开发
数据源自动管理
引入jdbc的依赖和springboot的应用场景
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

创建application.yaml

测试数据源
java
@RunWith(SpringRunner.class)
@SpringBootTest
public class DataSourcesTest {
@Autowired
DataSource dataSource;
@Test
public void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
}

org.springframework.boot.autoconfigure.jdbc
参考 org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration,SpringBoot 默认使用的是 hikari 连接池,默认支持 org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、dbcp2.BasicDataSource 数据源连接池类型,使用 spring.datasource.type 进行指定自定义的数据源类型。
自定义数据源类型源码:

配置druid数据源
首先需要引入druid 连接池和日志依赖
xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
在 application.yaml 中加入 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
验证:

在 application.yaml 中加入其他属性配置

DataSourceProperties 类源码:

spring.datasource 中默认没有这些属性,所以 application.yaml 中会标黄,且不起作用

我们需要创建数据源注册类
java
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource(){
return new DruidDataSource();
}
}
DruidDataSource 类包含了那些其他配置属性,如图:

验证,发现这样属性配置就起作用了

配置druid运行期监控
StatViewServlet 是 Druid 数据库连接池提供的一个内置监控 Servlet,核心作用是通过 Web 界面可视化监控 Druid 连接池的运行状态、SQL 执行情况、慢查询统计等核心指标,是 Druid 连接池的核心监控组件之一。

WebStatFilter 是 Druid 数据库连接池提供的一款 Web 监控过滤器,核心作用是采集 Web 应用中HTTP 请求与数据库操作的关联链路数据,为 StatViewServlet(Druid 监控页面)提供Web 层面的监控数据支撑。

代码内容:
我们需要配置一个管理后台的 Servlet,还需要配置一个监控的 filter,以及配置初始化参数
java
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource(){
return new DruidDataSource();
}
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),
"/druid/*");
Map<String,String> initParams = new HashMap<>();
initParams.put("loginUsername","root");
initParams.put("loginPassword","root");
initParams.put("allow","");//默认就是允许所有访问
initParams.put("deny","192.168.15.21");
bean.setInitParameters(initParams);
return bean;
}
//2、配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean;
bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
http://localhost:8080/druid 打开监控页面

springboot整合jdbcTemplate
首先需要在数据库中创建表
sql
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`username` varchar(10) DEFAULT NULL,
`userId` int(10) NOT NULL,
`password` varchar(10) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Springboot中提供了JdbcTemplateAutoConfiguration的自动配置 org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,
JdbcTemplateAutoConfiguration源码:

java
@Controller
public class TestController {
@Autowired
JdbcTemplate jdbcTemplate;
@ResponseBody
@RequestMapping("/query")
public List<Map<String, Object>> query(){
List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT * FROM user");
return maps;
}
}
由于 Springboot 中提供了 JdbcTemplateAutoConfiguration 的自动配置,直接使用 @Autowired 注解注入即可,启动 springboot,测试访问 http://localhost:8080/query

访问成功
打开监控页面

Springboot整合mybatis注解版
导入 mybatis 整合 springboot 模块
xml
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

创建JavaBean
java
import java.util.Date;
public class Person {
private int pid;
private String pname;
private String addr;
private int gender;
private Date birth;
public Person() {
}
public Person(int pid, String pname, String addr, int gender, Date birth) {
this.pid = pid;
this.pname = pname;
this.addr = addr;
this.gender = gender;
this.birth = birth;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return "Person{" +
"pid=" + pid +
", pname='" + pname + '\'' +
", addr='" + addr + '\'' +
", gender=" + gender +
", birth=" + birth +
'}';
}
}
创建Mapper
java
import java.util.List;
@Mapper
public interface PersonMapper {
@Select("select * from person")
public List<Person> getPersons();
@Select("select * from person t where t.pid = #{id}")
public Person getPersonById(int id);
@Options(useGeneratedKeys =true, keyProperty = "pid")
@Insert("insert into person(pid, pname, addr,gender, birth)" +
" values(#{pid}, #{pname}, #{addr},#{gender}, #{birth})")
public void insert(Person person);
@Delete("delete from person where pid = #{id}")
public void update(int id);
}
其中 @Options(useGeneratedKeys =true, keyProperty = "pid"),MyBatis 会获取到自增的 pid,自动赋值给传入的 person 对象的 pid 属性。
@Mapper 用于明确标记 MyBatis 对应的 Mapper 接口,核心职责是为 MyBatis 提供接口识别信号,触发 MyBatis 对接口的解析与动态代理实现类生成;在 Spring Boot 整合 MyBatis的场景下,该动态代理类会被自动注册为 Spring 容器中的 Bean,支持业务代码通过 @Autowired 直接注入使用。
单元测试
java
@RunWith(SpringRunner.class)
@SpringBootTest
public class springBootMybatisTest {
@Autowired
PersonMapper personMapper;
@Test
public void testMybatis() throws SQLException {
List<Person> persons = personMapper.getPersons();
for (Person person : persons) {
System.out.println(person);
}
}
@Test
public void testMybatis1() throws SQLException {
Person p = personMapper.getPersonById(1);
System.out.println(p);
}
}

开启 MyBatis 的下划线转驼峰命名自动映射功能
java
@Configuration
public class MybatisConfig {
@Bean
public ConfigurationCustomizer getCustomizer(){
return new ConfigurationCustomizer() {
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
当项目中 Mapper 接口数量较多,若在每个 Mapper 接口上逐一添加 @Mapper 注解,会增加重复工作量且不易维护。此时可采用 @MapperScan 注解的批量扫描方案。在 MyBatis 相关配置类或 Spring Boot 主启动类上添加 @MapperScan 注解,指定 Mapper 接口所在的包路径,MyBatis 会自动扫描该路径下所有接口,将其识别为 Mapper 接口,无需额外标注 @Mapper,即可完成动态代理实现类的生成与 Spring Bean 的注册。
Springboot整合mybatis配置文件
classpath:mybatis 下创建 sqlMapConfig.xml 全局配置文件
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
其中 mapUnderscoreToCamelCase 值为 true 用于开启下划线转驼峰命名自动映射功能
创建sql映射文件 PersonMapper.xml
xml
<?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.qcby.springBootMybatis.mapper.PersonMapper">
<select id="getPersons" resultType="com.qcby.springBootMybatis.bean.Person">
select * from person
</select>
</mapper>
在 application.yaml 中配置 mybatis 相关配置信息

其中
config-location 值为全局配置文件路径
mapper-locations 值为sql映射文件
type-aliases-package 值为实体类全类名
测试验证

使用了 Springboo t整合 mybatis 配置文件方式,Springboot 整合mybatis 注解版也同样会生效