springboot jdbc template_Springboot教程
大家好,又见面了,我是你们的朋友全栈君。
文章目录
JdbcTemplate 是 Spring 自带的 JDBC 模板组件,底层实现了对 JDBC 的封装,我们可以借助 JdbcTemplate 来执行所有数据库操作,例如插入、更新、删除和从数据库中检索数据,并且有效避免直接使用 jdbc 带来的繁琐编码。
JdbcTemplate主要提供以下五种类型的方法:
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句。
- update、batchUpdate方法:用于执行新增、修改、删除等语句。
- query方法及queryForXXX方法:用于执行查询相关的语句。
- call方法:用于执行数据库存储过程和函数相关的语句。
当然,在大部分情况下,我们都会直接使用更加强大的持久化框架来访问数据库,比如MyBatis、Hibernate 或者 Spring Data JPA,我们这里讲解 JdbcTemplate 的整合,只是想让家更加了解底层原理。
一、准备数据表
CREATE TABLE `spring_boot`.`article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NULL COMMENT '文章标题',
`author` varchar(255) NULL COMMENT '作者',
PRIMARY KEY (`id`)
) COMMENT = '文章表';
二、引入依赖
<dependencies>
<!-- MySQL 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Spring JDBC 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Spring Web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
三、配置数据源
spring.datasource.url = jdbc:mysql://139.196.20.xxx:3306/spring_boot?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
因为 Spring Boot 2.5.4 默认使用了MySQL 8.0.26 的驱动,所以这里采用com.mysql.cj.jdbc.Driver,而不是老的com.mysql.jdbc.Driver。
四、编写领域对象
@Data
@NoArgsConstructor
public class Blog {
private Integer id;
private String title;
private String author;
}
这里我们使用Lombok,需要在IDEA里安装Lombok插件,不然会报错,get、set方法找不到。
五、新增
JdbcTemplate 中,除了查询有几个 API 之外,增删改统一都使用 update 来操作,自己来传入 SQL 即可。
update 方法的返回值就是 SQL 执行受影响的行数。
@RestController
public class BlogController {
@Autowired
public BlogService blogService;
/** * 新增一篇文章 * * @param blog 文章实体类 * @return */
@PostMapping(value = "/create")
public Object create(@RequestBody Blog blog) {
if (StringUtils.isBlank(blog.getTitle())) {
return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章标题");
}
if (StringUtils.isBlank(blog.getAuthor())) {
return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章作者");
}
return blogService.create(blog);
}
}
@Service
public class BlogServiceImpl implements BlogService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public Object create(Blog blog) {
int count = jdbcTemplate.update("insert into article(title, author) values(?, ?)", blog.getTitle(), blog.getAuthor());
if (count > 0) {
return ResponseUtil.ok("插入成功");
} else {
return ResponseUtil.fail(ResultEnums.SERIOUS.getCode(), "插入失败");
}
}
}
六、修改
@RestController
public class BlogController {
@Autowired
public BlogService blogService;
/** * 通过id修改文章 * * @param blog * @return */
@PostMapping(value = "/updateById")
public Object updateById(@RequestBody Blog blog) {
if (StringUtils.isBlank(blog.getTitle())) {
return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章标题");
}
if (StringUtils.isBlank(blog.getAuthor())) {
return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章作者");
}
return blogService.updateById(blog);
}
}
@Service
public class BlogServiceImpl implements BlogService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public Object updateById(Blog blog) {
int count = jdbcTemplate.update("update article set title=?,author=? where id=?", blog.getTitle(), blog.getAuthor(), blog.getId());
if (count > 0) {
return ResponseUtil.ok("修改成功");
} else {
return ResponseUtil.fail(ResultEnums.SERIOUS.getCode(), "修改失败");
}
}
}
七、查询
@RestController
public class BlogController {
@Autowired
public BlogService blogService;
/** * 查询所有文章 * * @return */
@GetMapping(value = "/getAll")
public List<Blog> getAll() {
return blogService.getAll();
}
/** * 通过标题查询文章 * * @param title * @return */
@GetMapping(value = "/getByTitle")
public Object getByTitle(String title) {
if (StringUtils.isBlank(title)) {
return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章标题");
}
return blogService.getByTitle(title);
}
}
@Service
public class BlogServiceImpl implements BlogService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public List<Blog> getAll() {
return jdbcTemplate.query("select * from article", new BeanPropertyRowMapper<>(Blog.class));
}
@Override
public List<Blog> getByTitle(String title) {
// 如果不会Lambda表达式的小伙伴可以看下面的代码
return jdbcTemplate.query("select * from article where title = ?", (resultSet, i) -> {
Blog blog = new Blog();
blog.setId(resultSet.getInt("id"));
blog.setTitle(resultSet.getString("title"));
blog.setAuthor(resultSet.getString("author"));
return blog;
}, title);
}
@Override
public List<Blog> getByTitle(String title) {
// 照顾到有小伙伴不会Lambda表达式,我这里把另一种方案也写出来
return jdbcTemplate.query("select * from article where title = ?", new RowMapper<Blog>() {
@Override
public Blog mapRow(ResultSet resultSet, int i) throws SQLException {
Blog blog = new Blog();
blog.setId(resultSet.getInt("id"));
blog.setTitle(resultSet.getString("title"));
blog.setAuthor(resultSet.getString("author"));
return blog;
}
}, title);
}
}
八、删除
删除也是使用 update API,传入你的 SQL 即可
@RestController
public class BlogController {
@Autowired
public BlogService blogService;
/** * 通过ID删除文章 * * @param id * @return */
@PostMapping(value = "/deleteById")
public Object deleteById(Integer id) {
if (null == id || 0 == id.longValue()) {
return ResponseUtil.fail(ResultEnums.BAD_ARGUMENT_VALUE.getCode(), "请输入文章id");
}
return blogService.deleteById(id);
}
}
@Service
public class BlogServiceImpl implements BlogService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public Object deleteById(Integer id) {
int count = jdbcTemplate.update("delete from article where id=?", id);
if (count > 0) {
return ResponseUtil.ok("删除成功");
} else {
return ResponseUtil.fail(ResultEnums.SERIOUS.getCode(), "删除失败");
}
}
}
更多其他数据访问操作的使用请参考:JdbcTemplate API
彩蛋,很多小伙伴会发现一个问题,项目启动一段时间放那里不动,然后在访问接口时,就会报错,这和我们使用的数据源有关(Hikari),在后面《数据源详解》章节我会教大家如何解决。
九、源码
本文的相关例子可以查看下面仓库中的 chapter4 目录:
- Gitee:https://gitee.com/hezhiyuan007/spring-boot-study
- Github:https://github.com/java-fish-0907/spring-boot-study
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
相关文章
- SpringBoot 自动配置原理(超级无敌详细)-1[通俗易懂]
- springboot到底是什么_Springboot启动流程
- SpringBoot的启动流程_springboot启动卡住了
- springboot连接oracle
- 【SpringBoot 实战】数据报表统计并定时推送用户的手把手教程
- 【SpringBoot】20、SpringBoot中打war包需要注意「建议收藏」
- SpringBoot源码解析之注解
- 最简单的SpringBoot整合MyBatis教程
- SpringBoot异常处理和退出
- 一线开发大牛带你初步了解如何使用SpringBoot搭建框架
- 向我所爱,不断进取。抱歉,这款基于springboot的开源的低代码框架让您久等了
- springboot项目引入第三方jar后打包运行时找不到类
- Springboot的Mybatis拦截器实现[通俗易懂]
- springboot多环境配置文件_Springboot教程
- 如何在SpringBoot项目中,实现记录用户登录的IP地址及归属地信息?
- SpringBoot+SpringData-Redis 操作 Redis(CRUD) 模板代码
- springboot 项目通过过滤器(Filter)实现白名单过滤以及拦截客户端请求服务接口进行统一日志记录的实现方式
- 最新MySql8.27主从复制及SpringBoot项目中的读写分离实战教程
- JDBC简易教程:连接SQL Server(jdbc连接sqlserver)