SpringBoot2.x教程——整合使用JdbcTemplate
lipiwang 2024-11-17 13:25 9 浏览 0 评论
我在上一章节中,重点讲解了Spring中关于DataSource的一些理论知识点,接下来本章节我主要是带大家学习JdbcTemplate的使用。
一. JdbcTemplate
1. JdbcTemplate简介
JDBC虽然能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库的资源,如获取PreparedStatement,设置SQL语句参数,关闭连接等操作,使用起来非常的麻烦。
所以为了简化对JDBC的操作,Spring为数据库JDBC做了深层次的封装。它利用DI注入功能,把DataSource注入到了JdbcTemplate之中,从而得到了JdbcTemplate操作模板类。JdbcTemplate的出现,使得JDBC的操作更加简单易用。
2. JdbcTemplate的作用
JdbcTemplate可以帮助我们处理资源的建立和释放,运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果;并且也可以使我们避免一些常见的错误,比如忘记关闭数据库连接。
3. JdbcTemplate依赖包介绍
JdbcTemplate位于spring-jdbc-xxx.jar包中,其全限定命名为org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemplate还需一个spring-tx-xxx.jar依赖包,该包包含了事务和异常控制。
4. JdbcTemplate主要提供以下五类方法:
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
- update方法及batchUpdate方法:update方法用于执行INSERT、UPDATE、DELETE等DML语句;batchUpdate方法用于执行批处理相关语句;
- query方法及queryForXXX方法:用于执行DQL查询相关语句;
- call方法:用于执行存储过程、函数相关语句。
5. JdbcTemplate使用步骤
- 导入数据库相关依赖包,比如jpa或者jdbc;
- 获取所需的某个DataSource数据源连接池对象;
- 创建JdbcTemplate对象,传入到连接池中;
- 调用execute、update、queryXxx等方法。
二. Spring Boot中整合JdbcTemplate
1. 准备工作
- SpringBoot 2.x
- jdk 1.8
- maven 3.0
- ideal
- mysql
2. 创建一个web项目(略)
将该项目改造成spring-boot项目,具体过程请参考我之前关于spring-boot项目创建的章节。
项目结构:
3. pom.xml文件中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 引入Druid依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
4. 添加application.yml配置信息
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/db5?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=true
username: root
password: syc
driver-class-name: com.mysql.cj.jdbc.Driver #mysql6.0之后推荐使用这个驱动包
注意:
- mysql-connector-java版本6.0以前使用的是com.mysql.jdbc.Driver;
- 6.0以后的使用com.mysql.cj.jdbc.Driver
5. 创建数据库配置
下面是第一种数据源配置方式。
package com.yyg.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import javax.sql.DataSource;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description 第一种配置方式
*/
@ComponentScan
@Configuration
public class DbConfig {
@Autowired
private Environment env;
@Bean
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
}
也可以采用第二种配置方式:
package com.yyg.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description 第二种配置数据源的方式
*/
@Data
@ComponentScan
@Configuration
@ConfigurationProperties(prefix="spring.datasource")
public class SecondDbConfig {
private String url;
private String username;
private String password;
@Bean
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
6. 创建Users实体类
package com.yyg.boot.domain;
import lombok.Data;
import lombok.ToString;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Data
@ToString
public class Users {
private Integer id;
private String username;
private String password;
}
7. 创建Dao层代码
7.1 dao层的IUserDao接口
package com.yyg.boot.dao;
import com.yyg.boot.domain.Users;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
public interface IUserDao {
int add(Users student);
int update(Users student);
int delete(int id);
Users findUserById(int id);
List<Users> findUserList();
}
7.2 dao层的UserDaoImpl接口实现
package com.yyg.boot.dao.impl;
import com.yyg.boot.dao.IUserDao;
import com.yyg.boot.domain.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Repository
public class UserDaoImpl implements IUserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public int add(Users user) {
return jdbcTemplate.update("insert into users(username, password) values(?, ?)",
user.getUsername(),user.getPassword());
}
@Override
public int update(Users user) {
return jdbcTemplate.update("UPDATE users SET username=? ,password=? WHERE id=?",
user.getUsername(),user.getPassword(),user.getId());
}
@Override
public int delete(int id) {
return jdbcTemplate.update("DELETE from TABLE users where id=?",id);
}
@Override
public Users findUserById(int id) {
// BeanPropertyRowMapper 使获取的 List 结果列表的数据库字段和实体类自动对应
List<Users> list = jdbcTemplate.query("select * from users where id = ?", new Object[]{id}, new BeanPropertyRowMapper(Users.class));
return list.size()>0?list.get(0):null;
}
@Override
public List<Users> findUserList() {
// 使用Spring的JdbcTemplate查询数据库,获取List结果列表,数据库表字段和实体类自动对应,可以使用BeanPropertyRowMapper
List<Users> list = jdbcTemplate.query("select * from users", new Object[]{}, new BeanPropertyRowMapper(Users.class));
return list.size()>0?list:null;
}
}
8. 创建Service层代码
8.1 创建service层的IUserService接口
package com.yyg.boot.service;
import com.yyg.boot.domain.Users;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
public interface IUserService {
int add(Users user);
int update(Users user);
int delete(int id);
Users findUserById(int id);
List<Users> findUserList();
}
8.2 创建service层的UserServiceImpl接口实现
package com.yyg.boot.service.impl;
import com.yyg.boot.dao.IUserDao;
import com.yyg.boot.domain.Users;
import com.yyg.boot.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public int add(Users user) {
return userDao.add(user);
}
@Override
public int update(Users user) {
return userDao.update(user);
}
@Override
public int delete(int id) {
return userDao.delete(id);
}
@Override
public Users findUserById(int id) {
return userDao.findUserById(id);
}
@Override
public List<Users> findUserList() {
return userDao.findUserList();
}
}
9. 创建Web层的Controller
package com.yyg.boot.web;
import com.yyg.boot.domain.Users;
import com.yyg.boot.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService iUserService;
@PostMapping("")
public int addUser(@RequestBody Users user){
return iUserService.add(user);
}
@PutMapping("/{id}")
public String updateUser(@PathVariable Integer id, @RequestBody Users user){
Users oldUser = new Users();
oldUser.setId(id);
oldUser.setUsername(user.getUsername());
oldUser.setPassword(user.getPassword());
int t = iUserService.update(oldUser);
if (t == 1){
return user.toString();
}else {
return "更新学生信息错误";
}
}
@GetMapping("/{id}")
public Users findUserById(@PathVariable Integer id){
return iUserService.findUserById(id);
}
@GetMapping("/list")
public List<Users> findUserList(){
return iUserService.findUserList();
}
@DeleteMapping("/{id}")
public int deleteUserById(@PathVariable Integer id){
return iUserService.delete(id);
}
}
10. 创建启动类
package com.yyg.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@SpringBootApplication
public class JdbcApplication {
public static void main(String[] args){
SpringApplication.run(JdbcApplication.class,args);
}
}
11. 完整项目结构
12. 接口测试
在浏览器或者postman中测试我们刚才创建的接口。
其他接口不一一测试,都可以正常使用!
相关推荐
- 微软Office Open XML中的数字签名漏洞
-
MicrosoftOffice是最广泛使用的办公文档应用程序之一。对于重要文件,如合同和发票,可以对其内容进行签名,以确保其真实性和完整性。自2019年以来,安全研究人员发现了针对PDF和ODF等其...
- Javaweb知识 day12 XML(javaweb中xml作用)
-
一、XML:1.1概念:ExtensibleMarkupLanguage可扩展标记语言*可扩展:标签都是自定义的。<user><student>1.2功能:...
- 易筋洗髓功——内外同修方可致远(易筋洗髓功口诀)
-
达摩祖师所传易筋、洗髓两经,一分为二,二实为一,无非以方便法门接引众生,而归于慈悲清净之心地。修炼《易筋经》是为强身健体,修炼《洗髓经》是为修心养性,此二者相辅相成,内外兼修,缺一不可。这是一套传统中...
- 道家洗髓功修炼要义,洗髓功如何做到丹田聚气?
-
不管是道家洗髓功,还是洗髓经,其修炼的关键点就在于得气、行气、聚气...那么,作为洗髓功修炼者,具体该怎么做呢?在实际修炼中,就洗髓功的修炼方法来讲,我们可以简单的归纳为修炼三部曲,其具体表现如下:一...
- 「清风聊练功」师门传我易筋经:聊聊我的学习经历和正身图感受
-
一个人的眼界认识,是随着是自身的知识积累和水平不断成长的。开篇为什么要说这么一句呢?是从我的学习经历上感受明显的这句话:一处不到一处迷。我们学传统武术,内功功法,也是从小白到明白一步步走的,走的越远,...
- 内功外练功介绍(练内功 外功)
-
这里介绍我练习的两套动功心得体会。是老道长的八部金刚功、长寿功和增演易筋洗髓经。八部金刚功外练奇经八脉,练出健康强壮的好身体还是可以的,长寿功也是内练功法。这部功法很好的预防效果。这个大家都认同的。说...
- 《增演易筋洗髓内功图说》17卷(1930年(清)周述官撰 1
-
少林空悟老师珍藏
- 国术典籍:《增演易筋洗髓内功图说》【2024年8月编校】
-
《增演易筋洗髓内功图说》系养生气功著作,全书共十八卷。清周述官编撰于光绪二十一年(1895年)。清光绪十九年(1893年),僧人静一空悟将少林功法传授于周述官,并将《增益易筋洗髓内功图说》十二卷(按,...
- 小说:自媒体小白的修道之路-洗髓(自媒体小白运营技巧)
-
谁应了谁的劫,谁又变成了谁的执念。当沧海遗忘了桑田,这世间又多了一个不回家的人!异域空间中,知生缓缓起身,目光扫了一下小帝后,又转身看向画板上的那朵白色蒲公英,自言道:“白瑛,这一世我们莫要再辜负了!...
- 这才是少林洗髓经真相:它是静功和导引术与八段锦暗合
-
不少朋友误解易筋经和洗髓经,将其简单归为强力呼吸的吐纳功以及为了提升房中的关窍功。事实上易筋经和洗髓经是两部功法:易筋经主要为炼体,包含以膜论为核心的十二月怕打筋膜法,以及辅助的呼吸、导引功法;洗髓经...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)