Spring---- Spring JdbcTemplate基本使用

上一篇👉:Spring----基于注解的 AOP 开发



🚴大家好!我是近视的脚踏实地,后边这系列是自己自学Spring框架的学习笔记,这篇文章学习关于Spring的JdbcTemplate基本用法的 相关知识
     唯有行动  才能解除你所有的不安

1. Spring JdbcTemplate基本使用

1.1 JdbcTemplate概述

它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,操作消息队列的JmsTemplate等等。
(这个jdbc模板其实就是Spring为我们提供的一个jdbc操作的一个工具,之前学习jdbc时代码编写并不难,但是非常繁琐,需要注册驱动,然后获得Connection,获得preStatement才能执行相应的sql语句,然后获得返回的结果集后,一把情况下在java中,就得把它封到一个实体bean中,然后for循环对结果集中数据进行实体封装,所以 它非常繁琐 ,那么繁琐的步骤我们一般就会封一个工具,那么在这里,Spring就帮我们封装这些操作,这个工具就叫做JdbcTemplate。
之前在Spring入门的时候,就是关于Spring的优点,其中有一条优点就是Spring可以简化开发,其中有一个体现就是Spring跟各种技术集成之后,各种技术它对应的客户端代码都比较繁琐,Spring就会进行封装,封装之后它不叫做某某utils,而是叫某某模板。 )

1.2 JdbcTemplate开发步骤

1️⃣:导入spring-jdbc和spring-tx坐标
(首选,我们要用某个对象,就要先导包,spring-jdbc内部就封装了jdbc的模板对象,而spring-tx,tx就是事务,因为jdbc模板操作它默认用到事务了,所以也需要导这个包 )
2️⃣:创建数据库表和实体
3️⃣:创建JdbcTemplate对象
4️⃣:执行数据库操作

1.3 JdbcTemplate快速入门

1️⃣:导入坐标(一些相关的 数据库驱动等坐标也要导)

    <!--导入spring的jdbc坐标-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>

    <!--导入spring的tx坐标-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.0.5.RELEASE</version>
    </dependency>

2️⃣:创建accout表和Accout实体
在test数据库中创建一个表
在这里插入图片描述

在这里插入图片描述
接着创建一个Accout实体类

public class Account {
    private String name;
    private double money;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

3️⃣:创建JdbcTemplate对象
4️⃣:执行数据库操作

那么接着就是来创建一个测试类,然后在里边创建JdbcTemplate模板对象

public class JdbcTemplateTest {

    @Test
    //测试JdbcTemplate开发步骤
    public void test1() throws PropertyVetoException {
        //创建数据库对象
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUser("root");
        dataSource.setPassword("root");


        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //设置数据源对象  知道数据库在哪,也就是拿到Connection对象
        jdbcTemplate.setDataSource(dataSource);
        //执行操作
        int row = jdbcTemplate.update("insert into account values(?,?)", "tom", 5000);
        System.out.println(row);

    }
}

运行结果👇:
在这里插入图片描述
在这里插入图片描述
(那么总结一下其实就三个步骤,第一个就创建模板对象,然后设置数据源,最后执行操作,只不过在设置数据源的时候,数据源即连接池对象我们需要有,这里入门就暂时写死的数据参数。 )

1.4 Spring产生JdbcTemplate对象

(刚刚写的代码中,最核心的部分就是jdbcTemplate.setDataSource(dataSource);创建出一个JDBC的模板对象,然后通过模板对象进行一个相应的一个sql操作,那么当时我们在学习Spring的时候,核心就是IOC,IOC就是可以通过Spring帮我们产生一个javaBean对象,在产生bean对象的时候当时我们学过,最简单的一种方式,或者Spring默认情况下, 是通过从无参构造去产生对象,那么我们现在这个jdbc模板对象是可以直接new的,并且是无参的,所以这个JdbcTemplate模板对象也可以让Spring帮我们完成创建,接着同样产生出来还不能使用,想要使用还得先设置一个必要的数据源(连接池)对象,就是这个模板对象得依赖这个dataSource才能发挥它的作用,所以我们就可以通过set方法把它注进去,注入的方式两种,一种是set,一种是有参构造注入,最常用的就是set方式。所以这个正好符合ioc可以帮忙产生对象这种规则。

接着jdbcTemplate模板需要一个数据源,那就是把数据源对象的引用给他,而这个数据源对象,在上边的代码中也是自己new的,但是我们也讲过,如果我想要玩对象之间的注入,注入与被注入的对象,都必须存在于ioc容器当中。那么意思就是Spring帮我们产生了模板对象,而这个模板对象内部需要数据源对象,而这个数据源对象要想注入成功,那么整个数据源对象也必须由Spring的ioc容器产生, 那么这个c3p0数据源第三方的,之前学习过,Spring是同样可以帮忙我们创建产生的,它内部的参数也直接可以通过注入方式赋值。)
我们可以将JdbcTemplate的创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将数据源DataSource注入到JdbcTemplate模版对象中,配置如下:

<!--数据源对象 -->
    <bean id="dateSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
        <property name="user" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <!--jdbc模板对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dateSource"/>
    </bean>

接着创建一个新的测试方法进行测试
从容器中获得JdbcTemplate进行添加操作

