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

  • 相关阅读:
    软件测试人员的年终绩效考核怎么应对
    收藏
    顶踩组件 前后两版
    订阅组件
    hdu 1963 Investment 完全背包
    hdu 4939 Stupid Tower Defense 动态规划
    hdu 4405 Aeroplane chess 动态规划
    cf 414B Mashmokh and ACM 动态规划
    BUPT 202 Chocolate Machine 动态规划
    hdu 3853 LOOPS 动态规划
  • 原文地址:https://www.cnblogs.com/chengshun/p/9778865.html
Copyright © 2011-2022 走看看