Springboot数据层开发 — 整合jdbcTemplate、mybatis
目录
1. 数据源自动管理
1.1 引入 JDBC 依赖和 Spring Boot 应用场景
2. 配置 Druid 数据源
3. Spring Boot 整合 JdbcTemplate
JdbcTemplateAutoConfiguration 源码解析
4. Spring Boot 整合 MyBatis 注解版
4.1 引入 MyBatis 依赖
4.2 配置数据源
4.3 建表
4.4 创建 JavaBean
4.5 创建 Mapper
4.6 单元测试
解决驼峰模式和数据库下划线映射问题
4.7 查询结果
编辑
4.8 Mapper 接口扫描
5. Spring Boot 整合 MyBatis 配置文件
5.1 创建 sqlMapConfig.xml 配置文件
5.2 创建映射文件 MyUserMapper.xml
5.3 在application.yaml中配置mybatis的信息
5.4 测试
5.5 查询结果
1. 数据源自动管理
1.1 引入 JDBC 依赖和 Spring Boot 应用场景
在 Spring Boot 应用中,我们可以通过引入 JDBC 相关的依赖来管理数据库连接。以下是 Maven 依赖配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
通过这些依赖,Spring Boot 可以自动配置数据库连接池。以下是使用 YAML 配置数据库连接池的示例:
spring:
datasource:
username: root
password: 你自己的数据库密码
url: jdbc:mysql://localhost:3306/boot_demo
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
#初始连接数量
initial-size: 20
#最小连接数量
min-idle: 20
#最大连接数量
max-active: 1000
#获取连接等待超时的时间 单位是毫秒,这里配置60秒
max-wait: 60000
#查询超时时间 单位是毫秒 这里配置6秒,如果你查询数据量大的情况下这个配置的大一点,不然查询报错抛出异常
query-timeout: 6000
#事务发生回滚后多长时间响应用户单位是毫秒,这里这个时间和mysql的innodb_lock_wait_timeout是相加的关系,如果你在mysql配置文件配置了这个时间,那时间就会相加
transaction-query-timeout: 2000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒, 这里配置10分钟去检测一次是否存在空闲连接
time-between-eviction-runs-millis: 600000
#最大等待线程数量 这里配置50,当你的连接满了之后,其他的连接进入等待池子,最大的数量为50,超过这个数量的线程舍弃掉
max-wait-thread-count: 50
...
在默认情况下,Spring Boot 会根据可用的连接池选择一个进行自动配置:
如果 HikariCP 可用,Spring Boot 将使用它。
如果 Commons DBCP2 可用,将使用它。
我们可以通过
type
属性指定使用哪种数据源。
2. 配置 Druid 数据源
Druid 是一个 JDBC 连接池,它提供了强大的监控和扩展功能。
(1)首先,我们需要引入 Druid 依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
</dependency>
(2)接下来,创建数据源注册类:
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource dataSource(){
return new DruidDataSource();
}
}
(3)为了监控 Druid 的运行时状态,我们可以配置一个 ServletRegistrationBean
和 FilterRegistrationBean
:
@Configuration
public class DruidConfig {
// ... DataSource Bean 配置
@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;
}
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean 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
可以打开 Druid 的监控页面。
3. Spring Boot 整合 JdbcTemplate
(1)首先,在数据库中创建 my_user
表:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for my_user
-- ----------------------------
DROP TABLE IF EXISTS `my_user`;
CREATE TABLE `my_user` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`p_addr` varchar(255) DEFAULT NULL,
`gender` int(11) DEFAULT NULL,
`birth` date DEFAULT NULL,
PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of my_user
-- ----------------------------
INSERT INTO `my_user` VALUES ('1', 'zhangsan', '123', '北京', '1', '2020-06-14');
(2)然后,创建一个 Controller 来使用 JdbcTemplate
查询数据:
@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 my_user");
return maps;
}
}
启动 Spring Boot 应用后,可以通过访问 http://localhost:8080/query
来测试查询功能。
Spring Boot 提供了 JdbcTemplateAutoConfiguration
来自动配置 JdbcTemplate
。这个自动配置类会根据数据源创建 JdbcTemplate
实例,并将其加入到 Spring 容器中,以便我们可以在应用中注入和使用。
JdbcTemplateAutoConfiguration 源码解析
JdbcTemplateAutoConfiguration
类是 Spring Boot 自动配置 JdbcTemplate
的核心。它通过条件注解 @ConditionalOnMissingBean
确保只有当容器中没有 JdbcTemplate
的 Bean 时,才会创建一个新的 JdbcTemplate
实例。这样可以避免重复创建 Bean,同时也允许开发者自定义 JdbcTemplate
的配置。
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnMissingBean({JdbcOperations.class})
class JdbcTemplateConfiguration {
JdbcTemplateConfiguration() {
}
@Bean
@Primary
JdbcTemplate jdbcTemplate(DataSource dataSource, JdbcProperties properties) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
Template template = properties.getTemplate();
jdbcTemplate.setFetchSize(template.getFetchSize());
jdbcTemplate.setMaxRows(template.getMaxRows());
if (template.getQueryTimeout() != null) {
jdbcTemplate.setQueryTimeout((int)template.getQueryTimeout().getSeconds());
}
return jdbcTemplate;
}
}
4. Spring Boot 整合 MyBatis 注解版
4.1 引入 MyBatis 依赖
在 Spring Boot 项目中整合 MyBatis,首先需要添加 MyBatis 相关的依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
4.2 配置数据源
数据源的配置可以参考上一节关于 Druid 的配置,这里不再赘述。
4.3 建表
上一节已经建好了my_user表,不再赘述
4.4 创建 JavaBean
定义与数据库表对应的 Java 实体类 User
:
public class User {
private int pid;
private String username;
private String password;
private String pAddr;
private int gender;
private Date birth;
// Getters and Setters
}
4.5 创建 Mapper
使用 MyBatis 注解方式定义 Mapper 接口:
@Mapper
public interface MyUserMapper {
@Select("select * from my_user")
List<MyUser> getUsers();
@Select("select * from my_user where pid = #{id}")
MyUser getUserById(int id);
@Options(useGeneratedKeys = true, keyProperty = "pid")
@Insert("insert into my_user(username, password, p_addr, gender, birth) " +
"values(#{username}, #{password}, #{pAddr}, #{gender}, #{birth})")
void insert(MyUser user);
@Delete("delete from my_user where pid = #{id}")
void delete(int id);
}
4.6 单元测试
编写单元测试来验证 MyBatis 操作是否正确:
@SpringBootTest // 启动 Spring Boot 测试环境
public class test {
@Autowired
private UserMapper userMapper;
@Autowired
private DataSource dataSource; // 注入 DataSource
@Test
public void testDataSource() throws SQLException {
System.out.println("DataSource: " + dataSource);
}
@Test
public void testMybatis() {
User user = userMapper.selectUsersById1(1);
System.out.println("User: " + user);
}
}
解决驼峰模式和数据库下划线映射问题
为了解决 Java 代码中的驼峰命名与数据库中的下划线命名不匹配的问题,我们可以在配置类中设置 MyBatis 的映射规则:
@Configuration
public class MybatisConfig {
@Bean
public ConfigurationCustomizer getCustomizer(){
return new ConfigurationCustomizer() {
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
4.7 查询结果
4.8 Mapper 接口扫描
如果不在接口上加 @Mapper
注解,可以在启动类上通过 @MapperScan
注解指定 MyBatis 扫描 Mapper 接口的包路径:
//扫描所有dao接口
@MapperScan("com.qcby.springBootDemo1031.dao")
@SpringBootApplication
public class SpringBootDemo1031Application {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemo1031Application.class, args);
}
}
Mapper接口存放在com.qcby.springBootDemo1031.dao下
5. Spring Boot 整合 MyBatis 配置文件
5.1 创建 sqlMapConfig.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>
<!-- MyBatis 配置内容 -->
</configuration>
5.2 创建映射文件 MyUserMapper.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.springBootDemo1031.dao.UserMapper">
<select id="selectAll" resultType="com.qcby.springBootDemo1031.model.User">
select * from my_user
</select>
</mapper>
5.3 在application.yaml中配置mybatis的信息
mybatis:
config-location: classpath:mybatis/sqlMapConfig.xml #MyBatis 的全局配置文件的位置
mapper-locations: classpath:mybatis/mapper/*.xml # MyBatis 映射文件的位置
type-aliases-package: com.qcby.springBootDemo1031.model # 类型别名包
5.4 测试
需要编写mapper、service等代码,不再赘述。
@SpringBootTest // 启动 Spring Boot 测试环境
public class test {
@Autowired
private UserService userService;
/**
* 配置文件
*/
@Test
public void testXML(){
List<User> user = userService.selectAll();
System.out.println(user);
}
}
5.5 查询结果
以上就是springboot整合数据层的全部内容!