往期文章
Spring01 —— Spring概念及快速入门
Spring02 —— Spring配置文件详解和依赖注入
Spring03 —— SpringAPI和在Spring中配置数据源
Spring04 —— Spring的注解开发
Spring05 —— Spring集成Junit
Spring06 —— Spring集成web环境
SpringMVC01 —— SpringMVC简介&快速入门
SpringMVC02 —— SpringMVC的各组件详解
SpringMVC03 —— Spring的请求和响应
本文目录
前言:
我们已经知道了 Spring提供的web框架是SpringMVC,业务层有Spring,那么对于数据库的操作Spring也提供了 Spring JDBC模块帮助我们进行简洁开发。
总所周知jdbc是一套操作所有关系型数据库的规则,即接口,各个数据库厂商去实现这个结构然后提供相应驱动jar包。但在实际的企业级应用开发中,我们很少直接使用原生的 JDBC API 进行开发,这是因为使用 JDBC API 对数据库进行操作十分繁琐,需要我们对每一步都做到“步步把控,处处关心”,例如我们需要手动控制数据库连接的开启,异常处理、事务处理、最后还要手动关闭连接释放资源等等。所以Spring就帮我们封装了原始的jdbc操作,提供一个Spring JDBC模块使得开发者使用起来更加简单。
Spring JdbcTemplate
1、Jdbctemplate简介
JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,操作消息队列的JmsTemplate等等
开发者只需要关注一些必要的参数,无需过度关注驱动的加载,数据库连接的开启与关闭、SQL 语句的创建与执行、异常处理以及事务处理等繁杂乏味的工作。
JdbcTemplate 是 Spring JDBC 核心包(core)中的核心类,它可以通过配置文件、注解、Java 配置类等形式获取数据库的相关信息,实现了对 JDBC 开发过程中的驱动加载、连接的开启和关闭、SQL 语句的创建与执行、异常处理、事务处理、数据类型转换等操作的封装。我们只要对其传入SQL 语句和必要的参数即可轻松进行 JDBC 编程。
JdbcTemplate 的全限定命名为 org.springframework.jdbc.core.JdbcTemplate
2、Jdbctemplate的使用步骤
①导入spring-jdbc和spring-tx坐标
②创建数据库表和实体
③创建JdbcTemplate对象
④执行数据库操作
3、jdbctemplate快速入门
【1】导入依赖坐标
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhou</groupId>
<artifactId>spring_jdbcTemplete</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--此处需要注意的是,spring5 及以上版本要求 junit 的版本必须是 4.12 及以上-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- Spring集成web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- spring jdbc -->
<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>
<!--单元测试 junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--数据库连接驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<!-- C3P0连接池 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- jackson相关坐标 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!-- 文件上传相关 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.3</version>
</dependency>
</dependencies>
</project>
【2】准备数据库环境
CREATE TABLE IF NOT EXISTS products(
id INT PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20),
price DOUBLE
);
SELECT * FROM products;
INSERT INTO products VALUES(NULL,'苹果',20);
INSERT INTO products VALUES(NULL,'香蕉',8)
INSERT INTO products VALUES(NULL,'栗子',14);
INSERT INTO products VALUES(NULL,'猕猴桃',10);
INSERT INTO products VALUES(NULL,'草莓',22);
【3】编码
public class JdbcTemplateTest {
@Test
public void test1() throws PropertyVetoException {
// 创建数据源
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/study");
dataSource.setUser("root");
dataSource.setPassword("123456");
// 创建jdbc模板对象 需要设置数据源信息
JdbcTemplate template = new JdbcTemplate(dataSource);
// 定义sql
String sql = "INSERT INTO products VALUES(NULL,'菠萝',12)";
// 执行sql
int i = template.update(sql);
System.out.println(i);
}
}
【4】测试
4、Spring生成模板对象jdbctemplate
我们可以将JdbcTemplate的创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将数据源DataSource注入到JdbcTemplate模版对象中,然后通过Spring容器获得JdbcTemplate对象来执行操作。
在spring核心配置文件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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置datasource -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/study"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 配置jdbctemplate 将jdbctemplate的创建权交由spring -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
测试:
@Test
public void test2(){
// 通过spring容器获取jdbctemplate
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate template = app.getBean("jdbcTemplate", JdbcTemplate.class);
// 定义sql
String sql = "select * from products";
// 执行sql
List<Product> productList = template.query(sql, new BeanPropertyRowMapper<Product>(Product.class));
for (Product product : productList) {
System.out.println(product);
}
}
}
5、抽取jdbc.properties
将数据库的连接信息抽取到外面的配置文件中达到解耦和的目的,和Spring配置文件分离开,有利于后期维护。
在spring核心配置文件applicationContext.xml文件中引入
引入外部的配置文件需要context命名空间,所以要先引入context命名空间
6、jdbctemplate常用操作
jdbcTemplate的常用操作就是增删改查
其中增删改数据更新操作 使用update()方法
查询使用query方法,但是这里面有很多方法,query、queryForObject、queryForList等,这里不做详细描述。我们这里使用常用的两个方法,query queryForObject进行案例测试。
6.1、更新操作
使用Spring集成junit进行测试。回顾Spring集成junit的步骤
1、导入相关依赖
2、使用@RunWith改变运行期
3、使用@ContextConfiguration指定配置文件或配置类
4、使用@Autowired注入需要测试的对象
5、创建测试方法进行测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTemplateTest2 {
@Resource(name = "jdbcTemplate")
private JdbcTemplate template;
// 更新操作
@Test
public void testUpdate(){
String sql = "update products set price=? where id=?";
int row = template.update(sql, 90, 1); // 修改id为1的价格为90
System.out.println(row);
}
}
6.2、新增操作
// 新增
@Test
public void testInsert(){
String sql = "insert into products values(null,?,?)";
int row = template.update(sql, "哈密瓜", 30); // 新增一个水果种类
System.out.println(row);
}
6.3、删除操作
// 删除
@Test
public void testDelete(){
String sql = "delete from products where id = ?";
int row = template.update(sql, 2); // 将id为2的删除
System.out.println(row);
}
6.4、查询
// 查询
@Test
public void testSelect(){
String sql = "select * from products";
List<Product> products = template.query(sql, new BeanPropertyRowMapper<Product>(Product.class));
System.out.println(products);
}
// 查询
@Test
public void testSelect(){
String sql = "select count(id) from products";
Integer count = template.queryForObject(sql, Integer.class);
System.out.println(count);
}
7、知识小结
jdbctemplate的使用步骤
①导入spring-jdbc和spring-tx坐标
②创建数据库表和实体
③创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
④编写sql
⑤执行sql