上几个章节我们探讨了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.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模板的简单使用。

这篇笔记就到这里了,可能写的不好,但是每个字,每行代码都是博主自己敲的,自己运行测试过,没有复制别人的代码,欢迎转载!

本篇文章方便博主学习查阅使用,也供他人参考,如有错误欢迎指正!

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

  1. 12 Spring框架 SpringDAO的事务管理

    上一节我们说过Spring对DAO的两个支持分为两个知识点,一个是jdbc模板,另一个是事务管理. 事务是数据库中的概念,但是在一般情况下我们需要将事务提到业务层次,这样能够使得业务具有事务的特性,来 ...

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

    简介: JdbcTemplate开发dao层程序     由Spring框架给我们提供,Spring提供的很多操作数据源(关系型数据库,二维表格模型,有明确的行和列(mysql/orcal等) 非关系 ...

  3. 使用spring框架的JdbcTemplate实现对Oracle数据库的简单操作实例

    最近实现了一个小功能,针对Oracle数据库两张关联表进行查询和修改,因为比较简单,所以选择了spring框架里的JdbcTemplate.JdbcTemplate算是老古董了,是当年spring为了 ...

  4. 解析Spring第四天(Spring中的事物、Spring框架来管理模板类)

    JDBC模板技术: Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 template 模板 都是Spring框架提供XxxTemplate 提供了JDBC模板,Sp ...

  5. Spring框架中 配置c3p0连接池 完成对数据库的访问

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

  6. Spring框架的第三天

    ## Spring框架的第三天 ## ---------- **课程回顾:Spring框架第二天** 1. IOC的注解方式 * @Value * @Resource(name="" ...

  7. Spring框架的JDBC模板技术概述

    1. Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 2. 提供了JDBC模板,Spring框架提供的 * JdbcTemplate类 3. Spring框架可以整 ...

  8. Spring框架中 配置c3p0连接池

    开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...

  9. Spring框架的JDBC模板技术和事物

    Spring框架的JDBC模板技术         技术分析之Spring框架的JDBC模板技术概述  1. Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单     ...

随机推荐

  1. Ant Design Pro快速入门

    在上一篇文章中,我们介绍了如何构建一个Ant Design Pro的环境. 同时讲解了如何启动服务并查看前端页面功能. 在本文中,我们将简单讲解如何在Ant Design Pro框架下实现自己的业务功 ...

  2. 简单解决Ubuntu修改locale的问题

      本文针对的问题是“Ubuntu 安装中文语言包”“Ubuntu Server中文问题”,“Ubuntu更改语言环境”,“Ubuntu locale的设定”,“cannot change local ...

  3. 【转】msxml 操作xml

    转自http://blog.csdn.net/dai_jing/article/details/8393392,原始出处不详. 1.简介 在.NET平台,微软为C#或托管C++程序员提供了丰富的类库, ...

  4. spring-redis SortedSet类型成员的过期时间处理

    redis默认是只支持简单key的过期处理的,像SortedSet类型,也是针对整个set的过期处理,不支持对set的某个成员的过期处理: 为了解决这个问题,做法如下: 1.存储key及值信息到red ...

  5. session和cookie的联系与区别

    区别: 1.cookie是存放在浏览器上的,session是存放在服务器上的: 2.cookie不安全,别人可以通过分析本地的cookie并进行cookie欺骗,session比cookie安全: 3 ...

  6. .net webapi项目跨域问题及解决方案

    问题: 1.项目完成,部署到不同的iis版本上,跨域访问有的通有的不通 解决办法: 1.将复杂请求改为简单请求 2.代码中去掉所有跨域设置,配置中添加或修改节点 <system.webServe ...

  7. Maven使用deploy上传jar包到远程库 以Oracle驱动为例

    一.首先要得到Oracle JDBC Driver 1.通过Oracle官方网站下载相应版本:http://www.oracle.com/technetwork/database/features/j ...

  8. 升级个人网站框架组件IBatisNet+Castle

    <sqlMap namespace="Sequence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance& ...

  9. 俄罗斯方块——shell

    #!/bin/bash # Tetris Game # xhchen<[email]xhchen@winbond.com.tw[/email]> #APP declaration APP_ ...

  10. Kotlin教程——史上最全面、最详细的学习教程,持续更新中....

    关于这个系列教程,我是从最基础的开发环境搭建到项目进阶到后面的项目开发这个过程来写的.我一直秉承从实际项目开发以及源码解析的角度去写好这个教程,并让从未接触过编程的朋友能学好kotlin这门语言.所以 ...