Spring框架 JdbcTemplate(五)

来源:互联网 发布:js单选按钮取消选中 编辑:程序博客网 时间:2024/06/05 05:08

Spring JdbcTemplate 模板工具类

JdbcTemplate 是Spring提供简化Jdbc开发模板工具类。 使用上类似 Apache DbUtils

Spring对不同持久层技术支持
jdbcTemplate

JdbcTemplate 快速入门

第一步: 在项目导入jar包
Spring核心4个、日志2个、测试 1个
导入jdbctemplate需要jar包
spring-jdbc-3.2.0.RELEASE.jar
spring-tx-3.2.0.RELEASE.jar
导入 mysql驱动包

第二步: 编写jdbc模板程序

public class JdbcTemplateTest {    @Test    public void demo1() {        // 使用JdbcTemplate 完成数据库建表操作        // 1、 创建数据库连接池 (使用spring内置)        DriverManagerDataSource dataSource = new DriverManagerDataSource();        dataSource.setDriverClassName("com.mysql.jdbc.Driver");        dataSource.setUrl("jdbc:mysql:///spring3_day2");        dataSource.setUsername("root");        dataSource.setPassword("abc");        // 2、 通过连接池构造模板对象        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);        // 3、执行sql语句        jdbcTemplate.execute("create table person(id int primary key, name varchar(20))");    }}

第一步: 连接池
第二步: 模板对象
第三步: 执行sql语句

使用配置文件,配置JdbcTemplate

propJdbc

spring内置连接池

1、spring内置连接池    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">        <property name="driverClassName" value="com.mysql.jdbc.Driver" />        <property name="url" value="jdbc:mysql:///spring3_day2" />        <property name="username" value="root" />        <property name="password" value="root" />    </bean>

Apache提供dbcp连接池
dbcp

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">        <property name="driverClassName" value="com.mysql.jdbc.Driver" />        <property name="url" value="jdbc:mysql:///spring3_day2" />        <property name="username" value="root" />        <property name="password" value="root" />    </bean>

c3p0连接池
c3p0

<!-- 3、 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.username}" />        <property name="password" value="${jdbc.password}" />    </bean>

外部属性文件(properties文件)
修改properties 文件 会比 修改 xml文件 方便
将经常需要修属性参数值,配置到独立properties文件 ,在xml文件引入properties

建立db.properties文件

jdbc.driver = com.mysql.jdbc.Driverjdbc.url = jdbc:mysql:///spring3_day2jdbc.username = rootjdbc.password = abc

在spring 引入properties文件

<!-- 引入properties文件 -->    <context:property-placeholder location="classpath:db.properties"/>

通过 ${key} 引用properties文件属性值

<!-- 3、 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.username}" />        <property name="password" value="${jdbc.password}" />    </bean>
<!-- 使用连接池 构造jdbcTemplate -->    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="dataSource" />    </bean>

使用JdbcTemplate完成单表 CURD
第一步: 建立表 product商品表
CREATE TABLE product (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL,
price double NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
第二步: 编写实体类

public class Product {    private int pid;    private String name;    private double price;

第三步: 编写ProductDAO ,完成对product表常见操作
问题: 将JdbcTemplate 注入DAO

public class ProductDAO extends JdbcDaoSupport {    // DAO 继承 Support ,自动提供setXXX 注入模板方法

配置applicationContext.xml

<!-- 需要将jdbcTemplate 注入DAO对象 -->    <bean id="productDAO" class="cn.itcast.spring.c_curd.ProductDAO">        <!-- 向JdbcDaoSupport类注入DataSource 自动创建 JdbcTemplate对象 -->        <property name="dataSource" ref="dataSource" />    </bean>

增、删、改操作
实现DAO 增加、修改、删除方法

// 添加    public void save(Product product) {        String sql = "insert into product values(null,?,?)";        this.getJdbcTemplate().update(sql, product.getName(), product.getPrice());    }    // 修改    public void update(Product product) {        String sql = "update product set name=? , price=? where id=?";        this.getJdbcTemplate().update(sql, product.getName(), product.getPrice(), product.getPid());    }    // 删除    public void delete(Product product) {        String sql = "delete from product where id = ?";        this.getJdbcTemplate().update(sql, product.getPid());    }

简单查询,返回一个值
如果返回结果 是一个简单值,使用jdbcTemplate 提供 queryForXXX 方法
queryForInt 返回结果是int

queryForLong 返回结果是long

queryForObject 返回结果是Object (返回String )

实现DAO 方法

// 查询某个商品 名称    public String findNameById(int id) {        String sql = "select name from product where id =?";        return this.getJdbcTemplate().queryForObject(sql, String.class, id);    }    // 查询总商品数量    public long findTotalCount() {        String sql = "select count(*) from product";        return this.getJdbcTemplate().queryForLong(sql);    }

复杂查询返回对象
JdbcTemplate 并没有提供 像Apache DbUtils框架 那样Handler ,需要手动封装结果集
———— 通常企业开发中, 开发人员会为每个表,编写单独结果集封装程序 (RowMapper)

/**     * 结果集 封装程序 (只需关注 每行数据如何封装 )     *      * @author seawind     *      */    private class ProductRowMapper implements RowMapper<Product> {        @Override        // rs 结果集对象 、rowNum 行号        public Product mapRow(ResultSet rs, int rowNum) throws SQLException {            Product product = new Product();            product.setPid(rs.getInt("id"));            product.setName(rs.getString("name"));            product.setPrice(rs.getDouble("price"));            return product;        }    }

再根据RowMapper 完成其他查询

// 根据id 查询商品信息    public Product findById(int id) {        String sql = "select * from product where id = ?";        return this.getJdbcTemplate().queryForObject(sql, new ProductRowMapper(), id);    }    // 查询所有商品    public List<Product> findAll() {        String sql = "select * from product";        return this.getJdbcTemplate().query(sql, new ProductRowMapper());    }

重点:
两套AOP (传统SpringAOP 、 AspectJ )
JdbcTemplate 增删改查

补充知识点: 传统Spring AOP 手动代理 —– 现在企业开发基本不要
来自Spring1.2时代
目标:

public class UserService {    public void save() {        System.out.println("添加");    }    public void update() {        System.out.println("更新");    }}

Advice:

public class MyMethodAdvice implements MethodInterceptor {    @Override    public Object invoke(MethodInvocation mi) throws Throwable {        System.out.println("环绕前=============");        Object result = mi.proceed();        System.out.println("环绕后=============");        return result;    }}

通过Spring提供 ProxyFactoryBean 对目标进行手动代理

<!-- 配置目标 -->    <bean id="userService" class="cn.itcast.service.UserService" />    <!-- 通知 -->    <bean id="mymethodAdvice" class="cn.itcast.advice.MyMethodAdvice" />    <!-- 手动代理 -->    <bean id="userServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">        <!-- 目标 -->        <property name="target" ref="userService" />        <!-- 可以配置多个Advice的name, 参数值value赋值 -->        <property name="interceptorNames" value="mymethodAdvice" />        <!-- 对类对象进行代理 -->        <property name="proxyTargetClass" value="true" />    </bean>

userService对象是代理前真实业务对象
userServiceProxy 由代理工厂生成代理对象

0 0
原创粉丝点击