Spring : JdbcTemplate操作数据库(详细)

前言

什么是 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);
    }

添加成功:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值