使用Spring组件JDBC Template简化持久化操作
案例下载:git clone https://gitee.com/chenxiaonian/selection_course.git
JDBC Template概念
Sprint JDBC Template
- 为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件
- JDBC Template提供统一的模板方法,在保留代码灵活性的基础上,尽量减少持久化代码
[使用JDBC Template之前]
[使用JDBC Template之后]
环境配置
pom.xml
<?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>org.example</groupId><artifactId>selection_course</artifactId><version>1.0-SNAPSHOT</version><properties><spring.version>4.0.2.RELEASE</spring.version></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.44</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><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><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency></dependencies></project>
src/main/resources/spring.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"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://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?useUnicode=true&characterEncoding=utf-8"/><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><context:component-scan base-package="com.song.sc"/></beans>
execute方法
一般用户创建表和修改表结构
src/test/java/Test.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class Test {
@org.junit.Test
public void testExecute(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
jdbcTemplate.execute("create table user1(id int,name varchar(20))");
}
}
运行结果:创建表user1
updata方法
对数据进行增删改操作
src/test/java/Test.java
@org.junit.Test
public void testUpdate1(){
String sql = "insert into student(name,sex) values(?,?)";
jdbcTemplate.update(sql,new Object[]{"张三","男"});
}
@org.junit.Test
public void testUpdate2(){
String sql = "update student set sex=? where id=?";
jdbcTemplate.update(sql,new Object[]{"女",1});
}
batchUpdate方法
批量增删改操作
src/test/java/Test.java
@org.junit.Test
public void testBatchUpdate1(){
String[] sqls = {
"insert into Student(name,sex) values('李四','男')",
"insert into Student(name,sex) values('王五','男')",
"update Student set sex = '女' where id=1"
};
jdbcTemplate.batchUpdate(sqls);
}
@org.junit.Test
public void testBatchUpdate2(){
String sql = "insert into selection(student,course) values(?,?)";
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[]{1,1001});
list.add(new Object[]{1,1003});
jdbcTemplate.batchUpdate(sql,list);
}
query方法和queryXXX方法
查询简单数据项 - 获取一个

@org.junit.Test
public void testQuerySimple1(){
String sql = "select count(*) from student";
int count = jdbcTemplate.queryForObject(sql,Integer.class);
System.out.println(count);
}
查询简单数据项 - 获取多个

@org.junit.Test
public void testQuerySimple2(){
String sql = "select name from student where sex=?";
List<String> names = jdbcTemplate.queryForList(sql,String.class,"男");
System.out.println(names);
}
查询复杂对象(封装为Map)- 获取一个

@org.junit.Test
public void testQueryMap1(){
String sql = "select * from student where id=?";
Map<String,Object> student = jdbcTemplate.queryForMap(sql,1);
System.out.println(student);
}
查询复杂对象(封装为Map)- 获取多个

@org.junit.Test
public void testQueryMap2(){
String sql = "select * from student";
List<Map<String,Object>> students = jdbcTemplate.queryForList(sql);
System.out.println(students);
}
查询复杂对象(封装为实体对象)- 获取一个

@org.junit.Test
public void testQueryEntity1(){
String sql = "select * from student where id=?";
Student student = jdbcTemplate.queryForObject(sql, new RowMapper<Student>() {
@Override
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;
}
}, 1);
System.out.println(student);
}
Student{id=1, name=’张三’, sex=’女’, born=null}
查询复杂对象(封装为实体对象)- 获取多个

