前言
什么是 JdbcTemplate?
Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。
本文将对《水浒传》英雄人物表进行数据操作示例,先建一张英雄表:
(no:排名,name:名字,nickname:绰号)
create table hero (
no int,
name varchar(5),
nickname varchar(3)
);
insert into hero values(1,"宋江","及时雨"),(2,"卢俊义","玉麒麟"),(3,"吴用","智多星"),(4,"公孙胜","入云龙");
select * from hero;
这是本文所有代码,如果对您有用,请给小弟点个赞,不胜感激!
(链接:本文项目 提取码:aaaa )
一、准备工作
(1)引入相关 jar 包
(2)配置Spring.xml
包括:数据库连接池、 JdbcTemplate 对象、组件扫描
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="com.chen"></context:component-scan>
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>
<!-- JdbcTemplate 对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入 dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
(3)创建 service 类,创建 dao 类,在 dao 注入 jdbcTemplate 对象
dao接口:
@Service
public interface HeroDao {
void add(Hero hero);
}
实现类:
@Repository
public class HeroDaoImpl implements HeroDao{
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}
Service:
@Service
public class HeroService {
//注入Dao
@Autowired
private HeroDao heroDao;
}
对应数据库创建实体类;
public class Hero {
private int no;
private String name;
private String nickname;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
二、JdbcTemplate 操作数据库
对数据库进行操作无非就是CRUD(增删改查),下面将依次进行讲解。
(1)增:添加一条数据
编写 service 和 dao
(1)在 dao 进行数据库添加操作
(2)调用 JdbcTemplate 对象里面 update 方法实现添加操作
@Service
public interface HeroDao {
void add(Hero hero);
}
jdbcTemplate.update()方法:
有两个参数
- 第一个参数:sql 语句
- 第二个参数:可变参数,设置 sql 语句值( sql语句中有3个问号,说明要设置3个值)
@Repository
public class HeroDaoImpl implements HeroDao{
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
//增
@Override
public void add(Hero hero) {
//创建sql语句
String sql = "insert into hero values(?,?,?)";
//调用方法实现
Object[] args = {hero.getNo(), hero.getName(), hero.getNickname()};
int update = jdbcTemplate.update(sql,args);
System.out.println(update);
}
}
测试类
@Test
public void testAdd() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
HeroService heroService = context.getBean("heroService",HeroService.class);
Hero hero = new Hero();
hero.setNo(5);
hero.setName("关胜");
hero.setNickname("大刀");
heroService.addHero(hero);
}
输出结果:
12月 29, 2020 12:03:20 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
1
1表示增加一条数据成功。
刷新数据库,新增数据完成:
(2)删:删除一条数据
根据排名删除1条数据:
HeroDaoImpl实现类:
//删
@Override
public void delete(int no) {
String sql = "delete from hero where no=?";
int update = jdbcTemplate.update(sql, no);
System.out.println(update);
}
Service:
public void deleteHero(int no) {
heroDao.delete(no);
}
测试:
@Test
public void testDelete() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
HeroService heroService = context.getBean("heroService",HeroService.class);
heroService.deleteHero(1);
}
(3)改
//改
@Override
public void update(Hero hero) {
String sql = "update hero set name=?,nickname=? where no=?";
Object[] args = {hero.getName(),hero.getNickname(),hero.getNo()};
int update = jdbcTemplate.update(sql, args);
System.out.println(update);
}
(4)查
a、查询返回某个值
1、查询表里面有多少条记录,返回是某个值
2、使用 JdbcTemplate 的 queryForObject() 方法实现查询返回某个值代码
有两个参数
- 第一个参数:sql 语句
- 第二个参数:返回类型 Class(是 int 型就写 Interger.class )
//查询有多少条数据
@Override
public int selectCount() {
String sql = "select count(*) from hero";
Integer count = jdbcTemplate.queryForObject(sql,Integer.class);
return count;
}
b、查询返回对象
场景:查询英雄详情
JdbcTemplate 实现查询返回对象
有三个参数
- 第一个参数:sql 语句
- 第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装
- 第三个参数:sql 语句值
//查询返回对象
@Override
public Hero findHeroInfo(int no) {
String sql = "select * from hero where no=?";
Hero hero = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Hero>(Hero.class), no);
return hero;
}
测试:
@Test
public void testFind() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
HeroService heroService = context.getBean("heroService",HeroService.class);
System.out.println(heroService.FindHero(2));
}
输出(记得Hero重写toString方法):
12月 29, 2020 3:23:48 下午 com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl info
信息: {dataSource-1} inited
Hero{no=2, name='卢俊义', nickname='天罡星'}
c、查询返回集合
场景:查询英雄列表分页…
调用 JdbcTemplate 方法实现查询返回集合
有三个参数
- 第一个参数:sql 语句
- 第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装
- 第三个参数:sql 语句值
//查询返回集合
@Override
public List<Hero> findAllHero() {
String sql = "select * from hero";
List<Hero> heroList = jdbcTemplate.query(sql,new BeanPropertyRowMapper<Hero>(Hero.class));
return heroList;
}
测试:
@Test
public void testFindAll() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
HeroService heroService = context.getBean("heroService",HeroService.class);
List<Hero> heroList = heroService.FindallHero();
for (Hero hero:heroList) {
System.out.println(hero);
}
}
(5)批量操作:增
批量操作:操作表里面多条记录
JdbcTemplate 实现批量添加操作
有两个参数
- 第一个参数:sql 语句
- 第二个参数:List 集合,添加多条记录数据
@Override
public void batchAddHero(List<Object[]> batchArgs) {
String sql = "insert into hero values(?,?,?)";
int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs);
System.out.println(Arrays.toString(ints));
}
测试:
@Test
public void testBatchAdd() {
//测试批量添加
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
HeroService heroService = context.getBean("heroService",HeroService.class);
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"6","林冲","豹子头"};
Object[] o2 = {"7","秦明","霹雳火"};
Object[] o3 = {"8","呼延灼","双鞭"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
heroService.BatchAdd(batchArgs);
}
添加成功: