开发中的dao层,是对数据库操作以及相关问题的处理。spring DAO模块,是spring框架对dao层操作的支持与优化。
一、jdbc基础
在没有spring之前,jdbc承担着对数据库操作的重任。主要包括以下几个部分:
1、驱动引入
JDBC是对外开放的接口,数据库提供商实现了这些接口,这些接口的组合就是驱动。数据库有好多种,例如MySQL、Oracle等,需要注册不同的驱动来操作对应的数据库,所以首先要将驱动引入项目。
2、注册驱动
引入驱动之后,加载注册驱动,让应用程序知道,我们将访问什么数据库。
3、创建连接
数据库和应用程序是分隔开来的,数据库可能存放在远程其他服务中,所以注册驱动之后,我们要把应用程序跟数据库连接到一起。
4、执行操作
连接上之后就是处理我们常用操作:增、删、改、查等。
5、返回结果
数据库执行完增、删、改、查操作结束之后,返回给程序一个结果,成功、失败或者查询的数据。
6、释放资源
最后,所有操作都执行完毕,需要关闭资源,以免造成资源的浪费。
二、jdbc实例
1、引入mysql依赖:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.12</version> </dependency>
2、执行逻辑:
// 注册驱动 DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); // 连接数据库 Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test-project?useUnicode=true" + "&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false", "root", "123456"); // 通过Statement对象执行操作 Statement stmt = conn.createStatement(); String sql = "select * from test_genterator limit 10"; // 返回结果 ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { System.out.println("姓名:" + rs.getString("name") + " 类型:" + rs.getInt("type") + " 描述:" + rs.getDouble("test_desc") + " 备注:" + rs.getDouble("remark")); }
3、测试结果:
姓名:1 类型:1 描述:1.0 备注:1.0
姓名:2 类型:2 描述:2.0 备注:2.0
姓名:3 类型:3 描述:3.0 备注:3.0
姓名:4 类型:4 描述:4.0 备注:4.0
姓名:5 类型:5 描述:5.0 备注:5.0
三、spring对jdbc的支持
jdbc每次执行,都要经历加载驱动、连接数据库、执行操作、释放资源等繁重的重复操作。对此,spring对jdbc进一步优化与封装。把加载驱动、连接数据库与释放资源等重复操作提取出来,做成公共的独立模块,使用时只需调用即可,方便简洁,这便是jdbcTemplete。
1、引入依赖:
// jdbc <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>2.7.10</version> </dependency> //数据源 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
2、执行逻辑:
// 设置数据源 DruidDataSource build = DruidDataSourceBuilder.create().build(); build.setDriver(new com.mysql.cj.jdbc.Driver()); build.setUrl("jdbc:mysql://127.0.0.1:3306/test-project?useUnicode=true" + "&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false"); build.setUsername("root"); build.setPassword("123456"); // 创建JdbcTemplate对象 JdbcTemplate jdbcTemplate = new JdbcTemplate(build); // 执行查询,并返回结果 String sql = "select * from test_genterator limit 10"; List<TestGenterator> testGenterators = jdbcTemplate.query(sql, new BeanPropertyRowMapper<TestGenterator>(TestGenterator.class)); for (TestGenterator testGenterator : testGenterators){ System.out.println("姓名:" + testGenterator.getName() + " 类型:" + testGenterator.getType() + " 描述:" + testGenterator.getTest_desc() + " 备注:" + testGenterator.getRemark());
3、测试结果:
姓名:1 类型:1 描述:1 备注:1
姓名:2 类型:2 描述:2 备注:2
姓名:3 类型:3 描述:3 备注:3
姓名:4 类型:4 描述:4 备注:4
姓名:5 类型:5 描述:5 备注:5
4、结论:
spring DAO引入JdbcTemplate,让我们只需要创建一个代有数据源的JdbcTemplate对象,就可以执行crub,代码清晰简洁。
JdbcTemplate实现JdbcOperations接口里面的众多对数据库操作的方法,例如query、updated等等。
JdbcTemplate继承JdbcAccessor抽象类,获取数据源dataSource。