@org.junit.Test
public void testQueryEntity2(){
String sql = "select * from student";
List<Student> students = jdbcTemplate.query(sql, new RowMapper<Student>() {
@Override
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;
}
});
System.out.println(students);
}
[Student{id=1, name=’张三’, sex=’女’, born=null}, Student{id=2, name=’李四’, sex=’男’, born=null}, Student{id=3, name=’王五’, sex=’男’, born=null}]
以上查询复杂对象(封装为实体对象),new RowMapper
@org.junit.Test
public void testQueryEntity1(){
String sql = "select * from student where id=?";
Student student = jdbcTemplate.queryForObject(sql, new StudentRowMapper(), 1);
System.out.println(student);
}
@org.junit.Test
public void testQueryEntity2(){
String sql = "select * from student";
List<Student> students = jdbcTemplate.query(sql, new StudentRowMapper());
System.out.println(students);
}
private class StudentRowMapper implements RowMapper<Student>{
@Override
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;
}
}
持久层实现
实现实体类
src/main/java/com/song/sc/entity/Student.java
package com.song.sc.entity;
import java.util.Date;
public class Student {
private int id;
private String name;
private String sex;
private Date born;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBorn() {
return born;
}
public void setBorn(Date born) {
this.born = born;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", born=" + born +
'}';
}
}
src/main/java/com/song/sc/entity/Course.java
package com.song.sc.entity;
public class Course {
private int id;
private String name;
private int score;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
src/main/java/com/song/sc/entity/Selection.java
package com.song.sc.entity;
import java.util.Date;
public class Selection {
private int sid;
private int cid;
private Date selTime;
private int score;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
public Date getSelTime() {
return selTime;
}
public void setSelTime(Date selTime) {
this.selTime = selTime;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
实现DAO
src/main/java/com/song/sc/dao/StudentDao.java
package com.song.sc.dao;
import com.song.sc.entity.Student;
import java.util.List;
public interface StudentDao {
void insert(Student student);
void update(Student student);
void delete(int id);
Student select(int id);
List<Student> selectAll();
}
src/main/java/com/song/sc/dao/impl/StudentDaoImpl.java
package com.song.sc.dao.impl;
import com.song.sc.dao.StudentDao;
import com.song.sc.entity.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@Repository
public class StudentDaoImpl implements StudentDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void insert(Student student) {
String sql = "insert into student(name,sex,born) values(?,?,?)";
jdbcTemplate.update(sql, student.getName(), student.getSex(), student.getBorn());
}
@Override
public void update(Student student) {
String sql = "update student set name=?,sex=?,born=? where id=?";
jdbcTemplate.update(sql, student.getName(), student.getSex(), student.getBorn(), student.getId());
}
@Override
public void delete(int id) {
String sql = "delete from student where id=?";
jdbcTemplate.update(sql, id);
}
@Override
public Student select(int id) {
String sql = "select * from student where id=?";
return jdbcTemplate.queryForObject(sql, new StudentRowMapper(), id);
}
@Override
public List<Student> selectAll() {
String sql = "select * from student";
return jdbcTemplate.query(sql, new StudentRowMapper());
}
private class StudentRowMapper implements RowMapper<Student> {
@Override
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;
}
}
}
src/main/java/com/song/sc/dao/CourseDao.java
package com.song.sc.dao;
import com.song.sc.entity.Course;
import java.util.List;
public interface CourseDao {
void insert(Course course);
void update(Course course);
void delete(int id);
Course select(int id);
List<Course> selectAll();
}
src/main/java/com/song/sc/dao/impl/CourseDaoImpl.java
package com.song.sc.dao.impl;
import com.song.sc.dao.CourseDao;
import com.song.sc.entity.Course;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class CourseDaoImpl implements CourseDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void insert(Course course) {
String sql = "insert into course(name,score) values(?,?)";
jdbcTemplate.update(sql, course.getName(), course.getScore());
}
@Override
public void update(Course course) {
String sql = "update course set name=?,score=? where id=?";
jdbcTemplate.update(sql, course.getName(), course.getScore(), course.getId());
}
@Override
public void delete(int id) {
String sql = "delete from course where id=?";
jdbcTemplate.update(sql, id);
}
@Override
public Course select(int id) {
String sql = "select * from course where id=?";
return jdbcTemplate.queryForObject(sql, new CourseRowMapper(), id);
}
@Override
public List<Course> selectAll() {
String sql = "select * from course";
return jdbcTemplate.query(sql, new CourseRowMapper());
}
private class CourseRowMapper implements RowMapper<Course> {
@Override
public Course mapRow(ResultSet resultSet, int i) throws SQLException {
Course course = new Course();
course.setId(resultSet.getInt("id"));
course.setName(resultSet.getString("name"));
course.setScore(resultSet.getInt("score"));
return course;
}
}
}
src/main/java/com/song/sc/dao/SelectionDao.java
package com.song.sc.dao;
import com.song.sc.entity.Selection;
import java.util.List;
import java.util.Map;
public interface SelectionDao {
void insert(List<Selection> selections);
void delete(int sid, int cid);
List<Map<String, Object>> selectByStudent(int sid);
List<Map<String, Object>> selectByCourse(int cid);
}
src/main/java/com/song/sc/dao/impl/SelectionDaoImpl.java
package com.song.sc.dao.impl;
import com.song.sc.dao.SelectionDao;
import com.song.sc.entity.Selection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class SelectionDaoImpl implements SelectionDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void insert(List<Selection> selections) {
String sql = "insert into selection values(?,?,?,?)";
List<Object[]> list = new ArrayList<Object[]>();
for (Selection selection : selections) {
Object[] args = new Object[4];
args[0] = selection.getSid();
args[1] = selection.getCid();
args[2] = selection.getSelTime();
args[3] = selection.getScore();
list.add(args);
}
jdbcTemplate.batchUpdate(sql, list);
}
@Override
public void delete(int sid, int cid) {
String sql = "delete from selection where student=? and course=?";
jdbcTemplate.update(sql, sid, cid);
}
@Override
public List<Map<String, Object>> selectByStudent(int sid) {
String sql = "select se.*, stu.name sname, cou.name cname from selection se" +
"left join student stu on se.student = stu.id" +
"left join course cou on se.course = cou.id" +
"where student=?";
return jdbcTemplate.queryForList(sql, sid);
}
@Override
public List<Map<String, Object>> selectByCourse(int cid) {
String sql = "select se.*, stu.name sname, cou.name cname from selection se" +
"left join student stu on se.student = stu.id" +
"left join course cou on se.course = cou.id" +
"where course=?";
return jdbcTemplate.queryForList(sql, cid);
}
}
总结
JDBC Template是Spring框架点击JDBC操作的封装,简单,灵活但不够强大
实际应用中还需要和其他ORM框架混合使用
持久化操作的特点:必须,机械性 ORM:对象 - 关系
