第八节_SSM框架前置拓内容_jdbcTemplate学习

JdbcTemplate对象的使用

1、概述

他是spring框架提供的一个对象,是对原始繁琐的jdbc API对象进行一个封装,为什么繁琐呢,jdbc对象使用的几个要素是什么

  • 注册驱动
  • 获得Connection对象
  • 获得Statement进行SQL语句的注入
  • 获得返回的结果集之后,还需要封装到对象当中,进行一个循环读取数据
  • 等等…非常的繁琐

spring可以简化开发,spring对很多工具进行一个封装,模板

image-20220326163419544

2、JdbcTemplate开发步骤

2.1、图解

image-20220326163610105

2.1、导入坐标

  • <!-- 导入SpringJDBC和Spring-tx的坐标 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.16</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>5.3.16</version>
    </dependency>
    

2.3、创建实体User

image-20220326164312119

2.4、创建JdbcTemplate对象

JdbcTemplate底层还是对jdbc进行操作,我创建了这个对象可以对数据库进行增删改查,但是,我知道数据库在哪里嘛,或者说这个对象知道数据库在哪儿吗?我应该怎嘛办?

所以使用JdbcTemplate对象之后,第一步要做的事情是,获取数据源对象

1、创建数据源对象

// 创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 注册驱动
dataSource.setDriverClass("com.mysql.jdbc.Driver");
// 设置url地址
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/week9");
// 登录账号和密码
dataSource.setUser("root");
dataSource.setPassword("010115");

2、JdbcTemplate开始获取到数据源对象

// 设置c3p0数据源对象,知道数据库在哪儿
jdbcTemplate.setDataSource(dataSource);

3、JdbcTemplate中增删改查的操作(起个头,现在还不会,等下就会了)

  • update,更新,增,删
  • query:查看

3、JdbcTemplate和数据源注入到容器

3.0、图解

image-20220326171601257

刚刚发现了,我们之前的开发步骤是创建JdbcTemplate对象,然后还需要对数据源对象进行一个创建,最后使用JdbcTemplate的set方法将数据源对象对其进行一个传参的注入,这是不是和之前的Spring容器注入对象,然后供我们使用的操作步骤一模一样?,那现在就开始数据源和JdbcTemplate对象的注入流程

人话:无论是注入,还是被注入,对象都必须存储在IOC的容器当中,spring帮我产生JdbcTemplate模板对象,然后这个对象当中还需要一个数据源的对象,也就是要把数据源对象注入到我这个模板对象中,那么数据源对象是不是也需要IOC容器帮我们产生?

3.1、创建数据源对象,并设置jdbc.properties的配置文件

  • 创建jdbc.properties

  • jdbc.driver = com.mysql.jdbc.Driver
    jdbc.url = jdbc:mysql://localhost:3306/week9
    jdbc.user = root
    jdbc.password = 010115
    
  • applicationContex.xmtl文件中引入jdbc.properties的配置文件,然后创建我们的数据源对象并进行赋值这里采用的是抽取的方式,一定程度上解耦合

  • <!-- 加载我们的jdbc配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- 配置我们的数据源对象 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 注入值 -->
        <!-- 注册驱动 -->
        <property name="driverClass" value="${jdbc.driver}"></property>
        <!-- 数据库的地址 -->
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <!-- 用户名 -->
        <property name="User" value="${jdbc.user}"></property>
        <!-- 密码 -->
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    

3.2、创建JdbcTemplate对象,将数据源对象注入到其中

<!-- 配置JdbcTemplate对象,将数据源注入到其中 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <!-- 注入数据源对象 -->
    <property name="dataSource" ref="dataSource"></property>
</bean>

4、使用Spring继承的测试类进行测试

4.1、导包,最核心的

<!-- spring集成的单元测试类 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.3.16</version>
</dependency>

4.2、创建测试集

1、@RunWith:指定Spring作为测试的内核帮我进行测试

2、@ContextConfiguration:让其帮我读取配置文件,创建上下文的对象,就是加载配置文件

3、写代码

// 指定Spring作为测试的内核帮我进行测试
@RunWith(SpringJUnit4ClassRunner.class)
// 让其帮我读取配置文件,创建上下文的对象,就是加载配置文件
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringJDBCTest {
    // 使用我们IOC容器当中的JdbcTemplate对象
    @Autowired
    private JdbcTemplate jdbcTemplate;
    // 删除一个学生玩一下
    @Test
    public void Update(){
        // 删除一个学生
        Integer row = jdbcTemplate.update("delete from student where id = ?",9);
        System.out.println("受影响的行数为:"+row+"删除了一个学生");
    }
}

实际效果

image-20220326173335365

5、查询操作(单个,全部,聚合)

5.1、全部查询—query

1、图解

image-20220326193502122

RorMapper,这个参数是一个接口,我们需要实用这个接口所对应的一个实现,完成对数据实体的一个封装

image-20220326193649348

实体属性的行映射(BeanProertyRowMapper)

2、使用BeanProertyRowMapper,完成实体属性的行映射

泛型就是我们需要映射的那个实体对象,返回的list集合中泛型也为那个实体对象

new BeanPropertyRowMapper(User.class),参数解析

泛型是需要映射的实体对象没的说,后面的方法体内需要传递这个实体对象的字节码

  • 编写代码

  • // 行映射,全部查询
    @Test
    public void SelectAll(){
        // 使用BeanPropertyRowMapper<User> 实体属性的行映射这个实现类
        // 完成对我们实体属性的一个封装
        List<User> query = jdbcTemplate.query("select * from student",
                new BeanPropertyRowMapper<User>(User.class));
        for (User user : query) {
            System.out.println(user);
        }
    }
    
  • 查看结果

  • image-20220326194255274

5.2、单个查询–queryForObject

1、图解

image-20220326194535654

传递参数的三个必要条件

  • SQL语句
  • 封装实体的实现类
  • 传递的参数(解决占位符的问题)
  • 第三个Object可以传递多个参数,解决多属性的查询

2、编写代码(返回值就是一个对象)

// 查询单个对象
@Test
public void SelectOne(){
    User user = jdbcTemplate.queryForObject("select * from student where id = ?",
            new BeanPropertyRowMapper<User>(User.class), 1);

    System.out.println(user);
}
  • 查看结果

  • image-20220326195040351

5.3、聚合类型

1、图解

image-20220326195245311

思考一下,聚合类型的查询,是不是最终返回的不是一个对象,而是一个具体的数字?

那我们依旧可以使用queryForObject,但是,这个时候返回的是数字,并不需要实体类型的封装,那么也就不需要BeanPropertyRowMapper了,而是一个Long型

2、干代码

  • // 聚合查询
    @Test
    public void UserCount(){
        Long aLong = jdbcTemplate.queryForObject("select count(*) from student",
                Long.class);
        System.out.println("该表总人数为:"+aLong);
    }
    
  • 结果

  • image-20220326195618664

6、总结

image-20220326195710972

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值