11 Spring框架 SpringDAO的JdbcTemplate

来源:互联网 发布:2017淘宝直播怎么申请 编辑:程序博客网 时间:2024/06/08 11:00

上几个章节我们探讨了Spring的IoC和AOP,这是Spring的重点,但是Spring对jdbc的支持同样我们也不能忘记,毕竟我们还要通过Spring来管理DAO框架(例如Hibernate或者MyBatis等)。
Spring对DAO的支持分为大体可以分为以下两个点:

  1. Spring与jdbc模板
  2. Spring对事务的管理

本节我们就来看看第一个知识点:
Spring为我们提供了一套jdbc模板,对JDBC进行了一些简单的封装。
想要使用jdbc模板我们首先需要搭建环境:

  • 引入jar包
    我们需要两个jar包:
    ①Spring的JDBCjar包
    ②Spring的事务jar包

我涂鸦的两个
(就是我黄色涂鸦两个jar包)
如果我们想要在后面使用c3p0数据库连接池的话我们还需要导入c3p0的jar包:
这里写图片描述

如果想要使用dbcp连接池的话,我们需要导入dbcp的jar包:
这里写图片描述
(涂鸦的两个)

然后就要搭建使用的环境了:
这里写图片描述
以上的图片是我的测试目录结构,我们再来详细的看一下具体的代码:

首先是我们业务代码的接口,里面定义了增删改查七个方法:

public interface StudentService {    void add(Student student);    void remove(Student student);    void modify(Student student);    List <String>findAllStudentNames();    String findStudentNameById(int id);    List<Student> findAllStudents();    Student findStudentById(int id);}

接着是上面接口的实现类:

public class StudentServiceImpl implements StudentService {    //我们定义了一个StudentDao的引用,但是我们并没有创建对象,由Spring注入    private StudentDao studentdao;     //StudentDao是由Spring注入的,所以我们需要设置setter方法    @Override    public void setStudentdao(StudentDao studentdao) {        this.studentdao = studentdao;    }    @Override    public void add(Student student) {        studentdao.insert(student);    }    @Override    public void remove(Student student) {        studentdao.delete(student);    }    @Override    public void modify(Student student) {        studentdao.update(student);    }    @Override    public List<String> findAllStudentNames() {        return studentdao.selectAllStudentNames();    }    @Override    public String findStudentNameById(int id) {        return studentdao.selectStudentNameById(id);    }    @Override    public List<Student> findAllStudents() {        return studentdao.selectAllStudents();    }    @Override    public Student findStudentById(int id) {        return studentdao.selectStudentsById(id);    }}

上面进行了一些业务操作,调用了我们封装好的DAO,同样我们先写一个DAO的接口:

public interface StudentDao {    void insert(Student student);    void delete(Student student);    void update(Student student);    List <String>selectAllStudentNames();    String selectStudentNameById(int id);    List<Student> selectAllStudents();    Student selectStudentsById(int id);}

接着是实现类:

//这个DAO实现类需要继承JdbcDaoSupport接口,来调用父类的//getJdbcTemplate()方法,获得JDBC模板//**这里的增删改都是用Update来操作**public class StudentDaoImpl extends JdbcDaoSupport implements StudentDao{//插入这里我们的动态参数跟在Update的后边//**jdbc模板是多例的,它的生命周期很短,是方法级的,所以每次使用都需要调用父类的方法获取!**    @Override    public void insert(Student student) {        String sql = "insert into student values(?,?,?)";        this.getJdbcTemplate().update(sql, null,student.getName(),student.getAge());    }    @Override    public void delete(Student student) {        String sql = "delete from student where id=?";        this.getJdbcTemplate().update(sql,student.getId());    }    @Override    public void update(Student student) {        String sql = "update student set name=?,age=? where id=?";        this.getJdbcTemplate().update(sql,student.getName(),student.getAge(),student.getId());    }    @Override    public List<String> selectAllStudentNames() {        String sql = "select name from student";        //这里使用queryForList查询所有name,参数要加String.class        return this.getJdbcTemplate().queryForList(sql,String.class);    }    @Override    public String selectStudentNameById(int id) {        String sql = "select name from student where id=?";        //这里使用queryForObject,查询单个的结果,不要忘了加String.class,和后面的动态参数        return this.getJdbcTemplate().queryForObject(sql, String.class,id);    }    @Override    public List<Student> selectAllStudents() {        //我们查询的是所有的学生,Spring无法解析,我们需要定义一个类来完成查询的结果集和对象之间的映射        String sql = "select * from student";        return this.getJdbcTemplate().query(sql, new StudentrowMapper());    }    @Override    public Student selectStudentsById(int id) {        String sql = "select * from student where id=?";        return (Student) this.getJdbcTemplate().queryForObject(sql,new StudentrowMapper(),id);    }}

最后是我们的配置文件:
这里需要注意一点:我在使用properties文件作为c3p0连接池的数据库链接参数的时候会出现乱码,在xml中填写数据库配置文件不会乱码!
在配置时分以下的几个步骤:

