本文整理SpringJDBC的基础使用部分内容,在上版的基础上进行了略微修改。

云笔记项目数据库部分采用的是Spring-MyBatis,前面学过了JDBC,SpringJDBC,Mybatis和Spring-MyBatis,有必要重新复习一下各个数据库连接的使用方法,理解差异点后再开始项目环境配置,磨刀不误砍柴工。

Spring JDBC是什么

是Spring框架对JDBC的封装,简化对JDBC操作

Spring JDBC编程步骤

step1 导包

spring-webmvc,spring-jdbc,ojdbc,dbcp,junit等。

在pom.xml中进行如下配置

 <dependencies>
<!-- 导入spring-webmvc的jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.3.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.3.RELEASE</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.3.RELEASE</version>
<classifier>javadoc</classifier>
</dependency>
<!-- 导入junit测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<classifier>javadoc</classifier>
</dependency> <!-- 导入数据库包 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency> <!-- 针对mysql的导包 -->
<dependency>
<groupId>org.wisdom-framework</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34_1</version>
</dependency> <!-- 针对spring JDBC导包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.3.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.3.RELEASE</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.3.RELEASE</version>
<classifier>javadoc</classifier>
</dependency>
</dependencies>
step2 添加Spring JDBC配置文件,主要有两步: 1.读取配置文件,初始化连接池: 类似于以前的工具类DBUtils,先读取properties属性内容,然后初始化连接池BasicDataSource,设置数据库连接驱动,url,用户名和密码等,还可以配置其他参数,如最大连接数maxactive或者等待时间maxwait。 2.将连接池注入到SpringJDBCTemplate里,初始化SpringJDBCTemplate,后面就可以被使用了 <bean //此部分内容省略>
<!-- 读取properties属性文件 -->
<util:properties id="db" location="classpath:config.properties">
</util:properties>
<!-- 配置连接池,可以参考DBUtil的方法,这里采用spring创建连接池-->
<!-- destroy-method方法作用是:当spring容器关闭后,会将连接释放回到连接池,避免资源浪费 -->
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="#{db.driver}"/>
<property name="url" value="#{db.url}" />
<property name="username" value="#{db.user}" />
<property name="password" value="#{db.pwd}" /
</bean> <!-- 配置JDBCTemplate -->
<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 说明JdbcTemplate里有dataSource属性,有setDataSource方法,将连接池注入进去 -->
<!-- 查看JdbcTemplate源码发现,连接池是通过构造器方式注入的 -->
<property name="dataSource" ref="ds"></property>
</bean> <!-- 配置组件扫描 -->
<context:component-scan base-package="DAO"></context:component-scan>

可以对比下DBUtil里的方法,也是读取properties属性文件,然后初始化BasicDataSource,然后写出建立连接和关闭连接的静态方法供使用,在SpringJDBC下,会使用依赖注入的方式,帮忙初始化连接池,这是Spring的特点,降低耦合度。

package Day03;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties; import org.apache.commons.dbcp.BasicDataSource; import Day01.DBUtilByDBCPInMac; public class DBUtil {
//数据库连接池
private static BasicDataSource ds;
//为不同线程管理连接
private static ThreadLocal<Connection> tl;
//不需要实例,只需要调用静态方法
static {
try {
//创建properties
Properties prop=new Properties();
//获取文件输入流
InputStream is=DBUtilByDBCPInMac.class.getClassLoader().getResourceAsStream("day01/config.properties");
//加载文件输入流
prop.load(is);
is.close();
//读取配置信息
//初始化连接池
ds=new BasicDataSource();
//设置驱动(Class.forName())
ds.setDriverClassName(prop.getProperty("driver"));
//设置url
ds.setUrl(prop.getProperty("url"));
//设置数据库用户名
ds.setUsername(prop.getProperty("user"));
//设置数据库密码
ds.setPassword(prop.getProperty("psw"));
//设置初始连接数
ds.setInitialSize(Integer.parseInt(prop.getProperty("initsize")));
//设置最大连接数
ds.setMaxActive(Integer.parseInt(prop.getProperty("maxactive")));
//设置等待时间
ds.setMaxWait(Integer.parseInt(prop.getProperty("maxwait")));
//设置最小空闲数
ds.setMinIdle(Integer.parseInt(prop.getProperty("minidle")));
//设置最大连接数
ds.setMaxIdle(Integer.parseInt(prop.getProperty("maxidle"))); //初始化线程本地
tl=new ThreadLocal<Connection>(); }catch(Exception e) {
e.printStackTrace();
}
}
/**
* 使用连接池获取连接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
Connection conn=ds.getConnection();
tl.set(conn);
return conn;
}
/**
* 关闭数据库连接
*/
public static void closeConnection() {
try {
Connection conn=tl.get();
if(conn!=null) {
//恢复连接为自动提交事务
conn.setAutoCommit(true);
//关闭了连接
conn.close();
//但是连接池是不关闭连接的,为什么这里可以关闭?
//因为这里关闭的只是连接池下连接的一个子类,关闭子类不影响连接池的连接
//而是将连接归还
tl.remove();
}
}catch(Exception e) {
e.printStackTrace();
} } }

