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

原文地址:https://www.cnblogs.com/chengshun/p/9778865.html

时间: 2024-11-02 10:56:33

11 Spring框架 SpringDAO的JdbcTemplate的相关文章

12 Spring框架 SpringDAO的事务管理

上一节我们说过Spring对DAO的两个支持分为两个知识点,一个是jdbc模板,另一个是事务管理. 事务是数据库中的概念,但是在一般情况下我们需要将事务提到业务层次,这样能够使得业务具有事务的特性,来管理业务. 例如:在银行的转账系统中,张三转账给李四,需要完成从张三的账户上扣取指定金额并加到李四的账户上,这样一个过程需要具有原子性,即要成功都成功,要失败都失败.转账的过程即两个对账户更新,需要将事务提升到业务层次,使得两个操作具有原子性! 对以上的实现,Spring的API中有两个常用的接口我

Spring框架之使用JdbcTemplate开发Dao层程序

简介: JdbcTemplate开发dao层程序     由Spring框架给我们提供,Spring提供的很多操作数据源(关系型数据库,二维表格模型,有明确的行和列(mysql/orcal等) 非关系型数据库(redis.mongodb)NoSQL)消息列(activeMq,jms)的小工具 JdbcTemplate操作关系数据库 RedisTemplate操作redis JmsTtemplate操作消息队列 JdbcTemplate类 使用方法和QueryRunner基本一致. 构造方法传递数

6.11 spring框架

spring框架: springmvc框架  只做三件事 1.过去页面传递给服务器的数据 2.根据获取的页面数据,调用业务方法,处理具体业务 3.根据业务的返回结果做相应的跳转工作 springmvc 框架  也只做三件事 1.获取页面的数据(springmvc帮你做了) 2.调用具体的业务操作(程序员只需要关注具体的业务实现) 3.根据业务的结果做跳转(springmvc帮你做了) mybatis框架:持久层框架 1.过去连接 2.写sql语句 3.构建PreparedStatement对象

Spring框架第三天

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

Spring框架针对dao层的jdbcTemplate操作crud之delete删除数据库操作 Spring相关Jar包下载

首先,找齐Spring框架中IoC功能.aop功能.JdbcTemplate功能所需的jar包,当前13个Jar包 1.Spring压缩包中的四个核心JAR包,实现IoC控制反转的根据xml配置文件或注解生成对象 beans .context.core 和expression 下载地址: https://pan.baidu.com/s/1qXLHzAW 2.以及日志jar包,以便查看相关执行细节 commons-logging 和log4j 下载地址: https://pan.baidu.com

SSH框架中Spring框架搭建的初步理解(一)

接手基于SSH框架的web项目已经一个月有余了.早有听说javaweb三大框架,第一次接触,先来说下感受. 我感觉SSH框架最明显的优点有如下: 采用MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现. 通过配置文件,就可以掌握整个系统各个部分之间的关系. 通过AOP,可以实现事务管理和日志管理. 其中Spring框架能使你通过最简单可行的方法来解决问题,这是非常高效的.但是它的搭建也略微复杂,尤其是对于我这样的新手来说,所以开此篇记录一下SPring框架的搭建: 创建web项目,导入SS

Spring框架总结(一)

名词解释: 框架就是组件的集合.比如:Struts.Spring.Hibernate就是组件的集合 组件就是常用的功能包封装成工具类. 常用组件: Dom4j/Xpath.DBUtils.C3p0.BeanUtils.log4j 框架就是组件的集合.比如:Struts.Spring.Hibernate就是组件的集合 泛型:进行类型检查,较少类型转化,自己定义一个可以为任意类型的类,jdk1.5之后产生 快捷键使用Ctril + Shift + R 查看当前项目中的类Ctril + Shift +

Spring 框架的架包分析、功能作用、优点,及jar架包简介

Spring 框架的架包详解    Spring的作用     Spring的优势 由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关jar的作用.关系.这篇文章总结一下spring框架的相关知识. 一.spirng的简介(高手可以跳过) Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Sprin

Spring框架的重要问题

这篇文章总结了一些关于Spring框架的重要问题,这些问题都是你在面试或笔试过程中可能会被问到的. 目录 Spring概述 依赖注入 Spring Beans Spring注解 Spring的对象访问 Spring面向切面编程 Spring MVC框架 Spring概述 1.什么是Spring? Spring是一个开源的Java EE开发框架.Spring框架的核心功能可以应用在任何Java应用程序中,但对Java EE平台上的Web应用程序有更好的扩展性.Spring框架的目标是使得Java