目录:
-
- [Spring JDBC](#Spring JDBC)
-
- [1.Spring JDBC的核心类 ( JdbcTemplate类 )](#1.Spring JDBC的核心类 ( JdbcTemplate类 ))
- [2.Srping JDBC 的配置](#2.Srping JDBC 的配置)
- 3.JdbcTemplate类的"常用方法"
-
- [execute( ):直接执行"sql语句",没有返回值](#execute( ):直接执行“sql语句”,没有返回值)
- [update( ) :"增删改",返回 "影响的行数"](#update( ) :“增删改”,返回 “影响的行数”)
- [query( ) : "查询",返回 "T类型 / List类型" 的结果](#query( ) : “查询”,返回 “T类型 / List类型” 的结果)
作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!
该文章参考学习教材 为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章
文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!
(侵权教材方可联系我,进行删除,如果雷同,纯属巧合)
Spring JDBC
Spring 的 JDBC模块 负责数据库资源管理 和错误处理 ,大大简化了 开发人员对数据库的操作 ,使得开发人员可以从烦琐的数据库操作中解脱出来 ,从而将更多的精力投入到编写业务逻辑中。
1.Spring JDBC的核心类 ( JdbcTemplate类 )
针对数据库的操作 ,Spring 框架 (Spring JDBC )提供了 JdbcTemplate类,该类是Spring框架数据抽象层 的基础,其他更高层次的抽象类却是构建于JdbcTemplate类之上。
JdbcTemplate 类是Spring JDBC 的核心类。
JdbcTemplate 的继承 / 实现 关系 为 :
抽象类 赋予JdbcTemplate属性 ,接口 赋予JdbcTemplate操作的方法,具体内容如下 :
一、
JdbcTemplate 继承 抽象类 JdbcAccessor 。JdbcAccessor 是 JdbcTemplate的直接父类 ,该类 (JdbcAccessor) 为子类 (JdbcTemplate) 提供了一些访问数据库时使用 的公共属性。① DataSource : 其主要功能是获取数据库连接 ,具体实现时 还可以引入对数据库连接 的缓
冲池 和分布式事务的支持 ,它可以作为访问数据库资源的标准接口。② SQLExceptionTranslator :
org.springframework.jdbc support.SQLExceptionTranslator 接口负责对 SQLException 进行转译工作 。通过必要的设置 或者 获取SQLExceptionTranslator中的方法 ,可以使 JdbcTemplate 在需要处理SQLException时,委托SQLExceptionTranslator 的实现类 来完成相关的转译工作。
二、
JdbcTemplate 实现了 JdbcOperations 接口。JdbcOperations接口定义 了在JdbcTemplate 类中可以使用的操作集合 ,包括 添加 、修改 、查询 和删除 等操作。
2.Srping JDBC 的配置
Spring JDBC模块 主要由 4个包 组成,分别是core (核心包)、dataSource (数据源包)、object (对象包) 和support (支持包)。
要 想实现 Spring JDBC功能,要进行Spring JDBC配置 :
① 配置 core (核心包) 中的 JdbcTemplate 类 。
② 配置 dataSource (数据源包) 中的 DriverManagerDataSource类(在 applicationContext.xml 中进行配置)
包名 说明 core包 (要配置JdbcTemplate 类) ① 包含了JDBC 的核心功能,包括 JdbcTemplate 类、SimpleJdbcInsert类 、SimpleJdbcCall类 以及 NamedParameterJdbcTemplate类 。 ② 定义JdbcTemplate 时,要将已经配置好的dataSource 注入到JdbcTemplate中。 dataSource包 (要配置dataSource 数据源 : DriverManagerDataSource类 ) ① 访问数据源 的实用工具类,它有多种数据源 的实现 ,可以在Java EE容器外部测试JDBC代码。 ② 在配置文件中配置dataSource 时其的类 为 :org.springframework.jdbc.datasource.DriverManagerDataSource ③ 配置 dataSource 的4个属性,分别为 : 数据库驱动、url、用户名、 密码 ps : 配置dataSource的例子在下面。 object包 以面向对象的方式访问数据库 ,它允许执行查询 并将返回结果 作为业务对象 ,可以在数据表的列 和 业务对象的属性 之间映射查询结果。 support包 包含了core 和object包 的支持类 ,例如,提供异常转换功能的SQLException类。
dataSource 的4个属性 :
( 在以下的dataSource 的4个属性 在applicationContext.xml中完成配置 )
属性名 含义 driverClassName 所使用 的驱动名词 ,对应驱动JAR包 中工的Driver类。 如 :<property name ="driverClassName " value ="com.mysql.jdbc.Driver"/> url 数据源所在地址。 如 :<property name ="url " value="jdbc:mysql://localhost:3306/spring"/> username 访问数据库的用户名。 如: <property name="username" value="root"/> password 访问数据库的密码。 如 : <property name="password" value="root"/> Srping JDBC 的配置 的 "配置模板 " / 例子 :
Spring JDBC要添 JAR包 : (配置JAR包)
① Spring的核心JAR包②****Spring JDBC开发所需JAR :mysql数据库的驱动JAR包 (mysql-connector-java.jar) 、Srpring的JDBC的JAR包 (spring-jdbc.jar) 、Spring事务处理的JAR包(spring-tx.jar)。
获取spring框架基本核心jar包
获取Spring JDBC 开发需要的jar包
jar包 / maven( 依赖 ) 下载( 可自行按需下载JAR )ps :
如有报错 或版本问题 ,可看情况判断是否需要更换JAR版本。
applicationContext.xml
xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- ①该配置文件中可添加、配置管理Bean ②可配置Spring AOP (AspectJ等)的配置信息 ③当然也可以配置Spring JDBC等的配置信息 --> <!-- 1.配置数据源 (与Spring JDBC中的dataSource模块有关) --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 数据库驱动 --> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <!-- url --> <property name="url" value="jdbc:mysql://localhost:3306/spring"/> <!-- 用户名 --> <property name="username" value="root"/> <!-- 密码 --> <property name="password" value="root"/> </bean> <!-- 2.配置JDBC模板 / 配置JdbcTemplate (与Spring JDBC中的core模块有关) --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- 默认必须使用数据源 --> <property name="dataSource" ref="dataSource"/> </bean> </beans>
在上述applicationContext.xml 中,定义了 3个Bean,分别是 dataSoure 、jdbcTemplate 和 需要注入类 的Bean。
其中 dataSource 对应 的org.springframework.jdbc.datasource. DriverManagerDataSource 类用于对数据源进行配置 。
jdbcTemplate 对应的org.springframework.jdbc.core. JdbcTemplate 类用于定义了JdbcTemplate的相关配置。dataSource 的4个属性 ,需要根据数据库类型 或者机器配置 的不同设置相应的属性值。例如果数据库类型不同 ,需要更改驱动名称 ;如果数据库不在本地 ,则需要将地址中的 localhost 替换成相应的主机IP ;如果修改过MySQL数据库的端口号 (默认为3306 ),则需要加上修改后的端口号,如果没修改,则端口号可以省略。
3.JdbcTemplate类的"常用方法"
在 JdbcTemplate类 中,提供了大量的更新 和查询数据库 的方法,我们就是使用这些方法 来操作数据库的。
execute( ):直接执行"sql语句",没有返回值
execute (String sql) 方法 : 执行 指定的 SQL 语句。该方法是==没有返回值==的。
例子如 :
第一步、建好项目、导入所需依赖、打开doc窗口,指定确定存在 的数据库 (如: use spring)
此时spring 这个 "数据库 " 中并没有 "数据表"。
第二步、配置applicationContext.xml :
xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 该配置文件中可以配置Spring JDBC等的配置信息 --> <!-- 1.配置数据源 (与Spring JDBC中的dataSource模块有关) --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 数据库驱动 --> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <!-- url --> <property name="url" value="jdbc:mysql://localhost:3306/spring"/> <!-- 用户名 --> <property name="username" value="root"/> <!-- 密码 --> <property name="password" value="root"/> </bean> <!-- 2.配置JDBC模板 / 配置JdbcTemplate (与Spring JDBC中的core模块有关) --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- 默认必须使用数据源 --> <property name="dataSource" ref="dataSource"/> </bean> </beans>
第三步、创建 JdbcTemplateTest测试类 ,测试 JdbcTemplate类中的 execute( )方法的使用情况 :
javapackage com.myh.jdbc; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; public class JdbcTemplateTest { //在该测试类中使用 execute()方法建数据库中的"表" public static void main(String[] args) { //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/myh/jdbc/applicationContext.xml"); //从IOC容器中获得 JdbcTemplate 实例 JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate"); String sql = "create table student(" + "id int primary key auto_increment," + "username varchar(50)," + "hobby varchar(50))"; /* execute()方法作用 : 执行sql语句 */ jdbcTemplate.execute(sql); System.out.println("创建student表成功!"); } }
运行效果图 :
doc窗口 ,输入 "show tables"命令,判断execute( )方法是否成功执行 :控制台输入 如下 :
由两个效果图可知,程序 使用execute( String sql )方法 执行的sql 语句成功创建student表。
update( ) :"增删改",返回 "影响的行数"
- update()方法 : 可以完成 插入、更新 和 删除数据 的操作,有返回值 : 返回影响的行数。
在JdbcTemplate类中 ,提供了一系列的
update( )方法,其常用方法如下所示 :
方法 说明 int update( String sql ) 该方法是最简单 的update 方法重载形式 ,它直接执行 传入的SQL语句 ,并 返回受影响 的行数。 int update( PreparedStatementCreator psc ) 该方法执行 从PreparedStatementCreator返回的语句 ,然后返回受影响的行数。 int update( String sql,PreparedStatementSetter ) 该方法通过PreparedStatementSetter 设置SQL语句中参数,并返回受影响的行数。 int update( String sql,Object...args ) ★★★★★ ( 常用 ) 该方法 使用Object...设置SQL语句中 的参数 ,要求参数不能为NULL ,并 返回受影响的行数。 (将设置的参数填充到占位符?中) update( ) 方法例子 :进行"增删改 "操作。
Student.java
javapackage com.myh.jdbc; public class Student { private Integer id; //学生id private String username; //用户名 private String hobby; /* getter/setter方法 */ public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } //重写toString()方法 @Override public String toString() { return "Student{" + "id=" + id + ", username='" + username + '\'' + ", hobby='" + hobby + '\'' + '}'; } }
StudentDao.java (接口) :
javapackage com.myh.jdbc; public interface StudentDao { //在该接口中定义"添加"、"更新"、"删除"的Student的方法 //添加 public int addStudent(Student student); //更新 public int updateStudent(Student student); //删除 public int deleteStudent(int id); }
StudentDaoImpl.java (实现类)
javapackage com.myh.jdbc; import org.springframework.jdbc.core.JdbcTemplate; public class StudentDaoImpl implements StudentDao{ //该类为StudentDao接口的"实现类" //声明JdbcTemplate属性 private JdbcTemplate jdbcTemplate; //为JdbcTemplate属性 添加setter方法 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } /** 添加 */ @Override public int addStudent(Student student) { /* sql语句,此处的占位符?通过下面的Object参数进行填充 */ String sql = "insert into student(username,hobby) values(?,?)"; //定义数组来存储sql语句中的参数 (将Student类中存储的数组放进数组中) Object[] obj = new Object[]{student.getUsername(),student.getHobby()}; //通过 update(String sql)执行操作,返回值为: sql语句影响的行数 int num = this.jdbcTemplate.update(sql,obj); //返回sql语句影响的行数 return num; } /** * 更新 */ @Override public int updateStudent(Student student) { String sql = "update student set username = ?,hobby = ? where id = ?"; //定义要用在update()方法中的参数 Object[] params = new Object[]{student.getUsername(), student.getHobby(), student.getId()}; int num = this.jdbcTemplate.update(sql, params); return num; } /** * 删除 */ @Override public int deleteStudent(int id) { String sql = "delete from student where id = ?"; //执行删除操作,返回影响的行数 int num = this.jdbcTemplate.update(sql, id); return num; } }
applicationContext.xml
xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 该配置文件中可以配置Spring JDBC等的配置信息 --> <!-- 1.配置数据源 (与Spring JDBC中的dataSource模块有关) --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 数据库驱动 --> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <!-- url --> <property name="url" value="jdbc:mysql://localhost:3306/spring"/> <!-- 用户名 --> <property name="username" value="root"/> <!-- 密码 --> <property name="password" value="root"/> </bean> <!-- 2.配置JDBC模板 / 配置JdbcTemplate (与Spring JDBC中的core模块有关) --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- 默认必须使用数据源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- 定义一个id 为"studentDao" 的Bean,该Bean用于将"jdbcTemplate"类注入到"studentDao"这个实例中,因为实例中要用到该对象 --> <bean id="studentDao" class="com.myh.jdbc.StudentDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> </beans>
JdbcTemplateTest.java (测试类)
javapackage com.myh.jdbc; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; public class JdbcTemplateTest { //在该测试类中使用 execute()方法建数据库中的"表" /** * 进行Junit测试 */ @Test public void JunitTest() { //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/myh/jdbc/applicationContext.xml"); //从IOC容器中获得 JdbcTemplate 实例 JdbcTemplate jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate"); /* execute()方法作用 : 执行sql语句 */ jdbcTemplate.execute("select * from tb_user"); System.out.println("数据查询成功!"); } /** * 添加 */ @Test //junit4单元测试 public void addStudentTest() { //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/myh/jdbc/applicationContext.xml"); //获取StudentDao实例 StudentDao studentDao = (StudentDao) applicationContext.getBean("studentDao"); //创建Student对象,往其中添加数据 Student student = new Student(); student.setUsername("张三"); student.setHobby("打篮球"); //添加 int num = studentDao.addStudent(student); if (num > 0) { System.out.println("成功插入了" + num + "条数据!"); } else { System.out.println("插入操作执行失败!"); } } /** * 更新(修改) */ @Test public void updateStudentTest() { //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/myh/jdbc/applicationContext.xml"); //获取StudentDao实例 StudentDao studentDao = (StudentDao) applicationContext.getBean("studentDao"); //创建Student对象,往其中添加数据 Student student = new Student(); student.setId(1); student.setUsername("小明"); student.setHobby("踢足球"); //更新(修改) int num = studentDao.updateStudent(student); if (num > 0) { System.out.println("成功修改了" + num + "条数据!"); } else { System.out.println("修改操作执行失败!"); } } /** * 删除 */ @Test public void deleteStudentTest() { //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/myh/jdbc/applicationContext.xml"); //获取StudentDao实例 StudentDao studentDao = (StudentDao) applicationContext.getBean("studentDao"); //删除 int num = studentDao.deleteStudent(1); if (num > 0) { System.out.println("成功删除了" + num + "条数据!"); } else { System.out.println("删除操作执行失败!"); } } }
query( ) : "查询",返回 "T类型 / List类型" 的结果
query( ) : 对数据库中的数据 进行查询操作。
JdbcTemplate 类中还提供了大量的query( )方法 来处理各种对数据库表 的查询操作。
方法 说明 List<T> query ( String sql , RowMapper rowMapper ) ★★★★★ ( 常用 ) 执行String类型参数提供 的SQL语句 ,并通过 RowMapper 返回 一个List类型 的 结果。 如 : 可用于查询所有数据。(★★★) List<T> query ( String sql , PearesSatementSetter pss , RowMapper rowMapper) 根据String 类型参数提供 的SQL语句 创建 PreparedStatement对象 ,通过RowMapper 将结果 / 结果集 返回到List中。 List<T> query ( String sql , Objecr[ ] args , RowMapper rowMapper ) 使用Obiect[ ]的值 来设置SQL语句中的参数值,采用 RowMapper回调方法 可以直接返回List类型 的数值。 T queryForObject ( String sql , RowMapper rowMapper , Object... args) ★★★★★ ( 常用 ) 将 args参数绑定 到SQL语句中,并通过 RowMapper 返回一个Object类型 的 单行记录。 如 : 可用于"根据指定id " 查询数据。(★★★) List<T> queryForList ( String sql , Object[ ] args , class<T> ) 该方法可以 返回多行数据 的结果 , 但必须是返回列表,elementType参数 返回的是 List元素类型。 query( ) 方法例子 :返回 "T类型 / List类型 " 的结果 :
Student.java
javapackage com.myh.jdbc; public class Student { private Integer id; //学生id private String username; //用户名 private String hobby; /* getter/setter方法 */ public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } //重写toString()方法 @Override public String toString() { return "Student{" + "id=" + id + ", username='" + username + '\'' + ", hobby='" + hobby + '\'' + '}'; } }
StudentDao.java (接口)
javapackage com.myh.jdbc; import java.util.List; public interface StudentDao { //根据id查询 public Student findStudentById(int id); //查询所有 public List<Student> findAllStudent(); }
StudentDaoImpl.java (实现类)
javapackage com.myh.jdbc; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import java.util.List; public class StudentDaoImpl implements StudentDao{ //该类为StudentDao接口的"实现类" /** * 根据id查询 : * 用queryForObject ( String sql , RowMapper rowMapper , Object...args) 这个方法来进行"根据id"查询数据 * 该方法 : 将args参数绑定到sql语句中,且通过 RowMapper 返回一个Object类型的"单行记录"。 */ @Override public Student findStudentById(int id) { //sql语句 String sql = "select * from student where id = ?"; //创建一个BeanPropertyRowMapper对象 RowMapper<Student> rowMapper = new BeanPropertyRowMapper<Student>(Student.class); //调用query()方法查询数据库中的数据 Student student = this.jdbcTemplate.queryForObject(sql, rowMapper, id); //返回值为一个 return student; } /** * 查询所有 */ @Override public List<Student> findAllStudent() { //sql语句 String sql = "select * from student"; //创建 BeanPropertyRowMapper 对象 RowMapper<Student> rowMapper = new BeanPropertyRowMapper<Student>(Student.class); List<Student> students = this.jdbcTemplate.query(sql, rowMapper); //返回值为list集合,该集合中存储一个或多个Student类数据 return students; } }
applicationContext.xml
xml<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 该配置文件中可以配置Spring JDBC等的配置信息 --> <!-- 1.配置数据源 (与Spring JDBC中的dataSource模块有关) --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <!-- 数据库驱动 --> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <!-- url --> <property name="url" value="jdbc:mysql://localhost:3306/spring"/> <!-- 用户名 --> <property name="username" value="root"/> <!-- 密码 --> <property name="password" value="root"/> </bean> <!-- 2.配置JDBC模板 / 配置JdbcTemplate (与Spring JDBC中的core模块有关) --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- 默认必须使用数据源 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- 定义一个id 为"studentDao" 的Bean,该Bean用于将"jdbcTemplate"类注入到"studentDao"这个实例中,因为实例中要用到该对象 --> <bean id="studentDao" class="com.myh.jdbc.StudentDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> </beans>
JdbcTemplateTest.java (测试类)
javapackage com.myh.jdbc; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.JdbcTemplate; import java.util.Iterator; import java.util.List; public class JdbcTemplateTest { /** * 根据id来查询数据 */ @Test public void findStudentByIdTest() { //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/myh/jdbc/applicationContext.xml"); //获取StudentDao实例 StudentDao studentDao = (StudentDao) applicationContext.getBean("studentDao"); //执行 findStudentById()方法 Student student = studentDao.findStudentById(1); System.out.println(student); } /** * 查询所有数据 */ @Test public void findAllStudentTest() { //加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/myh/jdbc/applicationContext.xml"); //获取StudentDao实例 StudentDao studentDao = (StudentDao) applicationContext.getBean("studentDao"); //执行 findAllStudent()方法 List<Student> allStudent = studentDao.findAllStudent(); //使用"集合"的"迭代器"遍历集合中数据 Iterator<Student> iterator = allStudent.iterator(); while (iterator.hasNext()) { Student next = iterator.next(); System.out.println(next); } } }