zoukankan      html  css  js  c++  java
  • 11 Spring框架 SpringDAO的JdbcTemplate

    上几个章节我们探讨了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属性文件:jdbc.properties
    **jdbc.properties**
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///test?useUnicode=true&amp;characterEncoding=utf8
    jdbc.username=root
    jdbc.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模板的简单使用。

     版权声明:本文为博主原创文章,如需转载请表明出处。 https://blog.csdn.net/qq_39266910/article/details/78814809

  • 相关阅读:
    HTML5和HTML4之间的区别
    HttpRequest信息内容介绍
    Spring Web MVC处理请求的流程
    游戏中的路径动画设计与实现
    Python基本数据类型
    Python基本数据类型
    perl .= 操作符
    出差二、三事——北漂18年(25)
    perl 卸载Oracle数据库
    perl 卸载mysql数据库
  • 原文地址:https://www.cnblogs.com/chengshun/p/9778865.html
Copyright © 2011-2022 走看看