配色: 字号:
Spring JDBC原理与应用实例讲解
2016-10-13 | 阅:  转:  |  分享 
  
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();

}



}

献花(0)
+1
(本文系thedust79首藏)