原创出处 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 入门相关推荐

  1. Spring Boot 高效入门实战

    凭借开箱即用,远离繁琐的配置等特性,Spring Boot 已经成为 Java 开发者人人必学必会的开源项目.那么开发者该如何快速上手Spring Boot 呢? 进入Spring Boot世界 Ja ...

  2. spring boot(一)入门

    目录 spring boot(一)入门 一.简介 1.微服务的概念 2.什么是spring boot 3.快速入门 4.springboot的快捷部署 spring boot(一)入门 一.简介 1. ...

  3. Spring Boot Mybatis入门示例

    Spring Boot Mybatis 入门示例 基于Spring Boot 2.3.4,Junit5 步骤说明     整个工程的最终目录结构如下,添加文件或者新建的目录的参考: └─src├─ma ...

  4. spring boot 快速入门

    文章来源:https://www.cnblogs.com/junyang/p/8151802.html spring boot入门 -- 介绍和第一个例子 "越来越多的企业选择使用sprin ...

  5. 【720开发】 spring boot 快速入门

    spring boot 快速入门 通过构建简单的REST应用,了解spring boot的开发基本流程,验证其简单.易用特性. 环境要求 Spring Boot 2.0.0.BUILD-SNAPSHO ...

  6. 视频教程-Spring Boot实战入门视频课程-Java

    Spring Boot实战入门视频课程 国内上市大型医疗软件公司产品研发部总经理,技术培训总监.6年以上大型项目一线开发.架构.管理经验,曾主导医疗大数据+移动BI产品设计与研发.技术狂热爱好者,擅长 ...

  7. 芋道 Spring Boot 快速入门

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  8. 芋道 Spring Boot JPA 入门(一)之快速入门

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2019 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  9. Spring Boot从入门到精通(超详细)

    Spring Boot从入门到精通(超详细) _kayden_ 2020-07-20 15:19:22 9491 正在上传-重新上传取消​ 收藏 184 分类专栏: springboot 文章标签:  ...

最新文章

  1. 面试前必看:Redis 和 Memcached 的区别
  2. 用DELPHI的RTTI实现数据集的简单对象化
  3. C++ COM编程之接口背后的虚函数表
  4. 模式代码 java中aes_深入浅出:Java中的代理模式
  5. 【包邮免费送】Python 全栈知识图谱
  6. windows10 右键 manage 没反应
  7. git提交了不需要的文件夹或者文件怎么办
  8. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_10-webpack研究-安装nodejs
  9. 《SiamFC++:Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines》论文笔记
  10. 【嗅探工具】wireshark初步认识
  11. 自己动手打造一台自动驾驶车(持续更新)
  12. 机器学习模型太慢?来看看英特尔(R) 扩展加速 ⛵
  13. BackTrack5 (BT5) 无线wpa密码破解教程 gerix
  14. php截图整个网页,selenium save_screenshot 如何进行全网页截图?
  15. 3蛋白wb_有这3个工具!蛋白实验不愁!
  16. quartus ii 增量编译
  17. 5月 CSDN 创作者之夜:获奖名单公布
  18. 深度图+灰度图 可视化判断灰度图区域是否有深度
  19. 三至六世紀浙東地區的經濟發展
  20. 华为交换机常用命令大全

热门文章

  1. CAS单点登录3--服务端登录页个性化
  2. [MySQL优化案例]系列 — 典型性索引引发CPU负载飙升问题
  3. Oracle 表空间信息
  4. OpenCv实现两幅图像的拼接
  5. A damn at han’s Windows phone book 笔记(2:Flashlight)
  6. 设计模式(6)-装饰器(认识程序中的装饰器)
  7. Visual Studio 2005 Beta 2 will ship on April 25th
  8. 深度强化学习研究笔记
  9. C# IntPtr 与 string互转
  10. Kinect学习(四):提取深度数据