項目工程中,集成資料庫實現對數據的增曬改查管理,是最基礎的能力,通常涉及三個基礎組件:連接池,持久層框架,數據源。 ...
標簽: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
版本;
<!-- MySql資料庫 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- Druid組件 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>${druid-spring-boot.version}</version>
</dependency>
<!-- JDBC依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!-- MybatisPlus組件 -->
<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三","[email protected]","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
Gitee主頁: https://gitee.com/cicadasmile/butte-java-note