标签:Jdbc.Druid.Mybatis.Plus;
一、简介
项目工程中,集成数据库实现对数据的增晒改查管理,是最基础的能力,而对于这个功能的实现,其组件选型也非常丰富;
通过如下几个组件来实现数据库的整合;
Druid连接池:阿里开源的数据库连接池,并且提供SQL执行的监控能力;
MybatisPlus框架:基于Mybatis框架的增强工具包,可以用于简化持久层开发,显著的提高效率;
MySQL数据库:常用的关系型数据库组件,在案例中使用Druid组件来连接数据库;
二、工程搭建
1、工程结构

2、依赖管理
Druid连接池使用的是1.2.18版本;在mybatis-plus组件中依赖mybatis框架的3.5.10版本;MySQL本地环境是5.7版本,这里依赖包使用8.0.19版本;- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>${mysql.version}</version>
- </dependency>
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-3-starter</artifactId>
- <version>${druid-spring-boot.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jdbc</artifactId>
- <version>${spring-boot.version}</version>
- </dependency>
- <dependency>
- <groupId>com.baomidou</groupId>
- <artifactId>mybatis-plus-boot-starter</artifactId>
- <version>${mybatis-plus.version}</version>
- </dependency>
复制代码 三、Druid连接池
1、配置文件
有关于Druid连接池的可配置参数还有很多,可以参考源码中的描述或者官方案例,此处只提供部分常见的参数配置;- spring:
- datasource:
- type: com.alibaba.druid.pool.DruidDataSource
- druid:
- # 数据库
- url: jdbc:mysql://localhost:3306/boot-jdbc
- username: root
- password: 123456
- driver-class-name: com.mysql.cj.jdbc.Driver
- # 连接池-初始化大小
- initial-size: 10
- # 连接池-最大连接数
- max-active: 100
- # 最大等待时间
- max-wait: 60000
- # 连接池-最小空闲数
- min-idle: 10
- # 检测空闲连接
- test-while-idle: true
- # 最小空闲时间
- min-evictable-idle-time-millis: 300000
复制代码 1.2 配置类
配置两个Bean对象,分别DruidDataSource类和JdbcTemplate类;- @Configuration
- public class DruidConfig {
- @Bean("dataSource")
- @ConfigurationProperties(prefix = "spring.datasource.druid")
- public DruidDataSource dataSource() {
- return new DruidDataSource();
- }
- @Bean("jdbcTemplate")
- public JdbcTemplate jdbcTemplate() {
- return new JdbcTemplate(dataSource());
- }
- }
复制代码 四、JDBC操作
1、数据库表
在boot-jdbc数据库中添加两张测试表,用户基础信息tb_user表和用户扩展信息tb_user_extd表,脚本文件在工程的resources/sql-script目录下;- CREATE TABLE `tb_user` (
- `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
- `user_name` varchar(30) NOT NULL COMMENT '用户名称',
- `email` varchar(50) DEFAULT NULL COMMENT '邮件',
- `phone` varchar(20) NOT NULL COMMENT '手机号',
- `create_time` datetime DEFAULT NULL COMMENT '创建时间',
- `update_time` datetime DEFAULT NULL COMMENT '更新时间',
- `state` int(1) DEFAULT '1' COMMENT '状态:1启用,2删除',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户基础信息';
- CREATE TABLE `tb_user_extd` (
- `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
- `user_id` int(11) NOT NULL COMMENT '用户ID',
- `city_name` varchar(50) DEFAULT NULL COMMENT '城市名称',
- `school` varchar(200) DEFAULT NULL COMMENT '学校名称',
- PRIMARY KEY (`id`),
- KEY `user_id_index` (`user_id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户扩展信息';
复制代码 2、JdbcTemplate
JdbcTemplate是由spring-jdbc组件提供,支持DataSource的注册,是对数据库操作的深层封装,支持一系列数据操作方法;- @Service
- public class JdbcService {
- private static final Logger logger = LoggerFactory.getLogger(JdbcService.class);
- @Resource
- private JdbcTemplate jdbcTemplate ;
- /**
- * 添加数据
- */
- public int addData (User user){
- return jdbcTemplate.update(
- "INSERT INTO `tb_user` (`user_name`, `email`, `phone`, `create_time`, `update_time`) VALUES (?, ?, ?, ?, ?)",
- user.getUserName(),user.getEmail(),user.getPhone(),user.getCreateTime(),user.getUpdateTime());
- }
- /**
- * 查询全部
- */
- public List<User> queryAll (){
- return jdbcTemplate.query("SELECT * FROM tb_user WHERE state=1",new BeanPropertyRowMapper<>(User.class));
- }
- /**
- * 修改字段
- */
- public int updateName (Integer id,String name){
- return jdbcTemplate.update("UPDATE `tb_user` SET `user_name` = ? WHERE `id` = ?",name,id);
- }
- /**
- * 主键删除
- */
- public int deleteId (Integer id){
- return jdbcTemplate.update("DELETE FROM `tb_user` WHERE `id` = ?",id);
- }
- }
复制代码 五、MybatisPlus框架
1、配置管理
1.1 配置类
在配置类中,添加MapperScan注解用来扫描和注册MyBatis框架的mapper接口,以及设置PaginationInnerInterceptor分页拦截器;- @Configuration
- @MapperScan("com.boot.jdbc.mapper")
- public class MybatisConfig {
- /**
- * 分页
- */
- @Bean
- public MybatisPlusInterceptor paginationInterceptor() {
- MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
- interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
- return interceptor;
- }
- }
复制代码 1.2 配置文件
在日志中输出mybatis框架解析的SQL语句,方便在测试的时候快速发现问题;- mybatis-plus:
- configuration:
- log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
复制代码 2、Mapper
Mapper接口编写数据库操作方法,Mapper.xml文件中定义数据库执行的SQL语句,在mybatis-plus组件中提供很多单表操作的默认方法实现,也可以自定义方法;
2.1 Mapper接口- public interface UserMapper extends BaseMapper<User> {
- /**
- * 自定义分页
- */
- IPage<UserModel> queryUserPage(@Param("page") IPage<User> page);
- }
复制代码 2.2 Mapper文件- <mapper namespace="com.boot.jdbc.mapper.UserMapper">
- <select id="queryUserPage" resultType="com.boot.jdbc.entity.UserModel">
- SELECT
- tb1.id userId,
- tb1.user_name userName,
- tb1.email,
- tb1.phone,
- tb1.create_time createTime,
- tb1.update_time updateTime,
- tb1.state,
- tb2.school,
- tb2.city_name cityName
- FROM tb_user tb1
- LEFT JOIN tb_user_extd tb2 ON tb1.id = tb2.user_id
- WHERE tb1.state='1'
- ORDER BY tb1.id DESC
- </select>
- </mapper>
复制代码 3、单元测试
编写UserMapper接口测试,很多默认实现的方法参考BaseMapper接口即可,或者参考IService接口和ServiceImpl实现类,提供了更加丰富的扩展方法;- public class UserMapperTest {
- @Resource
- private UserMapper userMapper ;
- @Test
- public void testInsert (){
- List<User> userBatch = Arrays.asList(
- new User(null,"Zhang三","Zhang@qq.com","18623459687",new Date(),new Date(),1));
- userBatch.forEach(userMapper::insert);
- }
- @Test
- public void testUpdate (){
- User user = userMapper.selectById(1);
- user.setState(2);
- userMapper.updateById(user);
- }
-
- @Test
- public void testDelete (){
- userMapper.deleteById(7);
- }
-
- @Test
- public void testQuery (){
- List<User> userColumnsList = new LambdaQueryChainWrapper<>(userMapper)
- .select(User::getUserName,User::getPhone,User::getEmail)
- .like(User::getPhone,"189").orderByDesc(User::getId).last("limit 2").list();
- userColumnsList.forEach(System.out::println);
- }
- @Test
- public void testPage (){
- // 1、默认分页查询
- IPage<User> userPage = new Page<>(2,2) ;
- IPage<User> userPageList = userMapper.selectPage(userPage,new QueryWrapper<>());
- userPageList.getRecords().forEach(System.out::println);
- // 2、自定义查询分页
- IPage<UserModel> userModelPage = userMapper.queryUserPage(userPage);
- userModelPage.getRecords().forEach(System.out::println);
- }
- }
复制代码 六、参考源码
- 文档仓库:
- https://gitee.com/cicadasmile/butte-java-note
- 源码仓库:
- https://gitee.com/cicadasmile/butte-spring-parent
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |