随笔录 之 spring 自学杂记(五) -- JDBC

来源:互联网 发布:webpack配置config.js 编辑:程序博客网 时间:2024/04/29 22:30

Spring Jdbc


JdbcTemplate

Spring JDBC 中的一个辅助类(JdbcTemplate)
是为不同类型的jdbc操作提供模板方法。

个人觉得比较灵活、简单、易用。

类似的有工具有:DButil


一个简单实例

POJO类:

package com.wm.spring.IOC;public class Dept {    private int d_id ;    private String d_name ;    private String d_address ;    public int getD_id() {        return d_id;    }    public void setD_id(int d_id) {        this.d_id = d_id;    }    public String getD_name() {        return d_name;    }    public void setD_name(String d_name) {        this.d_name = d_name;    }    public String getD_address() {        return d_address;    }    public void setD_address(String d_address) {        this.d_address = d_address;    }    @Override    public String toString() {        return "Dept [d_id=" + d_id + ", d_name=" + d_name + ", d_address="                + d_address + "]";    }}

1、首先配置数据源

spring-jdbcTemplate.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:mvc="http://www.springframework.org/schema/mvc"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:aop="http://www.springframework.org/schema/aop"     xmlns:tx="http://www.springframework.org/schema/tx"    xsi:schemaLocation="http://www.springframework.org/schema/beans             http://www.springframework.org/schema/beans/spring-beans-4.0.xsd             http://www.springframework.org/schema/mvc             http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd             http://www.springframework.org/schema/context             http://www.springframework.org/schema/context/spring-context-4.0.xsd             http://www.springframework.org/schema/aop             http://www.springframework.org/schema/aop/spring-aop-4.0.xsd             http://www.springframework.org/schema/tx             http://www.springframework.org/schema/tx/spring-tx-4.0.xsd ">    <!-- 自动扫描 -->    <context:component-scan base-package="com.wm.spring.Jdbc"></context:component-scan>    <!-- 导入外部配置文件 -->    <context:property-placeholder location="classpath:jdbc.properties" />    <!-- c3p0  数据源 -->    <bean id="dataSource"     class="com.mchange.v2.c3p0.ComboPooledDataSource">        <property name="driverClass" value="${jdbc.driverClassName}" />        <property name="jdbcUrl" value="${jdbc.url}" />        <property name="user" value="${jdbc.username}" />        <property name="password" value="${jdbc.password}" />        <property name="maxPoolSize" value="${c3p0.pool.size.max}"></property>        <property name="minPoolSize" value="${c3p0.pool.size.min}"></property>        <property name="initialPoolSize" value="${c3p0.pool.size.ini}"></property>      </bean>    <!-- spring jdbcTemplate -->    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="dataSource" />    </bean></beans>            

用的C3P0数据连接池


jdbc.properties

jdbc.driverClassName = oracle.jdbc.OracleDriverjdbc.url = jdbc:oracle:thin:@10.5.1.50:1521:cddevjdbc.username = base_55demojdbc.password = crm_12345c3p0.pool.size.max=20c3p0.pool.size.min=5c3p0.pool.size.ini=3

一些jdbc的数据库的配置及连接池的配置参数


2、DAO使用jdbcTemplate的一些模板方法

DAO

DeptDAO.java类:

package com.wm.spring.Jdbc.DAO;import java.util.ArrayList;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.stereotype.Repository;import com.wm.spring.IOC.Dept;@Repository // 注册dao beanpublic class DeptDAO {    @Autowired    private JdbcTemplate jdbcTemplate ; // 这里的模板bean是配置在XML中的    public void insert(){        String sql = "insert into demo_dept(d_id,d_name,d_address) values(?,?,?)";        jdbcTemplate.update(sql, 19,"家宽","成都");    }    public void update(){        String sql = "update demo_dept set d_address = ? where d_id = ?";        jdbcTemplate.update(sql, "北京", 8);    }    public void delete(){        String sql = "delete from demo_dept where d_id = ?";        jdbcTemplate.update(sql, 6);    }    // 查询所有结果 以对象形式保存    public void query(){        String sql = "select * from demo_dept";        RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class);        List<Dept> query = jdbcTemplate.query(sql, rowMapper);        for (Dept dept : query) {            System.out.println(dept);        }    }    // 查询 以对象形式保存    public void queryDept(){        String sql = "select * from demo_dept where d_id = ?";        // 一个映射关系   结果《--》对象        RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class);        Dept dept = jdbcTemplate.queryForObject(sql, rowMapper, 19);        System.out.println(dept);    }    // 批量 插入,执行更新操作    public void batchUpdate(){        String sql = "insert into demo_dept values(?,?,?)";        List<Object[]> batchArgs = new ArrayList<>();        batchArgs.add(new Object[]{13,"个人","北京"});        batchArgs.add(new Object[]{14,"集团","成都"});        batchArgs.add(new Object[]{15,"互联网","上海"});        jdbcTemplate.batchUpdate(sql, batchArgs);    }}

JdbcTemplate主要提供下列方法:

  1、execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;

  2、update方法及batchUpdate方法:
  update方法用于执行新增、修改、删除等更新语句;
  batchUpdate方法用于执行批处理相关语句;

  3、query方法及queryForXXX方法:用于执行查询相关语句;

用RowMapper<T>接口,可以实现查询对象或者对象数组。如:
public void queryDept(){        String sql = "select * from demo_mawei_dept where d_id = ?";        // 接口的实现类 有很多,可以根据实际情况去选择        RowMapper<Dept> rowMapper = new BeanPropertyRowMapper<>(Dept.class);        Dept dept = jdbcTemplate.queryForObject(sql, rowMapper, 19);        System.out.println(dept);    }

3、service层

DeptSV.java类:

package com.wm.spring.Jdbc.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.wm.spring.Jdbc.DAO.DeptDAO;@Servicepublic class DeptSV {    @Autowired    private DeptDAO dao; //注解自动匹配    public void insert(){        dao.insert();        System.out.println("插入成功!");    }    public void update(){        dao.update();        System.out.println("修改成功!");    }    public void delete(){        dao.delete();        System.out.println("删除成功!");    }    public void query(){        dao.query();        System.out.println("查询成功!");    }    public void queryDept(){        dao.queryDept();        System.out.println("查询 部门 成功!");    }    public void batchUpdate(){        dao.batchUpdate();        System.out.println("批量 更新 成功!");    }}

4、测试类:

JDBCTemplateTest.java类:

package com.wm.spring.TEST;import java.sql.SQLException;import javax.sql.DataSource;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.wm.spring.Jdbc.service.DeptSV;public class JDBCTemplateTest {    private ApplicationContext ac ;    @Before    public void init(){        ac = new ClassPathXmlApplicationContext("spring-jdbcTemplate.xml");    }    @Test  // 测试数据源 连接    public void testDataSource() throws SQLException{        DataSource ds = ac.getBean(DataSource.class);        System.out.println(ds.getConnection());    }    @Test    public void testUpdate(){        DeptSV sv = ac.getBean(DeptSV.class);        sv.insert();        sv.update();        sv.delete();    }    @Test    public void testQuery(){        DeptSV sv = ac.getBean(DeptSV.class);        sv.query();        sv.queryDept();    }    @Test    public void testBatchUpdate(){        DeptSV sv = ac.getBean(DeptSV.class);        sv.batchUpdate();    }}

总而言之,Spring JDBC 中的 JdbcTemplate模板类,对SQL操作比较简单、易用。 但是缺点就是 不能 级联查询(这方面,hibernate框架实现的比较好)。


除了使用JdbcTemplate作为Dao层的成员变量方式外,还有一种方式实现jdbc模板方法。

继承JdbcDaoSupport类

org.springframework.jdbc.core.support.JdbcDaoSupport

这里写图片描述


DeptJdbcTemplateDAO.java 对应的代码:

package com.wm.spring.Jdbc.DAO;import org.springframework.jdbc.core.support.JdbcDaoSupport;// 继承 JdbcDaoSupport 实现 spring jdbc的模板方式public class DeptJdbcTemplateDAO extends JdbcDaoSupport{    public void insert(){        String sql = "insert into demo_mawei_dept(d_id,d_name,d_address) values(?,?,?)";        // 其中 this.getJdbcTemplate() 获取模板对象        this.getJdbcTemplate().update(sql, 10,"能力开放平台","成都");    }}

使用这种方式时,不能够对DAO注解,否则会报错的,只能在XML中配置bean的方式。

<bean id="deptJdbcTemplateDAO" class="com.wm.spring.Jdbc.DAO.DeptJdbcTemplateDAO">        <property name="dataSource" ref="dataSource" /></bean> 

并且要配置成员:dataSource 或者 jdbcTemplate,两者之一即可。
配置了才能获取到 this.getJdbcTemplate() 模板对象。

如果非要对DAO进行注解配置,则要实现对 数据源dataSource 或者jdbcTemplate进行setter方法。

package com.wm.spring.Jdbc.DAO;import javax.sql.DataSource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.support.JdbcDaoSupport;import org.springframework.stereotype.Repository;@Repository// 继承 JdbcDaoSupport 实现 spring jdbc的模板方式public class DeptJdbcTemplateDAO extends JdbcDaoSupport{    @Autowired  // 对数据源设值 并且 方法名不能是 setDataSource()    public void setDataSource1(DataSource dataSource){        setDataSource(dataSource);    }    public void insert(){        String sql = "insert into demo_mawei_dept(d_id,d_name,d_address) values(?,?,?)";        // 其中 this.getJdbcTemplate() 获取模板对象        this.getJdbcTemplate().update(sql, 20,"能力开放平台","成都");    }}

因为父类已经有此方法setDataSource了,并且方法类型为final,不可重写。

这几种方式都可以,但是最常用的还是第一种方式:把JdbcTemplate作为DAO的成员变量来实现模板方式。

0 0
原创粉丝点击