step3 配置JDBC Template,生成JDBC模板

JDBCTemplate把一些重复性的代码,比如获取连接关闭连接异常处理都写好了,只需要调用该对象的方法就可以很方便的访问数据库。

step4 调用JDBCTemplate的方法来进行数据库操作,通常将JDBCTemplate注入到DAO,采用依赖注入的package DAO

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List; import javax.annotation.Resource; import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository; import Entity.Employee; /**
* Spring JDBC的使用
*
*/
@Repository("employeeDAO")
public class EmployeeDAO {
//依赖注入jdbcTemplate
@Resource(name="jt")//也可以用@Autowired和@Qualifier("jt")组合注解
private JdbcTemplate jt;
//把一个员工插入到数据库
public void save(Employee e) {
//只需要一条语句,完成自动创建连接,执行sql,关闭连接
String sql ="INSERT INTO T_TABLE VALUES(2,?,?)";
Object[] args= {e.getName(),e.getAge()};//元素的位置,跟上述sql一致
jt.update(sql,args);
}
/**
* 查询所有的员工
* @return
*/
//查询所有员工的方法
public List<Employee> findAll(){
String sql="SELECT * FROM T_TABLE";
return jt.query(sql, new EmpRowMapper()); }
/**
* 匿名内部类,这个类只能被当前类引用
* @author
*
*/
class EmpRowMapper implements RowMapper<Employee>{
/**
* 告诉JDBCTemplate,如何将结果集转换成一个实体对象
* rowNum:正在被处理的记录的下标,从0开始,为啥它好像在方法中就没用到过?
*/
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee e=new Employee();
e.setId(rs.getInt("ID"));
e.setName(rs.getString("NAME"));
e.setAge(rs.getInt("age"));
return e;
} }
/**
* 使用SpringJDBCTemplate进行查询
* @param id
* @return
*/
public Employee findById(int id) {
String sql="SELECT * FROM T_TABLE WHERE ID=?";
Employee emp=null;
try {
Object[] object= {id};
emp=jt.queryForObject(sql, object, new EmpRowMapper());
}catch(EmptyResultDataAccessException e) {
//空结果数据访问异常:没有数据查询到时会抛出此异常
e.printStackTrace();
return null;
}
return emp;
}
/**
* SpringJDBC修改更新的方法
* @param emp
*/
public void modify(Employee emp) {
String sql="UPDATE T_TABLE SET NAME=?,AGE=? WHERE ID=?";
Object[] args= {emp.getName(),emp.getAge(),emp.getId()};
jt.update(sql, args);
}
/**
* SpringJDBC删除的方法
* @param id
*/
public void delete(int id) {
String sql="DELETE FROM T_TABLE WHERE ID=?";
Object[] args= {id};
jt.update(sql, args);
} }

(5)使用junit包进行测试数据库操作,SpringJDBC底层还是调用了PreparedStatement,参数绑定在数据对象数组里

package Test;

import java.util.List;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import DAO.EmployeeDAO;
import Entity.Employee; public class testCase {
private EmployeeDAO dao;
/**
* @before注解修饰的作用是在其他测试方法运行之前会执行
*/
@Before
public void init() {
String config="spring-jdbc.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(config);
dao=ac.getBean("employeeDAO",EmployeeDAO.class);
} /**
* 测试springJDBCTemplate
*/
@Test
public void test() {
Employee e=new Employee();
e.setName("duanyu");e.setAge(20);
dao.save(e);
}
/**
* 测试查询方法
*/
@Test
public void test1() {
List<Employee> list=dao.findAll();
System.out.println(list); }
/**
* 根据ID查询的测试
*/
@Test
public void test2() {
Employee emp=dao.findById(2);
System.out.println(emp); }
/**
* 更新ID为1的员工信息,UPDATE
*/
@Test
public void test3() {
//先查到一个
Employee employee=dao.findById(2);
//对信息进行修改
employee.setAge(employee.getAge()+10);
dao.modify(employee);
Employee newEmployee=dao.findById(2);
System.out.println(newEmployee); }
/**
* 删除id为1的员工,方法测试
*/
@Test
public void test4() {
dao.delete(2);
} }