	@Test
    //测试Spring产生jdbcTemplate对象
    public void test2() throws PropertyVetoException{
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        JdbcTemplate jdbcTemplate = app.getBean(JdbcTemplate.class);
        int row = jdbcTemplate.update("insert into account values(?,?)", "zhangsan", 5000);
        System.out.println(row);

    }

测试结果👇:
在这里插入图片描述
在这里插入图片描述

那么可以利用前边学的内容,再对配置文件中的内容再抽取一下,即把那四个连接数据的参数抽取成一个jdbc文件。那么首先说现在xml文件配置和代码是完全解耦的,因为我们实际的配置,字符串已经在xml文件内部了,后期我们修改的时候无需去修改java代码,直接改这个配置文件就行,但是一个习惯就是要把数据库的配置要跟Spring的xml文件分开,这样维护时更加方便,所以要来进行个抽取,那么就是现在Resources目录下创建一个jdbc.properties文件👇:

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://localhost:3306/test
jdbc.username = root
jdbc.password = root

那么接着就可以在applicationContext.xml中引入jdbc.properties文件然后加载对应的key,在引用key的值即可,那么先来加载jdbc.properties文件👇:,首先需要一个Context的命名空间
在这里插入图片描述
在这里插入图片描述
接着修改测试类中的zhangsan为lisi在进行测试👇:
在这里插入图片描述

1.5 JdbcTemplate的常用操作

(快速入门我们用的是一个添加操作,而插入操作、修改操作、删除操作都是叫更新操作,更新操作的方法即api都是update,无非就是改改sql语句,以及对应的参数,那么下边的测试采用的是Srping的Test进行测试,因为简单。那么回忆一下步骤就是,首先使用注解@RunWith来指定用Spring来作为一个驱动的内核进行测试,也就是runner,然后还有得告诉他配置文件,让他去帮我们产生那个应用上下文对象app,然后就是测试谁,就用@Autowired注解注入就行了。但记得先去导入两个依赖的坐标才能使用。)
修改操作

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTemplateCRUDTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void testUpdate(){
        jdbcTemplate.update("update account set money= ? where name=?",10000,"tom");
    }

}

运行结果👇:

在这里插入图片描述
删除操作

@Test
    public void testDelete(){
        jdbcTemplate.update("delete from account where name= ?","tom");
    }

运行结果👇:
在这里插入图片描述

查询全部操作
在这里插入图片描述

(首选查询使用的query方法,然后可以发现他有很多的重载形式,其中比较常用的就是第二种,第一个参数就是我们要查询的sql语句,后边的RowMapper是一个接口,它返回的数据看后边可以看到是一个List集合,那么这个集合内部的参数是个泛型,T对应着RowMapper的T,是一致的,那么这个RowMapper接口翻译成中文,就是行映射,那就意味着,我们原先在原始JDBC返回的数据ResultSet结果集,我们需要手动地去封装我们的实体,而现在不用,JDBC模板query方法RowMapper这个地方它就是在帮我们做一个数据封装的这么一个功能行为的接口,当然我们在使用的时候是new一个匿名内部类,然后它本身也有一个已经为我们实现好了实现类,就是BeanPropertyRowMapper,中文翻译叫实体属性行映射。可帮我们自动封装好一个实体,我们只需要把泛型给上,就是我们要封装的那个实体类型,然后再给定一个实体类对应的字节码类型作为参数)

@Test
    public void testQueryAll(){
        List<Account> accounts = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));
        System.out.println(accounts);
    }

运行结果👇:
在这里插入图片描述
查询单个数据操作操作
在这里插入图片描述
(可以发现queryForObject也有这么一个api, 第一个参数是sql,第二个参数是rowmapper,只不过这个在写的时候,就需要给定这个参数是谁)

@Test
    public void testQueryOne() {
        Account account = jdbcTemplate.queryForObject("select * from account where name=?", new BeanPropertyRowMapper<Account>(Account.class), "tom");
        System.out.println(account);
    }

运行结果👇:
在这里插入图片描述

聚合查询
在这里插入图片描述

(那么查询一个总数,最后返回的也是一个结果,所以也可以使用queryForObject,但是这里返回的是一个数,这个数不是一个javaBean,不需要进行封装,它就是一个普通类型的数字,所以用上边的那个api,第一个也是sql,第二个叫requiredType,必须的类型,如果你是个简单的类型,在这就不用rowMapper去映射封装,只需要将这个数据给你强转就行)

@Test
    public void testQueryCount() {
        Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
        System.out.println(count);
    }

运行结果👇:
在这里插入图片描述

1.6 知识要点

1️⃣:导入spring-jdbc和spring-tx坐标
2️⃣:创建数据库表和实体
3️⃣:创建JdbcTemplate对象
      JdbcTemplate jdbcTemplate = new JdbcTemplate();
      jdbcTemplate.setDataSource(dataSource);
4️⃣:执行数据库操作
更新操作:
      jdbcTemplate.update (sql,params)
查询操作:
      jdbcTemplate.query (sql,Mapper,params)
      jdbcTemplate.queryForObject(sql,Mapper,params)


下一篇👉Spring---- 声明式事务控制(一)

本篇博客到这就完啦,非常感谢您的阅读🙏,那么下一篇将会学习关于Spring的事务控制的 相关知识,如果对您有帮助,可以帮忙点个赞或者来波关注鼓励一下喔😬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值