文章目录
Spring作为适应性较好的框架,对JDBC也提供了良好的支持。Spring本身对JDBC进行了封装,使得在使用JDBC时更加简便。
Maven引入
- spring核心jar包
- spring的aop
- spring的jdbc支持(jdbc,tx)
- mysql的驱动包
<!-- spring JDBC Template-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
创建配置文件
<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/selection_course"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
在配置文件中需要引入上下文约束、aop约束、tx约束。注册DriverManagerDataSource
类作为连接池(spring默认的连接池,如果使用其他连接池可以修改注册的bean类)并在属性中设置驱动类,数据库连接地址,用户名和密码(其他连接设置可参照JDBC)。注册springJDBC的核心类JdbcTemplate
,在使用中就可以实例化bean创建数据库连接。
Spring JDBC Template基础应用
execute
execute()
方法主要执行命令类语句,例如创建或删除表、修改表结构等语句,没有参数和返回值。
update、batchupdate
update
、batchupdate
方法用于处理数据的增、删、改操作。该方法有两种重载的方法
update(String sql, Object[] args)
,返回值为int类型用于记录影响的行数,其中第一个参数是需要执行的SQL语句,如果需要提供参数可以使用?
来占位,第二个参数是需要向SQL语句中传递的参数,以数组的形式传递。update(String sql, Object... args)
,返回值为int类型用于记录影响的行数,其中第一个参数是需要执行的SQL语句,如果需要提供参数可以使用?
来占位,第二个参数是可变参数用于向SQL传递参数。batchupdate(String[] sql)
,返回值为int类型数组用于记录影响的行数,参数为需要执行的SQL语句,以数组的形式进行传递。batchupdate(String sql, List<Object[]> list)
,返回值为int类型数组用于记录影响的行数,第一个参数为需要执行的SQL,第二个参数为需要向SQL语句中传递的参数,以数组集合传递
batchupdate
的两种重载的方法,第一种可以在数组中添加不同类型的SQL语句,而第二种只能执行一种类型的SQL语句
示例:
package com.spring.jdbc;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestJdbc {
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Test
public void test1() {
String sql = "INSERT INTO student (name, sex) VALUES (?, ?)";
jdbcTemplate.update(sql, "梅长苏", "男");
Object[] args = new Object[]{"萧景琰", "男"};
jdbcTemplate.update(sql, args);
}
@Test
public void test2() {
String[] sqls = new String[]{
"INSERT INTO course (name, score) VALUES ('高等数学', 3)",
"INSERT INTO course (name, score) VALUES ('微积分', 4)",
"DELETE FROM student WHERE id = 2"
};
jdbcTemplate.batchUpdate(sqls);
String sql = "INSERT INTO course (name, score) VALUES (?, ?)";
List<Object[]> list = new ArrayList<>();
list.add(new Object[]{"C++基础", 4});
list.add(new Object[]{"数据库系统概论", 4});
jdbcTemplate.batchUpdate(sql, list);
}
}
query
spring提供了多种的查询方法以适用查询各种结果:
查询简单数据结果
T queryForObject(String sql, Class<T> type)
T queryForObject(String sql, Object[] args, Class<T> type)
T queryForObject(String sql, Class<T> type, Object... args)
List<Object> queryForList(String sql, Class<T> type)
List<Object> queryForList(String sql, Object[] args, Class<T> type)
List<Object> queryForList(String sql, Class<T> type, Object... args)
前三种方法为查询单一结果,即返回值明确为唯一确定值,后三种方法查询单一数据类型的集合,即查询结果返回多个简单数据类型,spring会直接将结果封装为一个List集合
查询复杂数据对象(封装为Map)
如果查询结果不是一个字段而是多个字段,spring会将查询出的字段和字段对应的值封装为Map集合,字段名称作为值对应值作为值。若结果为唯一值则返回Map集合,若结果为多个结果则会将Map封装为一个List集合
Map<String, Object> queryForMap(String sql)
Map<String, Object> queryForMap(String sql, Object[] args)
Map<String, Object> queryForMap(String sql, Object... args)
List<Map<String, Object>> queryForList(String sql)
List<Map<String, Object>> queryForList(String sql, Object[] args)
List<Map<String, Object>> queryForList(String sql, Object... args)
查询复杂数据对象(封装为实体类)
如果需要直接返回一个实体类需要添加一个实现RowMapper
接口的类,该类需要实现mapRow(ResultSet resultSet, int i)
方法用于指定查询的字段与实体类的映射关系,参数ResultSet
类与JDBC的用法相同,参数i
表示的是当前查询第几行数据。
T queryForObject(String sql, RowMapper<T> mapper)
T queryForObject(String sql, Object[] args, RowMapper<T> mapper)
T queryForObject(String sql, RowMapper<T> mapper, Object... arges)
List<T> query(String sql, RowMapper<T> mapper)
List<T> query(String sql, Object[] args, RowMapper<T> mapper)
List<T> query(String sql, RowMapper<T> mapper, Object... args)
示例:
package com.spring.jdbc;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestJdbc {
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
@Test
public void testQuerySimple1(){
String sql = "select count(*) from student";
int count = jdbcTemplate.queryForObject(sql,Integer.class);
System.out.println(count);
}
@Test
public void testQuerySimple2(){
String sql = "select name from student where sex=?";
List<String> names = jdbcTemplate.queryForList(sql,String.class,"女");
System.out.println(names);
}
@Test
public void testQueryMap1(){
String sql = "select * from student where id = ?";
Map<String,Object> stu = jdbcTemplate.queryForMap(sql,1003);
System.out.println(stu);
}
@Test
public void testQueryMap2(){
String sql = "select * from student";
List<Map<String,Object>> stus = jdbcTemplate.queryForList(sql);
System.out.println(stus);
}
@Test
public void testQueryEntity1(){
String sql = "select * from student where id = ?";
Student stu = jdbcTemplate.queryForObject(sql, new StudentRowMapper(), 1004);
System.out.println(stu);
}
@Test
public void testQueryEntity2(){
String sql = "select * from student";
List<Student> stus = jdbcTemplate.query(sql,new StudentRowMapper());
System.out.println(stus);
}
private class StudentRowMapper implements RowMapper<Student>{
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student stu = new Student();
stu.setId(resultSet.getInt("id"));
stu.setName(resultSet.getString("name"));
stu.setSex(resultSet.getString("sex"));
stu.setBorn(resultSet.getDate("born"));
return stu;
}
}
}