标签:
如果我们不使用spring或使用spring但不使用spring的jdbcTemplate模板的时候我们要取得一个数据库的连接以及关闭要经过如下几步:
1、使用Java反射加载驱动
2、通过DriverManager 的getConnection() 方法获取Connection对象
3、获取Statement 或PrepareStatement
4、 调用Statement 或PrepareStatement的方法进行数据ddl dcl dml 操作
5、获取结果
6、释放资源
7、如果有异常,处理异常 (异常在哪里都有可能出现)
我们发现我们想要的或者说和业务相关的只有4、5这两个,其他的和业务无关,但是这些必须要有,而且有个特点不管是怎样这些都是固定不变的,也就和一个流程中的某些固定事务相似,所以spring使用模板方法模式对其进行了封装,具体的如下:
我们知道Spring 没有提供orm框架但是spring对jdbc使用模板方法模式进行了封装,在使用的过程我们不用处理数据库的连接,资源的释放以及异常处理,这些固定的操作spring的jdbcTemplate已经帮我们处理了!
下面看看,spring 的jdbcTemplate 模板的结构:
jdbcTemplate是线程安全的,在应用中使用一个jdbcTemplate,所以我们在xml配置文件中进行配置。
使用Spring的jdbcTemplate模板进行数据库操作实例:
1、javaBean:
package com.inspur.data;
/**
*@author WHD
*2015-2-4
*/
public class User {
private int age;
private String name;
public User(){}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、接口
package com.inspur.data;
import java.util.List;
/**
*@author WHD
*2015-2-4
*/
public interface UserDao {
public void SaveUser(User user);
}
3、接口实现类 StudentDaoImp
package com.inspur.data;
import org.springframework.jdbc.core.JdbcTemplate;
/**
*@author WHD
*2015-2-5
*/
public class StudentDaoImp implements UserDao {
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void SaveUser(User user) {
String sql="delete from springjdbctest where age=3 ";
int res=jdbcTemplate.update(sql);
System.out.println("del 执行结果"+res);
}
public void test(){
System.out.println("test");
}
}
4、接口实现类
package com.inspur.data;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.resource.cci.ResultSet;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
/**
*@author WHD
*2015-2-4
*/
public class UserDaoImp implements UserDao{
//jdbcTemplate对象 提供了操作数据库的方法
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void SaveUser(User user) {
// TODO Auto-generated method stub
String sql="insert into springjdbctest values(?,?)";
jdbcTemplate.update(sql, new Object[]{user.getAge(),user.getName()}, new int[]{java.sql.Types.INTEGER,java.sql.Types.VARCHAR});
System.out.println(sql);
}
public void tell(){
System.out.println("daoimp");
}
// 查询数据
public List<User> findUser(){
String sql="select age,name from springjdbctest";
final List<User> list= new ArrayList<User>();
jdbcTemplate.query(sql, new RowCallbackHandler(){
// 这里封装的还是挺方便的,你不用自己对ResultSet 进行遍历取值,可以按照下面的方式直接循环取值
@Override
public void processRow(java.sql.ResultSet res) throws SQLException {
User user= new User();
user.setAge(Integer.parseInt(res.getString("age")));
user.setName(res.getString("name"));
list.add(user);
user=null;
}
});
return list;
}
// 获取总数
public int count(){
int count=jdbcTemplate.queryForInt("select count(*) from springjdbctest");
return count;
}
}
5、配置文件
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!-- jdbcTemplate 这里有个属性 即数据源 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!--定义数据源,数据源的配置信息可以写在properties中,加载进来,这里是测试就直接写了 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/myspringjdbcdb</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>admin</value>
</property>
</bean>
<!-- 接口实现了,使用set注入为 类中的jdbcTemplate这个属性注入值 -->
<bean id="userDaoImp" class="com.inspur.data.UserDaoImp">
<property name="jdbcTemplate">
<ref bean="jdbcTemplate"/>
</property>
</bean>
<!-- 接口实现了,使用set注入为 类中的jdbcTemplate这个属性注入值 -->
<bean id="studentDaoImp" class="com.inspur.data.StudentDaoImp">
<property name="jdbcTemplate">
<ref bean="jdbcTemplate"/>
</property>
</bean>
</beans>
6、测试类
/**
*
*/
package com.test;
import java.util.List;
import java.util.Map;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.inspur.data.StudentDaoImp;
import com.inspur.data.User;
import com.inspur.data.UserDaoImp;
import junit.framework.TestCase;
/**
*@author WHD
*2014-10-4
*/
public class TestDisk extends TestCase{
public void test(){
ApplicationContext act = new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserDaoImp userdaoimp=(UserDaoImp)act.getBean("userDaoImp");
StudentDaoImp studentdaoimp=(StudentDaoImp)act.getBean("studentDaoImp");
User user= new User();
user.setAge(3);
user.setName("name3");
userdaoimp.tell();
userdaoimp.SaveUser(user);
List<User> list=userdaoimp.findUser();
for(User data:list){
System.out.println("查询结果:"+data.getAge()+" "+data.getName());
}
// 查询结果:
int count=userdaoimp.count();
System.out.println(count);
}
}
上面的是使用了spring的jdbcTemplate模板,下面使用mapper 也就是在sql和应用之间加一道墙隔开我们不和sql打交道
1、Javabean
package com.inspur.jdbcMapper;
/**
*@author WHD
*2015-2-5
*/
public class Person {
private int age;
private String name;
public Person(){}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、继承SqlUpdate实现隔离
package com.inspur.jdbcMapper;
import java.sql.Types;
import javax.sql.DataSource;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.SqlUpdate;
/**
*@author WHD
*2015-2-5
*/
public class InsertPerson extends SqlUpdate{
public InsertPerson(DataSource datasource){
setDataSource(datasource);
setSql("insert into springjdbctest values(?,?)");
declareParameter(new SqlParameter(Types.INTEGER));
declareParameter(new SqlParameter(Types.VARCHAR));
compile();
}
public int insert(Person person){
Object []params= new Object[]{person.getAge(),person.getName()};
return update(params);
}
}
3、继承SqlUpdate实现隔离
package com.inspur.jdbcMapper;
import java.sql.Types;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.SqlUpdate;
/**
*@author WHD
*2015-2-9
*/
public class DeletePerson extends SqlUpdate{
public DeletePerson(javax.sql.DataSource dataSource){
setDataSource(dataSource);
setSql("delete from springjdbctest where age=?");
declareParameter(new SqlParameter(Types.INTEGER));
}
public int delete(Person person){
Object []params= new Object[]{person.getAge()};
return update(params);
}
}
4、业务中的方法调用2中方法进行insert,但这里也就是业务中我们不用谢sql语句
package com.inspur.jdbcMapper;
/**
*@author WHD
*2015-2-5
*/
public class MyInsert {
private InsertPerson insertPerson;
public InsertPerson getInsertPerson() {
return insertPerson;
}
public void setInsertPerson(InsertPerson insertPerson) {
this.insertPerson = insertPerson;
}
public int insert(Person person){
System.out.println("执行插入");
return insertPerson.insert(person);
}
public void tell(){
System.out.println("执行插入");
}
}
5、业务中的方法调用3中方法进行delete,执行3中的方法但我们不用写sql语句
package com.inspur.jdbcMapper;
/**
*@author WHD
*2015-2-9
*/
public class MyDelete {
private DeletePerson deletePerson;
public DeletePerson getDeletePerson() {
return deletePerson;
}
public void setDeletePerson(DeletePerson deletePerson) {
this.deletePerson = deletePerson;
}
public int delete (Person person){
System.out.println("执行persondelete");
return deletePerson.delete(person);
}
}
6、配置文件
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/myspringjdbcdb</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>admin</value>
</property>
</bean>
<!-- 映射 实现sql的分离-->
<bean id="insertPerson" class="com.inspur.jdbcMapper.InsertPerson">
<constructor-arg>
<ref bean="dataSource"/>
</constructor-arg>
</bean>
<!-- 映射 实现sql的分离-->
<bean id="deletePerson" class="com.inspur.jdbcMapper.DeletePerson">
<constructor-arg>
<ref bean="dataSource"/>
</constructor-arg>
</bean>
<!--实际调用InserPerson中的方法-->
<bean id="myInsert" class="com.inspur.jdbcMapper.MyInsert">
<property name="insertPerson">
<ref bean="insertPerson"/>
</property>
</bean>
<!--实际调用deletePerson中的方法-->
<bean id="myDelete" class="com.inspur.jdbcMapper.MyDelete">
<property name="deletePerson" ref="deletePerson"/>
</bean>
</beans>
7、测试类
/**
*
*/
package com.test;
import java.util.List;
import java.util.Map;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.inspur.jdbcMapper.MyDelete;
import com.inspur.jdbcMapper.MyInsert;
import com.inspur.jdbcMapper.MySelect;
import com.inspur.jdbcMapper.Person;
import junit.framework.TestCase;
/**
*@author WHD
*2014-10-4
*/
public class TestDisk extends TestCase{
public void testSpring(){
ApplicationContext act = new ClassPathXmlApplicationContext("appMapper.xml");
MyInsert myinsert= (MyInsert)act.getBean("myInsert");
MyDelete myDelete=(MyDelete)act.getBean("myDelete");
Person p= new Person();
p.setAge(8);
p.setName("name8");
myinsert.tell();
myinsert.insert(p);
myDelete.delete(p);
System.out.println("结束");
}
}
标签:
原文地址:http://blog.csdn.net/qh_java/article/details/43671337