  1. 注册service业务bean
  2. 注册Dao bean
  3. 注册jdbcTemplate
  4. 注册数据源(这里提供了三种方法:Spring提供的连接池,c3p0连接池,dbcp连接池,根据需要自己选择)。
  5. 如果要外联数据库配置参数需要注册jdbc属性文件(分为两种方法,下面我都给出了示例(经测试c3p0会外联会乱码))。
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="        http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context         http://www.springframework.org/schema/context/spring-context.xsd">    <!-- 注册Spring内置数据源 -->    <!--  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>        <property name="url" value="jdbc:mysql:///test?useUnicode=true&amp;characterEncoding=utf8"/>        <property name="username" value="root"/>        <property name="password" value="123"/>    </bean> -->    <!-- 注册dbcp连接池 -->    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>        <property name="url" value="jdbc:mysql:///test?useUnicode=true&amp;characterEncoding=utf8"/>        <property name="username" value="root"/>        <property name="password" value="123"/>    </bean>      <!-- 注册c3p0数据源 -->    <!--  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">        <property name="driverClass" value="com.mysql.jdbc.Driver"/>        <property name="jdbcUrl" value="jdbc:mysql:///test?useUnicode=true&amp;characterEncoding=utf8"/>        <property name="user" value="root"/>        <property name="password" value="123"/>    </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.username}"/>        <property name="password" value="${jdbc.password}"/>    </bean> -->    <!-- 注册jdbc属性文件 -->   <!--  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">        <property name="location" value="classpath:jdbc.properties"/>    </bean> -->    <!-- 注册jdbc属性文件 -->    <!-- <context:property-placeholder location="classpath:jdbc.properties"/> -->    <!-- 注册jdbcTemplate -->    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="dataSource"></property>    </bean>    <!-- 注册studentDao -->    <bean id="studentDao" class="com.testSpring.Dao.StudentDaoImpl">        <property name="jdbcTemplate" ref="jdbcTemplate"></property>    </bean>    <!-- 注册studentService -->    <bean id="studentService" class="com.testSpring.Service.StudentServiceImpl">        <property name="studentdao" ref="studentDao"></property>    </bean></beans>
**jdbc.properties**jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql:///test?useUnicode=true&amp;characterEncoding=utf8jdbc.username=rootjdbc.password=123

//最后别忘了实体类public class Student {    private Integer id;    private String name;    private int age;    //省略了setter方法,getter方法,构造方法}

如果完成了以上的几个步骤我们就可以进行测试了!

public class Test01 {    private StudentService service;    @Before    public void before() {        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");        service = (StudentService)ac.getBean("studentService");    }    @Test    //插入    public void test01() {        service.add(new Student("中文",18));        System.out.println("Success");    }    //删除    @Test    public void test02() {        Student student = new Student();        student.setId(9);        service.remove(student);    }    //更改    @Test    public void test03() {        Student student = new Student("李小四",25);        student.setId(10);        service.modify(student);    }    //查询所有学生名字    @Test    public void test04() {        System.out.println(service.findAllStudentNames());    }    //查询指定id的学生名字    @Test    public void test05() {        System.out.println(service.findStudentNameById(11));    }    //查询所有学生    @Test    public void test06() {        System.out.println(service.findAllStudents());    }    //查询指定id的学生    @Test    public void test07() {        System.out.println(service.findStudentById(11));    }}

以上的测试全是在Junit4环境下进行测试!

这样我们就完成了对Spring提供的jdbc模板的简单使用。

这篇笔记就到这里了,可能写的不好,但是每个字,每行代码都是博主自己敲的,自己运行测试过,没有复制别人的代码,欢迎转载!
本篇文章方便博主学习查阅使用,也供他人参考,如有错误欢迎指正!

原创粉丝点击