主要内容:
课程介绍:
课程环境:
JDBC Template概念:
示例数据库:
创建数据表代码:
drop database if exists selection_course;
create database selection_course;
use selection_course;
create table course
(
id int not null auto_increment,
name char(20),
score int,
primary key (id)
);
create table selection
(
student int not null,
course int not null,
selection_time datetime,
score int,
primary key (student, course)
);
create table student
(
id int not null auto_increment,
name varchar(20),
sex char(2),
born date,
primary key (id)
);
alter table selection add constraint FK_Reference_1 foreign key (course)
references course (id) on delete restrict on update restrict;
alter table selection add constraint FK_Reference_2 foreign key (student)
references student (id) on delete restrict on update restrict;
insert into course(id,name,score) values(1001,'英语',5);
insert into course(id,name,score) values(1002,'操作系统',5);
insert into course(id,name,score) values(1003,'数据结构',3);
commit;
创建项目:
step1:引入依赖jar包
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<!-- 仓库配置 -->
<repositories>
<repository>
<!-- 创建私服的地址,优先从阿里云下载 -->
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<dependencies>
<!-- 数据库连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- spring 相关组件-->
<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>
<!-- 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>
</dependencies>
step2:进行spring配置,主要是 数据源 和 JDBC Template
<?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?useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="mima19971009"/>
</bean>
<!-- 配置Template-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
JDBC template基本使用:
测试代码:
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 context = new ClassPathXmlApplicationContext("spring.xml");
JdbcTemplate jdbcTemplate = (JdbcTemplate)context.getBean("jdbcTemplate");
jdbcTemplate.execute("create table user1(id int,name varchar(20))");
}
}
输出结果:
update和batchUpdate:
update方法:
测试 int update(String sql,Object[] args)
@org.junit.Test
public void testUpdate(){
String sql = "insert into student(name,sex) values(?,?)";
jdbcTemplate.update(sql,new Object[]{"张飞","男"});
}
输出结果:
测试 int update(String sql,Object... args)
@org.junit.Test
public void testUpdate2(){
String sql = "update student set sex=? where id =?";
jdbcTemplate.update(sql,"女","1");
}
输出结果:
batchUpdate方法:
测试 int[] batchUpdate(String[] sql):
@org.junit.Test
public void testBatchUpdate(){
String[] sqls = {
"insert into student(name,sex) values('关羽','男')",
"insert into student(name,sex) values('刘备','男')",
"update student set sex='女' where id =2"
};
jdbcTemplate.batchUpdate(sqls);
}
输出结果:
测试 int[] batchUpdate(String sql,List<Object[]> args):
@org.junit.Test
public void testBatchUpdate2(){
String sql = "insert into selection(student,course) values (?,?)";
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[]{3,1001});
list.add(new Object[]{3,1003});
jdbcTemplate.batchUpdate(sql,list);
}
输出结果:
获取简单数据项:
测试获取一个:
测试 T queryForObject(String sql,Class<T> type):
@org.junit.Test
public void testQuerySimple1(){
String sql = "select count(*) from student";
int count = jdbcTemplate.queryForObject(sql,Integer.class);
System.out.println(count);
}
输出结果:
3
测试获取多个:
测试List<T> queryForList(String sql,Class<T> type):
@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):
测试获取一个:
测试 Map queryForMap(String sql):
@org.junit.Test
public void testQueryMap1(){
String sql = "select * from student where id = ?";
Map<String,Object> stu = jdbcTemplate.queryForMap(sql,1);
System.out.println(stu);
}
输出结果:
{id=1, name=张飞, sex=女, born=null}
测试获取多个:
测试 List<Map<String,Object>> queryForList(String sql):
@org.junit.Test
public void testQueryMap2(){
String sql = "select * from student";
List<Map<String,Object>> stus = jdbcTemplate.queryForList(sql);
System.out.println(stus);
}
输出结果:
[{id=1, name=张飞, sex=女, born=null}, {id=2, name=关羽, sex=女, born=null}, {id=3, name=刘备, sex=男, born=null}]
查询复杂对象(封装为实体对象) :
首先定义实体类对象:Student
package com.imooc.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;
}
public String toString(){
return "Student{"+id+","+name+","+sex+","+born+"}";
}
}
构造一个
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;
}
}
测试获取一个:
测试:T queryForObject(String sql, RowMapper<T> mapper):
@org.junit.Test
public void testQueryEntity1(){
String sql = "select * from student where id = ?";
Student stu = jdbcTemplate.queryForObject(sql, new StudentRowMapper(), 1);
System.out.println(stu);
}
输出结果;
Student{1,张飞,女,null}
测试获取多个:
测试:List<T> queryForList(String sql, RowMapper<T> mapper):
@org.junit.Test
public void testQueryEntity2(){
String sql = "select * from student";
List<Student> stus = jdbcTemplate.query(sql,new StudentRowMapper());
System.out.println(stus);
}
输出结果:
[Student{1,张飞,女,null}, Student{2,关羽,女,null}, Student{3,刘备,男,null}]
持久层实现:
StudentDao:接口
package com.imooc.sc.dao;
import com.imooc.sc.entity.Student;
import java.util.List;
public interface StudentDao {
void insert(Student stu);
void update(Student stu);
void delete(int id);
Student select(int id);
List<Student> selectAll();
}
StudentDaoImpl:StudentDao接口实现类
package com.imooc.sc.dao.impl;
import com.imooc.sc.dao.StudentDao;
import com.imooc.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;
public void insert(Student stu) {
String sql = "insert into student(name,sex,born) values(?,?,?)";
//模版会对日期进行转换
jdbcTemplate.update(sql,stu.getName(),stu.getSex(),stu.getBorn());
}
public void update(Student stu) {
String sql = "update student set name=? ,sex=?,born=? where id=?";
//模版会对日期进行转换
jdbcTemplate.update(sql,stu.getName(),stu.getSex(),stu.getBorn(),stu.getId());
}
public void delete(int id) {
String sql = "delete from student where id=?";
//模版会对日期进行转换
jdbcTemplate.update(sql,id);
}
public Student select(int id) {
String sql = "select * from student where id =?";
return jdbcTemplate.queryForObject(sql,new StudentRowMapper(),id);
}
public List<Student> selectAll() {
String sql = "select * from student";
return jdbcTemplate.query(sql,new StudentRowMapper());
}
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;
}
}
}
CourseDao:接口
package com.imooc.sc.dao;
import com.imooc.sc.entity.Course;
import com.imooc.sc.entity.Student;
import java.util.List;
public interface courseDao {
void insert(Course course);
void update(Course course);
void delete(Course course);
Student select(int id);
List<Student> selectAll();
}
CourseDaoImpl:接口实现类
package com.imooc.sc.dao.impl;
import com.imooc.sc.entity.Course;
import com.imooc.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 CourseDaoImpl {
@Autowired
private JdbcTemplate jdbcTemplate;
public void insert(Course course) {
String sql = "insert into student(name,score) values(?,?)";
//模版会对日期进行转换
jdbcTemplate.update(sql,course.getName(),course.getScore());
}
public void update(Course course) {
String sql = "update Course set name=? ,score=? where id=?";
//模版会对日期进行转换
jdbcTemplate.update(sql,course.getName(),course.getScore());
}
public void delete(int id) {
String sql = "delete from Course where id=?";
//模版会对日期进行转换
jdbcTemplate.update(sql,id);
}
public Course select(int id) {
String sql = "select * from course where id=?";
return jdbcTemplate.queryForObject(sql,new CourseRowMapper(),id);
}
public List<Course> selectAll() {
String sql = "select * from course";
return jdbcTemplate.query(sql,new CourseRowMapper());
}
private class CourseRowMapper implements RowMapper<Course> {
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;
}
}
}
SelectionDao:接口
package com.imooc.sc.dao;
import com.imooc.sc.entity.Selection;
import java.util.List;
import java.util.Map;
public interface SelectionDao {
void insert(List<Selection> seles);
void delete(int sid,int cid);
List<Map<String,Object>> selectByStudent(int sid);
List<Map<String,Object>> selectByCourse(int cid);
}
SelectionDaoImpl:SelectionDao接口实现类
package com.imooc.sc.dao.impl;
import com.imooc.sc.dao.SelectionDao;
import com.imooc.sc.entity.Selection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Repository
public class SelectionDaoImpl implements SelectionDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void insert(List<Selection> seles) {
String sql = "insert into selection values(?,?,?,?)";
List<Object[]> list = new ArrayList<Object[]>();
for (Selection sel : seles) {
Object[] args = new Object[4];
args[0]= sel.getSid();
args[1]= sel.getCid();
args[2]= sel.getSelTime();
args[4]= sel.getScore();
list.add(args);
}
jdbcTemplate.batchUpdate(sql,list);
}
public void delete(int sid,int cid) {
String sql = "delete from Course where student=? and course=?";
jdbcTemplate.update(sql,sid,cid);
}
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);
}
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优缺点分析:
总结: