Spring Boot JdbcTemplate 入门
原创出处 http://www.iocoder.cn/Spring-Boot/JdbcTemplate/ 「芋道源码」
1. 概述
虽然说,我们现在项目的 DAL 数据访问层,大多使用 MyBatis 或者 JPA ,但是可能极少部分情况下也会使用 JDBC 。而使用的 JDBC 一般来说,一共有 3 种方式:
- 原生 JDBC ,或者自己项目封装的 JDBC 工具类。
- Apache Common ,提供了 DbUtils 工具类。
- Spring JDBC ,提供了 JdbcTemplate 工具类。
咳咳咳,项目实战中,我选择 MyBatis ,哈哈哈。
下面,我们来快速入门 JdbcTemplate 的使用。
2. 快速入门
示例代码对应仓库:lab-14-jdbctemplate 。
本小节,我们会使用 spring-boot-starter-jdbc
自动化配置 JDBC 主要配置。同时,编写相应的 SQL 操作。
2.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><modelVersion>4.0.0</modelVersion><artifactId>lab-14-jdbctemplate</artifactId><dependencies><!-- 实现对数据库连接池的自动化配置 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency> <!-- 本示例,我们使用 MySQL --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.48</version></dependency><!-- 方便等会写单元测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>
2.2 Application具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
创建 Application.java
类,配置 @SpringBootApplication
注解即可。代码如下:
// Application.java@SpringBootApplication
public class Application {
}
2.3 配置文件
在 application.yml
中,添加 DataSource 配置,如下:
spring:# datasource 数据源配置内容datasource:url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.jdbc.Driverusername: testb5f4password: F4df4db0ed86@11
2.4 UserDO
在 cn.iocoder.springboot.lab14.jdbctemplate.dataobject
包路径下,创建 UserDO.java 类,用户 DO 。代码如下:
// UserDO.javapublic class UserDO {/*** 用户编号*/private Integer id;/*** 账号*/private String username;/*** 密码(明文)** ps:生产环境下,千万不要明文噢*/private String password;/*** 创建时间*/private Date createTime;// ... 省略 setting/getting 方法}
对应的创建表的 SQL 如下:
CREATE TABLE `users` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',`username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',`password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`),UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
2.5 UserDao
在 cn.iocoder.springboot.lab14.mybatis.dao
包路径下,创建 UserDao 接口。代码如下:
// UserDao.java@Repository
public class UserDao {/*** 声明 INSERT 操作的 PreparedStatementCreatorFactory 对象*/private static final PreparedStatementCreatorFactory INSERT_PREPARED_STATEMENT_CREATOR_FACTORY= new PreparedStatementCreatorFactory("INSERT INTO users(username, password, create_time) VALUES(?, ?, ?)");static {// 设置返回主键INSERT_PREPARED_STATEMENT_CREATOR_FACTORY.setReturnGeneratedKeys(true);INSERT_PREPARED_STATEMENT_CREATOR_FACTORY.setGeneratedKeysColumnNames("id");// 设置每个占位符的类型INSERT_PREPARED_STATEMENT_CREATOR_FACTORY.addParameter(new SqlParameter(Types.VARCHAR));INSERT_PREPARED_STATEMENT_CREATOR_FACTORY.addParameter(new SqlParameter(Types.VARCHAR));INSERT_PREPARED_STATEMENT_CREATOR_FACTORY.addParameter(new SqlParameter(Types.TIMESTAMP));}@Autowiredprivate JdbcTemplate template;/*** 使用 PreparedStatementCreator 实现插入数据** @param entity 实体* @return 影响行数*/public int insert(UserDO entity) {// 创建 KeyHolder 对象,设置返回的主键 IDKeyHolder keyHolder = new GeneratedKeyHolder();// 执行插入操作int updateCounts = template.update(INSERT_PREPARED_STATEMENT_CREATOR_FACTORY.newPreparedStatementCreator(Arrays.asList(entity.getUsername(), entity.getPassword(), entity.getCreateTime())), keyHolder);// 设置 ID 主键到 entity 实体中if (keyHolder.getKey() != null) {entity.setId(keyHolder.getKey().intValue());}// 返回影响行数return updateCounts;}/*** 使用 SimpleJdbcInsert 实现插入数据** @param entity 实体* @return 影响行数*/public int insert0(UserDO entity) {// 创建 SimpleJdbcInsert 对象SimpleJdbcInsert insertOp = new SimpleJdbcInsert(template);insertOp.setTableName("users");insertOp.setColumnNames(Arrays.asList("username", "password", "create_time"));insertOp.setGeneratedKeyName("id");// 拼接参数Map<String, Object> params = new HashMap<>();params.put("username", entity.getUsername());params.put("password", entity.getPassword());params.put("create_time", entity.getCreateTime());// 执行插入操作Number id = insertOp.executeAndReturnKey(params);// 设置 ID 主键到 entity 实体中entity.setId(id.intValue());// 返回影响行数return 1;}public int updateById(UserDO entity) {// JdbcTemplate 生成更新的动态 SQL 不是很方便,需要自己二次封装。类似 SimpleJdbcInsert 对象return template.update("UPDATE users SET password = ? WHERE id = ?", entity.getPassword(),entity.getId());}public int deleteById(Integer id) {return template.update("DELETE FROM users WHERE id = ?", id);}public UserDO selectById(Integer id) {return template.queryForObject("SELECT id, username, password, create_time FROM users WHERE id = ?",new BeanPropertyRowMapper<>(UserDO.class), // 结果转换成对应的对象id);}public UserDO selectByUsername(String username) {return template.queryForObject("SELECT id, username, password, create_time FROM users WHERE username = ? LIMIT 1",new BeanPropertyRowMapper<>(UserDO.class), // 结果转换成对应的对象username);}public List<UserDO> selectByIds(List<Integer> ids) {// 创建 NamedParameterJdbcTemplate 对象NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(template);// 拼接参数Map<String, Object> params = new HashMap<>();params.put("ids", ids);// 执行查询return namedParameterJdbcTemplate.query("SELECT id, username, password, create_time FROM users WHERE id IN (:ids)", // 使用 :ids 作为占位服务params,new BeanPropertyRowMapper<>(UserDO.class) // 结果转换成对应的对象);}}
- 具体的每个操作,胖友看下方法名和注释。
- 虽然说,我们可以在 Service 中使用 JdbcTemplate 进行数据库的操作,但是艿艿还是建议将每个表的操作,分装到对应的 Dao 中。一方面,代码可以更加简洁,另一方面,未来如果替换为 MyBatis 或 JPA 等 ORM 框架时,业务层无需做调整。
2.6 简单测试
创建 UserDaoTest 测试类,我们来测试一下简单的 UserDaoTest 的每个操作。代码如下:
// UserDaoTest.java@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class UserDaoTest {@Autowiredprivate UserDao userDao;@Testpublic void testInsert() {UserDO user = new UserDO().setUsername(UUID.randomUUID().toString()).setPassword("nicai").setCreateTime(new Date());userDao.insert(user);System.out.println(user);}@Testpublic void testInsert0() {UserDO user = new UserDO().setUsername(UUID.randomUUID().toString()).setPassword("nicai").setCreateTime(new Date());userDao.insert0(user);System.out.println(user);}@Testpublic void testUpdateById() {UserDO updateUser = new UserDO().setId(1).setPassword("wobucai");userDao.updateById(updateUser);}@Testpublic void testDeleteById() {userDao.deleteById(2);}@Testpublic void testSelectById() {UserDO user = userDao.selectById(1);System.out.println(user);}@Testpublic void testSelectByUsername() {UserDO user = userDao.selectByUsername("yunai");System.out.println(user);}@Testpublic void testSelectByIds() {List<UserDO> users = userDao.selectByIds(Arrays.asList(1, 5));System.out.println("users:" + users.size());}}
具体的,胖友可以自己跑跑,妥妥的。
666. 彩蛋
虽然说,我们在日常开发中,基本很少在直接接触到 JDBC ,但是 JDBC 在问 们的开发中,无处不在:
- HikariCP、Druid 在其上,提供了数据库连接池的功能。
- Sharding Sphere 在其上,提供了分库分表、读写分离等功能。
- Seata 在其上,提供了分布式事务的功能。
- Hibernate、MyBatis 在其上,提供了 ORM 的功能。
Elasticsearch SQL JDBC 在其上,提供了访问 ES 的 Driver 实现。
Spring Boot JdbcTemplate 入门相关推荐
- Spring Boot 高效入门实战
凭借开箱即用,远离繁琐的配置等特性,Spring Boot 已经成为 Java 开发者人人必学必会的开源项目.那么开发者该如何快速上手Spring Boot 呢? 进入Spring Boot世界 Ja ...
- spring boot(一)入门
目录 spring boot(一)入门 一.简介 1.微服务的概念 2.什么是spring boot 3.快速入门 4.springboot的快捷部署 spring boot(一)入门 一.简介 1. ...
- Spring Boot Mybatis入门示例
Spring Boot Mybatis 入门示例 基于Spring Boot 2.3.4,Junit5 步骤说明 整个工程的最终目录结构如下,添加文件或者新建的目录的参考: └─src├─ma ...
- spring boot 快速入门
文章来源:https://www.cnblogs.com/junyang/p/8151802.html spring boot入门 -- 介绍和第一个例子 "越来越多的企业选择使用sprin ...
- 【720开发】 spring boot 快速入门
spring boot 快速入门 通过构建简单的REST应用,了解spring boot的开发基本流程,验证其简单.易用特性. 环境要求 Spring Boot 2.0.0.BUILD-SNAPSHO ...
- 视频教程-Spring Boot实战入门视频课程-Java
Spring Boot实战入门视频课程 国内上市大型医疗软件公司产品研发部总经理,技术培训总监.6年以上大型项目一线开发.架构.管理经验,曾主导医疗大数据+移动BI产品设计与研发.技术狂热爱好者,擅长 ...
- 芋道 Spring Boot 快速入门
点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 RP ...
- 芋道 Spring Boot JPA 入门(一)之快速入门
点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 RP ...
- Spring Boot从入门到精通(超详细)
Spring Boot从入门到精通(超详细) _kayden_ 2020-07-20 15:19:22 9491 正在上传-重新上传取消 收藏 184 分类专栏: springboot 文章标签: ...
最新文章
- 面试前必看:Redis 和 Memcached 的区别
- 用DELPHI的RTTI实现数据集的简单对象化
- C++ COM编程之接口背后的虚函数表
- 模式代码 java中aes_深入浅出:Java中的代理模式
- 【包邮免费送】Python 全栈知识图谱
- windows10 右键 manage 没反应
- git提交了不需要的文件夹或者文件怎么办
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_10-webpack研究-安装nodejs
- 《SiamFC++:Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines》论文笔记
- 【嗅探工具】wireshark初步认识
- 自己动手打造一台自动驾驶车(持续更新)
- 机器学习模型太慢?来看看英特尔(R) 扩展加速 ⛵
- BackTrack5 (BT5) 无线wpa密码破解教程 gerix
- php截图整个网页,selenium save_screenshot 如何进行全网页截图?
- 3蛋白wb_有这3个工具!蛋白实验不愁!
- quartus ii 增量编译
- 5月 CSDN 创作者之夜:获奖名单公布
- 深度图+灰度图 可视化判断灰度图区域是否有深度
- 三至六世紀浙東地區的經濟發展
- 华为交换机常用命令大全