Spring JdbcTemplate
1.1:JdbcTemplate概述
它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。
spring框架为我们提供了很多的操作模板类。1.操作关系型数据的JdbcTemplate和HibernateTemplate
2.操作nosql数据库的RedisTemplate
3.操作消息队列的JmsTemplate等等
1.2:JdbcTemplate开发步骤
步骤:
1.导入spring-jdbc和spring-tx坐标
2.创建数据库表和实体
3.创建JdbcTemplate对象
4.执行数据库操作
- 1.导入spring-jdbc和spring-tx坐标
注:jdbcTemplate就是对原始jdbc的封装而已,我们想一下使用原始jdbc获取连接对象的时候,是不是需要设置
四大参数
,其中还需要设置数据库的驱动全限定类名
,也就是说想对数据库进行操作,首先先得连接上数据库,而连接数据库是需要对应的驱动jar包
,获取数据库连接之后,由于数据库的连接是非常宝贵的资源,我们不能频繁的创建和关闭,所以需要使用对应的数据库连接池来进行管理,比如dbcp
,c3p0
,druid
注:通过分析所以我们除了导入
spring-jdbc
,spring-tx
,还需导入数据库驱动包
,数据库连接池的jar包
注:其实spring-jdbc中好像包含了spring-tx的jar包,但这里先导入吧!
<!--1.jdbcTemplate需要的jar坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--2.mysql驱动和c3p0数据库连接池-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!--3.使用lombok简化实体类的开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<!--4.spring集成junit测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
- 创建数据库表和实体
1、建表语句
CREATE TABLE `account` (
`name` varchar(20) NOT NULL,
`money` decimal(10,0) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、实体(导入lombok)
@Data
public class Account {
private String name;
private Double money;
}
注:
@Data
注解提供类所有属性的 getter, setter, equals, canEqual, hashCode, toString 方法
- 3.创建JdbcTemplate对象
1、测试一下jdbcTemplate
public class jdbcTemplateTest {
@Test
public void testJdbcTemplate() throws PropertyVetoException {
//1.创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver"); //这里肯定得导入mysql驱动的jar
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&charaterEncoding=utf-8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("123456");
//2.创建jdbcTemplate
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);//①这里肯定要导入,数据源的jar,c3p0,dbcp
//3.使用jdbcTemplate执行数据库操作
int update = jdbcTemplate.update("insert into account values(?,?)", "wzj", "20000");
System.out.println(update);
}
}
2、将jdbcTemplate 交给Spring容器进行管理
- jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&charaterEncoding=utf-8&useSSL=false
jdbc.user=root
jdbc.password=123456
- applicationContext.xml
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--1.引入外部的jdbc.properties-->
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<!--
2.创建数据源,并设置四大参数
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver"); //这里肯定得导入mysql驱动的jar
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&charaterEncoding=utf-8&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("123456");
-->
<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.创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--set注入-->
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
注:书写配置的思路,先配置jdbcTemplate,你想一下它需要操作数据库肯定需要先获取连接,而获取连接是从数据源中获取的,所以jdbcTemplate依赖数据源,所以接下来就需要配置数据源,配置完数据源,不想将四大参数直接配置在applicationContext.xml中,所以使用context:property-placeholder将jdbc.properties从外面引入进来
- 总结
配置步骤: jdbcTemplate -> DataSource -> <context:property-placeholder>引入properties
注:使用<context:property-placeholder>需要指定命名空间和对应的约束
3、使用Spring集成junit的方式进行测试,需要导入spring-test和junit的jar坐标
/**
* 之前报错,是忘了导入spring-context的jar包了!,因为@ContextConfiguration需要加载spring的配置文件生成ApplicationContext
* org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.test.context.support.DelegatingSmartContextLoader]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextException
*
* 注: RowMapper是一个接口,一般使用它的实现类BeanPropertyRowMapper
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTemplateCrudTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
//1.测试更新操作:增删改
public void testUpdate(){
//update(String sql, @Nullable Object... args)
jdbcTemplate.update("insert into account values(?,?)","zs","10000");
//jdbcTemplate.update("update account set money=? where name = ?","5000","zs");
//jdbcTemplate.update("delete from account where name=?","zs");
}
@Test
//2.测试查询单个对象
public void testQueryOne(){
//queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args)
Account account = jdbcTemplate.queryForObject("select * from account where name=?", new BeanPropertyRowMapper<>(Account.class), "wzj");
System.out.println(account);
}
@Test
//3.测试查询多个对象
public void testQueryAll(){
List<Account> accounts = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));
System.out.println(accounts);
}
@Test
//4.测试聚合查询
public void testQueryCount(){
Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
System.out.println(count);
}
}
注:之前在这里测试的时候报了个错误,原因是没导入spring-context的jar坐标
来自:虽然帅,但是菜的cxy