Spring的JdbcTemplate

来源:互联网 发布:wine for ubuntu下载 编辑:程序博客网 时间:2024/06/15 21:31

Spring对持久层框架的支持

Spring为各种支持的持久化技术都提供了简单操作的模板和回调。

ORM持久化技术 提供的模板类 JDBC org.springframework.jdbc.core.JdbcTemplate Hibernate3.0 org.springframework.orm.hibernate3.HibernateTemplate MyBatis org.springframework.orm.ibatis.SqlMapClientTemplate JPA org.springframework.orm.jpa.JpaTemplate

使用JdbcTemplate创建数据表

除了Spring的核心包外,引入额外jar包:

  • spring-tx-3.2.0.RELEASE.jar
  • spring-jdbc-3.2.0.RELEASE.jar

当然还有mysql驱动:

  • mysql-connector-java-5.0.8-bin.jar

创建applicationContext.xml:

<?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:jdbc="http://www.springframework.org/schema/jdbc"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"><!-- bean definitions here --></beans>

配置连接池

1、Spring默认的连接池

配置applicationContext.xml:

<!-- 配置Spring默认的连接池 -->    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>        <property name="url" value="jdbc:mysql:///SpringJdbcTemplate"/>        <property name="username" value="root"/>        <property name="password" value="***************"/>    </bean>    <!-- 定义jdbcTemplate -->    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="datasource"/>    </bean>

测试单元中:

@Autowired    @Qualifier("jdbcTemplate")    private JdbcTemplate jdbcTemplate;    @Test    public void test() {        String sql = "CREATE TABLE test1(id INT PRIMARY KEY,stuName VARCHAR(20))";        jdbcTemplate.execute(sql);    }

结果:
这里写图片描述

DBCP连接池和C3P0连接池的配置和上面几乎相同,仅仅需要导入相应jar包和更改class,并且注意property属性的值有些不同即可:
DBCP连接池:
导入jar包:

  • com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
  • com.springsource.org.apache.commons.pool-1.5.3.jar
    类名:org.apache.commons.dbcp.BasicDataSource
<!-- 配置DBCP连接池 -->    <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>        <property name="url" value="jdbc:mysql:///SpringJdbcTemplate"/>        <property name="username" value="root"/>        <property name="password" value="***************"/>    </bean>    <!-- 定义jdbcTemplate -->    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="datasource"/>    </bean>

C3P0连接池:
导入jar包:

  • com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

类名:com.mchange.v2.c3p0.ComboPooledDataSource

<!-- 配置C3P0连接池 -->    <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">        <property name="driverClass" value="com.mysql.jdbc.Driver"/>        <property name="jdbcUrl" value="jdbc:mysql:///SpringJdbcTemplate"/>        <property name="user" value="root"/>        <property name="password" value="***************"/>    </bean>    <!-- 定义jdbcTemplate -->    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="datasource"/>    </bean>

通过属性文件配置连接池

一般我们并不会将连接数据库的参数直接设置在xml文件中,而是将参数填写在属性文件中。

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:///SpringJdbcTemplatejdbc.user=rootjdbc.password=###########

在applicationContext.xml文件中使用属性文件配置的内容:
两种方法
第一种:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">        <property name="location" value="classpath:jdbc.properties"/>    </bean>    <!-- 配置C3P0连接池 -->    <bean id="dataSource" 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>

第二种:

<context:property-placeholder location="classpath:jdbc.properties"/>    <!-- 配置C3P0连接池 -->    <bean id="dataSource" 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>

JdbcTemplate的CRUD操作

创建StuDao:

public class StuDao{    private JdbcTemplate jdbcTemplate;    public void setJdbcTemplate(JdbcTemplate jdbcTemplate){        this.jdbcTemplate = jdbcTemplate;    }    public void InsertStu(String name){        String sql = "INSERT into test1 VALUES(NULL,?)";        this.getJdbcTemplate().update(sql, name);    }    public void DeleteStu(String name){        String sql = "delete from test1 where stuName=?";        this.getJdbcTemplate().update(sql, name);    }    public void UpdateStu(int id,String name){        String sql = "UPDATE test1 set stuName=? where id=?";        this.getJdbcTemplate().update(sql, name,id);    }}

配置文件:

<bean id="stuDao" class="dao.StuDao">        <property name="jdbcTemplate" ref="jdbcTemplate"/>    </bean>

这是一种创建dao并且获取JdbcTemplate的方法,其实我们使用以下方式:

public class StuDao extends JdbcDaoSupport{    public void InsertStu(String name){        String sql = "INSERT into test1 VALUES(NULL,?)";        this.getJdbcTemplate().update(sql, name);    }    public void DeleteStu(String name){        String sql = "delete from test1 where stuName=?";        this.getJdbcTemplate().update(sql, name);    }    public void UpdateStu(int id,String name){        String sql = "UPDATE test1 set stuName=? where id=?";        this.getJdbcTemplate().update(sql, name,id);    }}

继承JdbcDaoSupport类,其实它的内部有jdbctemplate和setter/getter方法。

实现查询操作:

  • 简单查询:
    • select count(*) from test1;–>queryForInt(String sql)
    • select name from test1 where id=?–>queryForObject(String sql,Class clazz,Object… args)
public int GetCount(){        String sql = "select count(*) from test1";        return this.getJdbcTemplate().queryForInt(sql);}public String getNameById(int id){        String sql = "select stuName from test1 where id=?";        return this.getJdbcTemplate().queryForObject(sql, String.class, id);}
  • 复杂查询:
    • select * from test1 where id=?–>queryForObject(String sql,RowMapper<T> rowMapper,Object… args)
    • select * from test1;–>query(String sql,RowMapper<T> rowMapper,Object… args)
public Student findById(int id){        String sql = "select * from test1 where id=?";        return this.getJdbcTemplate().queryForObject(sql, new StuRowMapper(),id);    }public List<Student> findAll(){        String sql = "select * from test1";        return this.getJdbcTemplate().query(sql, new StuRowMapper());}//创建一个内部类实现RowMapper接口  class StuRowMapper implements RowMapper<Student>{    @Override    public Student mapRow(ResultSet rs, int rowNum) throws SQLException {        Student stu = new Student();        stu.setId(rs.getInt("id"));        stu.setName(rs.getString("stuName"));        return stu;        }}