一、数据访问
- 数据库访问,JDBC
- 事务管理
- ORM整合
1.DAO
- Data Access Object ,即数据访问相关接口
2. ORM
- Object Relation Mapping,即对象关系映射
二、为什么使用Spring JDBC
1、以往的情况下,如使用原始的JDBC访问数据库,一般都要经过以下几个步骤
- 装载驱动
- 建立数据库连接
- 执行SQL语句
- 处理执行结果
- 清理环境
但是一般来说,我们需要关心的内容只有
- 连接参数
- 执行SQL语句
- 处理执行结果
其他的次要内容,我们并不是很需要关心,而Spring JDBC 就是为了减少这部分的工作量而产生的,简而言之,Spring JDBC 可以帮我们解决了一些我们不是很关心的内容,我们只需要关心我们的业务代码实现就好了。
三、Spring JDBC 的 DataSource 相关知识
一般来说,DataSource的建立一般包含以下几个内容:
- 驱动名称
- 连接地址
- 用户名
- 密码
而DataSource一般对于程序而言,只有一个方法是其存在的目的,那就是 getConnection ,即获取数据库连接。

三、JdbcTemplate
- 封装了很多内容,如获取连接,执行SQL,异常处理,关闭连接等。
- 具体内容可以查看官方文档介绍。
四、一个例子
Tips. 以下内容的参考均可查看官方文档查找
1. 创建一个maven项目
2. 修改 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.lazyfennec</groupId>
<artifactId>HelloSpringJDBC</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.18</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
3. 创建数据库配置文件 db.properties (resources 目录下)
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/cloud_study?serverTimezone=GMT
jdbc.username=####(请替换成自己的账号)
jdbc.password=####(请替换成自己的密码)
4. 创建application-context.xml (resources 目录下)
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 需要添加包扫描, 注意替换成需要扫描包名,这里我的是 cn.lazyfennec -->
<context:component-scan base-package="cn.lazyfennec"/>
<!-- 数据源配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="db.properties"/>
</beans>
5. 创建JdbcTemplateDao.java
package cn.lazyfennec;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class JdbcTemplateDao {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void createTable() {
jdbcTemplate.execute(
"create table jdbc_tmp_user (id integer, first_name varchar(64), last_name varchar(64))"
);
}
}
6. 创建程序执行类HelloSpringJDBC.java,然后执行文件
package cn.lazyfennec;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloSpringJDBC {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
JdbcTemplateDao dao = context.getBean("jdbcTemplateDao", JdbcTemplateDao.class);
dao.createTable();
((ConfigurableApplicationContext) context).close();
}
}
7. 查看数据库可以看到已经创建成功了表 jdbc_tmp_user
mysql> show tables;
+-----------------------+
| Tables_in_cloud_study |
+-----------------------+
| course |
| jdbc_tmp_user | // 这个是新创建的表
| teacher |
| user |
| usercourse |
+-----------------------+
五、额外知识
在使用JdbcTemplate的时候可以使用 " ? "占位,具体一个例子如下:
this.jdbcTemplate.update("insert into user values (1, ?, ?)", "Lei", 'Li');
六、NamedParameterJdbcTemplate

七、SqlParameterSource

八、异常处理
对于触发的异常,Spring JDBC 会抛出DataAccessException 异常,其下又有很多具体的异常继承了DataAccessException,程序可以借助不同的异常类型判断具体触发该异常的问题是什么。
- [点击查看官方API文档] (https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/dao/class-use/DataAccessException.html)

网友评论