总结

SpringJDBC相比JDBC,降低了耦合度,并且实现自动连接和关闭数据库连接,要方便不少。

SpringJDBC数据库的基本使用的更多相关文章

  1. Spring小节

    Spring的总结 Spring的核心: 1. Spring的两大核心: 1. IOC: 控制反转,将创建(实例化)对象的权利交给Spring容器去进行管理. 2. AOP: 面向切面编程(将切面织入 ...

  2. JSP应用开发 -------- 电纸书(未完待续)

    http://www.educity.cn/jiaocheng/j9415.html JSP程序员常用的技术   第1章 JSP及其相关技术导航 [本章专家知识导学] JSP是一种编程语言,也是一种动 ...

  3. springJDBC01 利用springJDBC操作数据库

    1 什么是springJDBC spring通过抽象JDBC访问并一致的API来简化JDBC编程的工作量.我们只需要声明SQL.调用合适的SpringJDBC框架API.处理结果集即可.事务由Spri ...

  4. Spring-JDBC表情符号不能存入数据库

    ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4; JDBC解决方案: //params List<Object> param ...

  5. springboot使用之一:连接生产数据库,添加连接池

    项目中,难免遇到连接数据库的情形,目前来说springboot连接mybatis有两种,我这边使用的是mybatis官方提供XML方式的整合. 后面,对项目进行完善,引入了连接池,PageHelper ...

  6. Spring Data JPA 的配置文件 已经数据库的状态

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. SpringJDBC解析1-使用示例

    JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组 ...

  8. springJDBC学习笔记和实例

    前言:相对于Mybatis(ibatis),个人感觉springJDBC更灵活,主要实现类JdbcTemplate:它替我们完成了资源的创建以及释放工作,从而简化了我们对JDBC的使用.它还可以帮助我 ...

  9. Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...

    PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用 ...

随机推荐

  1. linux系统上面使用tab补全命令

    tab的模块脚本 [root@centos7 ~]# cat tab.py #!/usr/bin/python3.6 # python startup file import sys import r ...

  2. 《算法》第一章部分程序 part 1

    ▶ 书中第一章部分程序,加上自己补充的代码,包括若干种二分搜索,寻找图上连通分量数的两种算法 ● 代码,二分搜索 package package01; import java.util.Arrays; ...

  3. github中SSH公钥的生成与添加

    在终端中输入ssh-keygen -t rsa -C "133XXXXXX@qq.com" 按3个回车,密码为空这里一般不使用密钥. 最后得到了两个文件:id_rsa和id_rsa ...

  4. (1)Linux操作系统的安装

    1.安装Vmware Workstation 如何判断Vmware是否安装成功? 我的电脑控制面板 --> 网络和Internet --> 查看网络状态和任务 --> 更改适配器设置 ...

  5. 30. linux用su oracle 切换用户报“连接数据库报-bash-4.1$”处理方式

    直接在-bash-4.1$后面加上export PS1="[\u@\h \w]"即可,如下: [root@localhost usr]# su oracle-bash-4.1$ e ...

  6. HTML5 实现获取 gzip 压缩数据,并进行解压,同时解决汉字乱码,相关 pako.js

    1, 下载 pako.js => http://nodeca.github.io/pako/#Deflate.prototype.onData 2, 首先需要了解一下 XMLHttpReques ...

  7. JEECG 3.7.3 新春版本发布,企业级JAVA快速开发平台

    JEECG 3.7.3新春版本发布 -  微云快速开发平台 导读           ⊙精美Echart报表 ⊙二维码生成功能 ⊙Online接口改造采用JWT机制 ⊙智能菜单搜索 ⊙代码生成器模板优 ...

  8. 构建模式--Adapter模式(JAVA)

    适配器模式: 适配器就相当于我们的转接头,比如手机充电器插头(小米和华为的手机充电器不能共用,这时候就可以给华为的充电器按一个转接头,就可以给小米手机充电). 同理,当一个类(充电器 HuaweiCh ...

  9. OS位数,基本概念,结合iOS

    CPU位数,一般指CPU支持的指令集位数,32位CPU对应32位的指令集,64位的CPU对应64位的指令集,不过为了向下兼容,64位CPU也支持32位的指令集. 操作系统位数,一般指操作系统对应的指令 ...

  10. 跨域(四)——document.domain

    浏览器有一个合法的性质:一个页面可以设置document.domain为当前子域或比当前子域更高级的域.一般顶级就到了根域,如果设置为其他域,浏览器就会报权限错误. 利用这个性质,我们可以通过设置do ...