上几个章节我们探讨了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. Tuning 05 Sizing other SGA Structure

    Redo Log Buffer Content The Oracle server processes copy redo entries from the user’s memory space t ...

  2. iframe宽高百分百显示

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 数组有没有length()这个方法?String有没有length()这个方法?

    数组有没有length()这个方法?String有没有length()这个方法? 解答:数组没有length()方法 它有length属性 String有length()方法.

  4. 数据库I/O:CMP、Hibernate

    ★什么是“Persistence” 用过VMWare的朋友大概都知道当一个guest OS正在运行的时候点击“Suspend”将虚拟OS挂起,它会把整个虚拟内存的内容保存到磁盘上,譬如你为虚拟OS分配 ...

  5. 【BZOJ】3403: [Usaco2009 Open]Cow Line 直线上的牛(模拟)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3404 裸的双端队列.. #include <cstdio> #include <c ...

  6. npm install 不自动生成 package-lock.json文件

    package-lock.json这个文件的作用就不详细说明了 有需要的可以参考 :https://www.cnblogs.com/cangqinglang/p/8336754.html 网上都说 n ...

  7. [LAMP]安装-Debian

    sudo apt-get install build-essential sudo apt-get install mysql-server sudo apt-get install apache2 ...

  8. plsql数组、表和对象

    --数组DECLARE TYPE test_plsql_varray IS VARRAY(100) OF VARCHAR2(20); temp_varray1 test_PLSQL_VARRAY := ...

  9. oralce 术语

    §2.1 术语 l 数据库块(BLOCK) ORACLE 数据库中的最小存储和处理单位,包含块本身的头信息数据或PL/SQL代码. ORACLE 块的大小是可以在安装时选择“自定义安装”来指定,也可以 ...

  10. 主流数据文件类型(.dat/.txt/.json/.csv)导入到python

    手写很累,复制的同学请点赞犒劳下在下哦 ^_^ 一.对于.CSV类型的数据 它们的数据导入都很简单 且看下面一顿操作: 我平时一般是读取整个文件,直接这样就可以了: import pandas as ...