SpringJDBC原理与应用实例讲解
一、概述
使用spring进行基本的JDBC访问数据库有多种选择。Spring至少提供了三种不同的工作模式:SpringJDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。三种模式如下:
JdbcTemplate:是Spring中最基本的JDBC模板,利用JDBC和简单的索引参数查询对数据库进行简单访问
NamedParameterJdbcTemplate:能够在查询的时候把值绑定到SQL里的命名参数,而不是索引参数NamedParameterJdbcTemplate内部包含了一个JdbcTemplate,所以JdbcTemplate能做的事情NamedParameterJdbcTemplate都能干NamedParameterJdbcTemplate相对于JdbcTemplate主要增加了参数可以命名的功能。
SimpleJdbcTemplate:利用Java5的特性,比如自动装箱、通用和可变参数列表来简化JDBC模板的使用SimpleJdbcTemplate内部包含了一个NamedParameterJdbcTemplate;所以NamedParameterJdbcTemplate能做的事情SimpleJdbcTemplate都能干,SimpleJdbcTemplate相对于NamedParameterJdbcTemplate主要增加了JDK5.0的泛型和可变长度参数支持。
下面主要来讲JdbcTemplate:
JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭。JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连接,从而可以使用该连接做任何事情、StatementCallback通过回调接口返回给用户一个Statement,从而可以使用该Statement做任何事情等等,还有其他一些回调接口如图所示。
JdbcTemplate支持的回调接口
SpringJDBC抽象框架所带来的价值将在以下几个方面得以体现:(注:使用了SpringJDBC抽象框架之后,应用开发人员只需要完成斜体字部分的编码工作。)
定义数据库连接参数
打开数据库连接
声明SQL语句
预编译并执行SQL语句
遍历查询结果(如果需要的话)
处理每一次遍历操作
处理抛出的任何异常
处理事务
关闭数据库连接
Spring将替我们完成所有使用JDBCAPI进行开发的单调乏味的、底层细节处理工作。
二、使用步骤
1、使用JdbcTemplate来访问数据
只需要配置DataSource就能够让JdbcTemplate工作,如下配置:
[html]viewplaincopy在CODE上查看代码片派生到我的代码片
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
2、现在我们可以把JdbcTemplate装配到DAO,使用它来访问数据库
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
@Autowired
privateJdbcTemplatejdbcTemplate;
3、开始操作数据库,如下面的插入
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
@Override
publicvoidinsert(Studentstudent){
jdbcTemplate.update("INSERTINTOstudentVALUES(''"+student.getId()
+"'',''"+student.getName()+"'',''"+student.getAge()
+"'',''"+student.getSex()+"'')");
}
三、使用范例
本文工程下载
这里我们要实例SpringJdbc和MySQL数据库连接,建表、执行插入、查找、删除等功能。
1、新建一个JavaProject工程,导入包mysql-connector-Java-5.1.22-bin.jar+spring3.2+commons-logging-1.2.jar
2、首先先建好数据库对应的Model:
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
packagecom.mucfc.model;
/
数据库传输类
作者林炳文(ling20081005@126.com博客:http://blog.csdn.net/evankaka)
时间2015.5.24
/
publicclassStudent{
privateintid;
privateStringname;
privateintage;
privateStringsex;
publicStudent(){
}
publicStudent(intid,Stringname,intage,Stringsex){
this.id=id;
this.name=name;
this.age=age;
this.sex=sex;
}
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetSex(){
returnsex;
}
publicvoidsetSex(Stringsex){
this.sex=sex;
}
}
然后还有一个数据库每一行的封装
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
packagecom.mucfc.model;
importjava.sql.ResultSet;
/
封装数据中的一行
作者林炳文(ling20081005@126.com博客:http://blog.csdn.net/evankaka)
时间2015.5.24
/
importjava.sql.SQLException;
/
RowMapper可以将数据中的每一行封装成用户定义的类
/
importorg.springframework.jdbc.core.RowMapper;
publicclassStudentMapperimplementsRowMapper{
publicStudentmapRow(ResultSetrs,introwNum)throwsSQLException{
Studentstudent=newStudent();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
student.setSex(rs.getString("sex"));
returnstudent;
}
}
3、DAO层:
接口类:
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
packagecom.mucfc.dao;
importjava.util.List;
importcom.mucfc.model.Student;
/
DAO接口类
作者林炳文(ling20081005@126.com博客:http://blog.csdn.net/evankaka)
时间2015.5.24
/
publicinterfaceStudentDao{
/
创建数据库表结构
@paramsql
/
publicvoidcreate();
/
插入一条学生数据
@paramstudent
/
publicvoidinsert(Studentstudent);
/
通过主键取得对象
@paramid
@returnstudent
/
publicStudentgetStudent(Integerid);
/
取得表中所有的学生
@paramid
@returnstudent
/
publicListlistStudents();
/
通过主键删除对象
@paramid
/
publicvoiddelete(Integerid);
/
通过主键更改对象
@paramid
/
publicvoidupdate(Studentstudent);
}
实现类:
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
packagecom.mucfc.dao;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.jdbc.core.JdbcTemplate;
importorg.springframework.stereotype.Component;
importcom.mucfc.model.Student;
importcom.mucfc.model.StudentMapper;
/
DAO实现类
作者林炳文(ling20081005@126.com博客:http://blog.csdn.net/evankaka)
时间2015.5.24
/
@Component
publicclassStudentDaoImplimplementsStudentDao{
@Autowired
privateJdbcTemplatejdbcTemplate;
@Override
publicvoidcreate(){
System.out.println("执行建表操作");
jdbcTemplate
.execute("DROPTABLEIFEXISTSstudent");
jdbcTemplate
.execute("CREATETABLEstudent(idintprimarykey,namevarchar(100),ageint,sexvarchar(2))");
}
@Override
publicvoidinsert(Studentstudent){
System.out.println("================执行插入操作================");
jdbcTemplate.update("INSERTINTOstudentVALUES(''"+student.getId()
+"'',''"+student.getName()+"'',''"+student.getAge()
+"'',''"+student.getSex()+"'')");
}
@Override
publicStudentgetStudent(Integerid){
System.out.println("================执行查找单个数据操作================");
StringSQL="selectfromStudentwhereid=?";
Studentstudent=jdbcTemplate.queryForObject(SQL,newObject[]{id},newStudentMapper());
returnstudent;
}
@Override
publicListlistStudents(){
System.out.println("================执行查找全部操作================");
Listrows=jdbcTemplate.queryForList("SELECTFROMstudent");
Iteratorit=rows.iterator();
while(it.hasNext()){
MapstudentMap=(Map)it.next();
System.out.print("学生id:"+studentMap.get("id")+";");
System.out.print("学生name:"+studentMap.get("name")+";");
System.out.print("学生age:"+studentMap.get("age")+";");
System.out.println("学生sex:"+studentMap.get("sex"));
}
returnrows;
}
@Override
publicvoiddelete(Integerid){
System.out.println("================执行删除单个数据操作================");
StringSQL="deletefromStudentwhereid=?";
jdbcTemplate.update(SQL,id);
System.out.println("DeletedRecordwithID="+id);
return;
}
@Override
publicvoidupdate(Studentstudent){
System.out.println("================执行更新单个数据操作================");
jdbcTemplate.update(
"UPDATEstudentSETname=?,age=?,sex=?WHEREid=?",
newObject[]{student.getName(),student.getAge(),
student.getSex(),student.getId()});
}
}
4、Spring配置
新建一个beans.xml,内容如下:
[html]viewplaincopy在CODE上查看代码片派生到我的代码片
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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
5、测试:
[java]viewplaincopy在CODE上查看代码片派生到我的代码片
packagecom.mucfc.service;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
importcom.mucfc.dao.StudentDaoImpl;
importcom.mucfc.model.Student;
publicclassTest{
publicstaticvoidmain(String[]args){
ApplicationContextcontext=newClassPathXmlApplicationContext("Beans.xml");
StudentDaoImplstudentDaoImpl=(StudentDaoImpl)context.getBean("studentDaoImpl");
studentDaoImpl.create();
Studentstudent1=newStudent(1,"红红",12,"女");
studentDaoImpl.insert(student1);
studentDaoImpl.insert(newStudent(2,"明明",16,"男"));
studentDaoImpl.insert(newStudent(3,"小王",22,"男"));
studentDaoImpl.insert(newStudent(4,"小刘",15,"男"));
studentDaoImpl.insert(newStudent(5,"张三",23,"男"));
studentDaoImpl.listwww.baiyuewang.netStudents();
System.out.println(studentDaoImpl.getStudent(2));
studentDaoImpl.update(newStudent(2,"大明",15,"男"));
System.out.println(studentDaoImpl.getStudent(2));
studentDaoImpl.delete(2);
studentDaoImpl.listStudents();
}
}
|
|