程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> spring之jdbcTemplate實例

spring之jdbcTemplate實例

編輯:C++入門知識

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 findUser(){
String sql="select age,name from springjdbctest";

final List list= new ArrayList();
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、配置文件

 


com.mysql.jdbc.Driver






root



admin
















 

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 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、配置文件





com.mysql.jdbc.Driver





root



admin



















 







 

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("結束");
}

}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved