Spring的JdbcTemplate(10)

  • JdbcTemplate模板與DbUtils工具類比較類似.

Spring對持久層技術支持

  • JDBC : org.springframework.jdbc.core.JdbcTemplate
  • Hibernate3.0 : org.springframework.orm.hibernate3.HibernateTemplate
  • IBatis(MyBatis) : org.springframework.orm.ibatis.SqlMapClientTemplate
  • JPA : org.springframework.orm.jpa.JpaTemplate

開發JDBCTemplate入門:

  • 第一步:引入相應jar包:

    • spring-tx-3.2.0.RELEASE.jar
    • spring-jdbc-3.2.0.RELEASE.jar
    • mysql驅動.
  • 傳統JDBC連接demo
package cn.spring3.demo1;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class SpringTest1 {

    @Test
    public void demo1(){
        //創建連接池
        DriverManagerDataSource dateSource = new DriverManagerDataSource();
        //設置參數
        dateSource.setDriverClassName("com.mysql.jdbc.Driver");
        //dateSource.setUrl("jdbc:mysql://172.16.30.189:3306/spring3_day02");
        dateSource.setUrl("jdbc:mysql://192.168.0.120:3306/spring3_day02");
        dateSource.setUsername("root");
        dateSource.setPassword("123");

        //使用jdbc的模板
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dateSource);
        //這個是第二種方式:jdbcTemplate.setDataSource(dateSource);
        String sql="create table user (id int primary key auto_increment,name varchar(20))";
        jdbcTemplate.execute(sql);
    }

}
  • 第一種方式:創建applicationContext.xml(配置Spring默認連接池)
<!-- 配置Spring默認連接池 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://172.16.30.189:3306/spring3_day02"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </bean>

    <!-- 定義jdbctmplate -->
    <bean id="jdbcTmplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
  • 編寫一個測試類:
package cn.spring3.demo1;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;

@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringTest2 {
    //配置Spring默認連接池
    @Autowired
    @Qualifier("jdbcTmplate")
    private JdbcTemplate jdbcTmplate;
    @Test
    public void demo1(){
        jdbcTmplate.execute("create table user (id int primary key auto_increment,name varchar(20))");
    }
    }
  • 第二種方式:創建applicationContext.xml(配置DBCP連接池)
<!-- 配置DBCP連接池 -->
    <bean id="dateSourceDbcp" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://172.16.30.189:3306/spring3_day02"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
    </bean>

    <!-- 定義jdbctmplate DBCP -->
    <bean id="jdbcTmplateDbcp" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dateSourceDbcp"></property>
    </bean>
  • 編寫測試類:
package cn.spring3.demo1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;

@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringTest2 {
    //配置DBCP連接池 
    @Autowired
    @Qualifier("jdbcTmplateDbcp")
    private JdbcTemplate jdbcTmplateDbcp;

    @Test
    public void demo2(){
        jdbcTmplateDbcp.execute("create table user (id int primary key auto_increment,name varchar(20))");
    }
    }
  • 第三種方式:創建applicationContext.xml(配置C3p0連接池)
<!-- 配置C3P0連接池 -->
    <bean id="dateSourceC3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://172.16.30.189:3306/spring3_day02"/>
        <property name="user" value="root"/>
        <property name="password" value="123"/>
    </bean>

    <!-- 定義jdbctmplate DBCP -->
    <bean id="jdbcTmplateC3p0" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dateSourceC3p0"></property>
    </bean>
  • 編寫測試類:
package cn.spring3.demo1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;

@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringTest2 {
    //配置C3p0連接池 
    @Autowired
    @Qualifier("jdbcTmplateC3p0")
    private JdbcTemplate jdbcTmplateC3p0;

    @Test
    public void demo3(){
        jdbcTmplateC3p0.execute("create table user (id int primary key auto_increment,name varchar(20))");
    }
    }

引入配置文件方式,配置連接池(C3P0舉例說明)

1.第一步:新建JDBC.properties(名字隨便)

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql://172.16.30.189:3306/spring3_day02
jdbc.user = root
jdbc.password =123

2.第二步:配置applicationContext.xml(兩種方式引入)
2.1 第一種配置方式:

<!-- 配置C3P0連接池 引入配置文件的方式  方法一-->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
          <property name="location" value="classpath:JDBC.properties"></property>
    </bean>

    <bean id="dateSourceC3p0ref" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- 定義jdbctmplate DBCP -->
    <bean id="jdbcTmplateC3p0ref" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dateSourceC3p0ref"></property>
    </bean>

編寫測試類:

 package cn.spring3.demo1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;

@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringTest2 {//配置C3p0連接池  引入配置文件方式 方法一 第二種方法請見springtest3.java
    @Autowired
    @Qualifier("jdbcTmplateC3p0ref")
    private JdbcTemplate jdbcTmplateC3p0ref;

    @Test
    public void demo4(){
        jdbcTmplateC3p0ref.execute("create table user (id int primary key auto_increment,name varchar(20))");
    }
    }
2.2  第二種配置方式:
xmlns:context="http://www.springframework.org/schema/context"

<!-- 配置C3P0連接池 引入配置文件的方式  方法二-->
    <context:property-placeholder location="classpath:JDBC.properties"/>

    <bean id="dateSourceC3p0ref" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- 定義jdbctmplate DBCP -->
    <bean id="jdbcTmplateC3p0ref" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dateSourceC3p0ref"></property>
    </bean>

