JdbcTemplate对象的使用
1、概述
他是spring框架提供的一个对象,是对原始繁琐的jdbc API对象进行一个封装,为什么繁琐呢,jdbc对象使用的几个要素是什么
- 注册驱动
- 获得Connection对象
- 获得Statement进行SQL语句的注入
- 获得返回的结果集之后,还需要封装到对象当中,进行一个循环读取数据
- 等等…非常的繁琐
spring可以简化开发,spring对很多工具进行一个封装,模板
2、JdbcTemplate开发步骤
2.1、图解
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
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、图解
刚刚发现了,我们之前的开发步骤是创建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+"删除了一个学生");
}
}
实际效果
5、查询操作(单个,全部,聚合)
5.1、全部查询—query
1、图解
RorMapper,这个参数是一个接口,我们需要实用这个接口所对应的一个实现,完成对数据实体的一个封装
实体属性的行映射(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); } }
-
查看结果
-
5.2、单个查询–queryForObject
1、图解
传递参数的三个必要条件
- 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);
}
-
查看结果
-
5.3、聚合类型
1、图解
思考一下,聚合类型的查询,是不是最终返回的不是一个对象,而是一个具体的数字?
那我们依旧可以使用queryForObject,但是,这个时候返回的是数字,并不需要实体类型的封装,那么也就不需要BeanPropertyRowMapper了,而是一个Long型
2、干代码
-
// 聚合查询 @Test public void UserCount(){ Long aLong = jdbcTemplate.queryForObject("select count(*) from student", Long.class); System.out.println("该表总人数为:"+aLong); }
-
结果
-