spring之jdbcTemplate实例

如果我们不使用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("结束");
    }
    
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。