編寫測試類:

 package cn.spring3.demo1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;

@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations="classpath:applicationContext1.xml")
public class SpringTest3 {

    //配置C3p0連接池  引入配置文件方式 方法二   方法一見springtest2.java
    @Autowired
    @Qualifier("jdbcTmplateC3p0ref")
    private JdbcTemplate jdbcTmplateC3p0ref;

    @Test
    public void demo1(){
        jdbcTmplateC3p0ref.execute("create table user (id int primary key auto_increment,name varchar(20))");
    }

}
* 總結以上:
在src下創建jdbc.properties
jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql:///spring3_day02
jdbc.user = root
jdbc.password = 123

需要在applicationContext.xml 中使用屬性文件配置的內容.
* 第一種寫法:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
          <property name="location" value="classpath:jdbc.properties"></property>
</bean>

* 第二種寫法:
<context:property-placeholder location="classpath:jdbc.properties"/>

JdbcTemplate的CRUD的操作:

Spring框架中提供了對持久層技術支持的類:
JDBC            :   org.springframework.jdbc.core.support.JdbcDaoSupport
Hibernate 3.0   :   org.springframework.orm.hibernate3.support.HibernateDaoSupport
iBatis      :   org.springframework.orm.ibatis.support.SqlMapClientDaoSupport

編寫DAO的時候:
Public class UserDao extends JdbcDaoSupport{

}

進行CRUD的操作;
* 保存:update(String sql,Object... args)
* 修改:update(String sql,Object... args)
* 刪除:update(String sql,Object... args)
  • 例子:

User類

package cn.spring3.demo2;

public class User {
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

UserDao類

package cn.spring3.demo2;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class UserDao extends JdbcDaoSupport{

    public void add(User user) {
        String sql="insert into user values(null,?)";
        this.getJdbcTemplate().update(sql, user.getName());
    }

    public void update(User user) {
        String sql="update user set name= ? where id= ?";
        this.getJdbcTemplate().update(sql, user.getName(),user.getId());
    }

    public void delete(User user) {
        String sql="delete from user where id= ?";
        this.getJdbcTemplate().update(sql, user.getId());
    }

}

測試類:

package cn.spring3.demo2;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4Cla***unner;

@RunWith(SpringJUnit4Cla***unner.class)
@ContextConfiguration(locations="classpath:applicationContext1.xml")
public class StringTest1 {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
    //增
    @Test
    public void demo1(){
        User user = new User();
        user.setName("one");
        userDao.add(user);
    }
    //修改
    @Test
    public void demo2(){
        User user = new User();
        user.setId(2);
        user.setName("two");
        userDao.update(user);
    }
    //刪除
    @Test
    public void demo3(){
        User user = new User();
        user.setId(3);
        userDao.delete(user);
    }
}

查詢:

  • 簡單查詢(單一類型查詢):

    • select count(*) from user; --- queryForInt(String sql);
    • select name from user where id = ?; --- queryForObject(String sql,Class clazz,Object... args);
  • 複雜查詢:(返回對象,和對象集合)
    • select * from user where id = ? --- queryForObjectString sql,RowMapper<T> rowMapper,Object... args);
    • select * from user; --- query(String sql,RowMapper<T> rowMapper,Object... args);

UserDao類添加方法

public int findCount(){
        String sql = "select count(*) from user";
        return this.getJdbcTemplate().queryForInt(sql);
    }

    public String findNameById(User user){
        String sql = "select name from user where id= ?";
        return this.getJdbcTemplate().queryForObject(sql, String.class, user.getId());
    }

測試類編寫:

//簡單查詢1
    @Test
    public void demo4(){
        System.out.println(userDao.findCount());
    }

    //簡單查詢2
    @Test
    public void demo5(){
        User user = new User();
        user.setId(2);
        System.out.println(userDao.findNameById(user));
    }

複雜查詢
UserDao類添加方法

class UserRowMapper implements RowMapper<User>{
        /*
         * rc:結果集
         * rowNum:行號
         */
        public User mapRow(ResultSet rs, int rownum) throws SQLException {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setName(rs.getString("name"));
            return user;
        }

    }

    public User findById(int id){
        String sql = "select * from user where id= ?";
        User user = this.getJdbcTemplate().queryForObject(sql,new UserRowMapper(), id);
        return user;
    }

或者用內部類的方式:

public User findById(int id){
        String sql = "select * from user where id = ?";
        return this.getJdbcTemplate().queryForObject(sql, new RowMapper<User>(){
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                return user;
            }
        }, id);
    }

    public List<User> find(){
        String sql = "select * from user ";
        return this.getJdbcTemplate().query(sql, new RowMapper<User>(){
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                return user;
            }
        });
    }

編寫測試類:

//複雜查詢
    @Test
    public void demo6(){
        User user = userDao.findById(2);
        System.out.println(user);
    }

多條查詢
UserDao

public List<User> findAll(){
        String sql = "select * from user";
        return this.getJdbcTemplate().query(sql,new UserRowMapper());
    }

編寫測試類:

// 複雜查詢2
    @Test
    public void demo7() {
        List<User> list = userDao.findAll();
        for (User user : list) {
            System.out.println(user);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章