一、持久层技术

  1. Spring 中自带的 JdbcTemplate
  2. Hibernate
  3. Mybatis

二、JdbcTemplate

开发步骤:

1. 导入相关的jar包

  1. <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-jdbc</artifactId>
  5. <version>5.1.5.RELEASE</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  8. <dependency>
  9. <groupId>mysql</groupId>
  10. <artifactId>mysql-connector-java</artifactId>
  11. <version>8.0.13</version>
  12. </dependency>

2. 配置连接池(数据源)

  创建一个数据库test

  • Spring默认的连接池:
  1. <!-- 配置Spring默认的连接池 -->
  2. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  4. <property name="url" value="jdbc:mysql://localhost:3306/test"/>
  5. <property name="username" value="root"/>
  6. <property name="password" value="123"/>
  7. </bean>
  • DBCP连接池:

  引入Maven 坐标:

  1. <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
  2. <dependency>
  3. <groupId>commons-dbcp</groupId>
  4. <artifactId>commons-dbcp</artifactId>
  5. <version>1.4</version>
  6. </dependency>

  配置信息:

  1. <!-- 配置DBCP连接池 -->
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  4. <property name="url" value="jdbc:mysql:///test"/>
  5. <property name="username" value="root"/>
  6. <property name="password" value="123"/>
  7. </bean>
  • C3P0连接池:

  引入Maven 坐标:

  1. <!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
  2. <dependency>
  3. <groupId>c3p0</groupId>
  4. <artifactId>c3p0</artifactId>
  5. <version>0.9.1.2</version>
  6. </dependency>

  配置信息:

  1. <!-- 配置c3p0连接池 -->
  2. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  3. <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  4. <property name="jdbcUrl" value="jdbc:mysql:///test"/>
  5. <property name="user" value="root"/>
  6. <property name="password" value="123"/>
  7. </bean>
将参数设置到属性文件中:

属性文件jdbc.properties

  1. jdbc.driver = com.mysql.jdbc.Driver
  2. jdbc.url = jdbc:mysql:///test
  3. jdbc.user = root
  4. jdbc.password = 123

需要在applicationContext.xml 中使用属性文件配置的内容.

  • 第一种写法:
  1. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  2. <property name="location" value="classpath:jdbc.properties"></property>
  3. </bean>
  • 第二种写法:

  需要引入context的命名空间:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  配置如下:

  1. <context:property-placeholder location="classpath:jdbc.properties"/>

  上面数据源的配置,属性的值就可以用${}来取出properties配置文件中的值

  1. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  2. <property name="driverClass" value="${jdbc.driver}"/>
  3. <property name="jdbcUrl" value="${jdbc.url}"/>
  4. <property name="user" value="${jdbc.user}"/>
  5. <property name="password" value="${jdbc.password}"/>
  6. </bean>

3. 创建表

这里要注意的是创建的表名不能用users,

  1. CREATE TABLE `member` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(20) DEFAULT NULL,
  4. `age` int(11) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB

4. 编写实体类

  1. public class Member {
  2. private Integer id;
  3. private String name;
  4. private Integer age;
  5. public Integer getId() {
  6. return id;
  7. }
  8. public void setId(Integer id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public Integer getAge() {
  18. return age;
  19. }
  20. public void setAge(Integer age) {
  21. this.age = age;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Member [id=" + id + ", name=" + name + ", age=" + age + "]";
  26. }
  27. }

5. Dao层实现

5.1 继承JdbcDaoSupport

Spring框架中提供了对持久层技术支持的类: JdbcDaoSupport,这个类中依赖了JdbcTemplte模版而且自己实现了setter方法

  编写DAO的时候要继承该类,如下:

  1. import java.sql.ResultSet;
  2. import java.sql.SQLException;
  3. import java.util.List;
  4. import org.springframework.jdbc.core.RowMapper;
  5. import org.springframework.jdbc.core.support.JdbcDaoSupport;
  6. import com.hao.entity.Member;
  7. public class MemberDao extends JdbcDaoSupport {
  8. /**
  9. * 添加用户
  10. *
  11. * @param member
  12. */
  13. public void add(Member member) {
  14. String sql = "insert into member values(null,?,?)";
  15. this.getJdbcTemplate().update(sql, member.getName(), member.getAge());
  16. }
  17. /**
  18. * 根据id更新用户名
  19. *
  20. * @param member
  21. */
  22. public void updateById(Member member) {
  23. String sql = "update member set name = ? where id =?";
  24. this.getJdbcTemplate().update(sql, member.getName(), member.getId());
  25. }
  26. /**
  27. * 根据id删除用户
  28. *
  29. * @param member
  30. */
  31. public void deleteById(Member member) {
  32. String sql = "delete from member where id = ? ";
  33. this.getJdbcTemplate().update(sql, member.getId());
  34. }
  35. /**
  36. * 查询用户总数
  37. *
  38. * @return
  39. */
  40. public int findCount() {
  41. String sql = "select count(*) from member";
  42. // spring 3.2之后的版本不在支持queryInt(sql);
  43. return this.getJdbcTemplate().queryForObject(sql, int.class);
  44. }
  45. /**
  46. * 通过id查询用户名
  47. *
  48. * @param id
  49. * @return
  50. */
  51. public String findNameById(int id) {
  52. String sql = "select name from member where id = ?";
  53. return this.getJdbcTemplate().queryForObject(sql, String.class, id);
  54. }
  55. /**
  56. * 根据id查询用户
  57. *
  58. * @param id
  59. * @return
  60. */
  61. public Member findById(int id) {
  62. String sql = "select * from member where id = ?";
  63. Member member = this.getJdbcTemplate().queryForObject(sql, new UserRowMapper(), id);
  64. return member;
  65. }
  66. /**
  67. * 查询所有用户
  68. *
  69. * @return
  70. */
  71. public List<Member> findAll() {
  72. String sql = "select * from member";
  73. return this.getJdbcTemplate().query(sql, new UserRowMapper());
  74. }
  75. class UserRowMapper implements RowMapper<Member> {
  76. /**
  77. * rs:结果集. rowNum:行号
  78. */
  79. public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
  80. Member member = new Member();
  81. member.setId(rs.getInt("id"));
  82. member.setName(rs.getString("name"));
  83. return member;
  84. }
  85. }
  86. }

  在XML中的配置,此种方式不需要再XML中声明jdbcTemplate ,只需要在Dao层注入数据源即可如下:

  1. <context:property-placeholder location="classpath:jdbc.properties"/>
  2. <!-- 配置c3p0连接池 -->
  3. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  4. <property name="driverClass" value="${jdbc.driver}"/>
  5. <property name="jdbcUrl" value="${jdbc.url}"/>
  6. <property name="user" value="${jdbc.user}"/>
  7. <property name="password" value="${jdbc.password}"/>
  8. </bean>
  9. <!-- 此处直接注入数据源,因为Dao层中继承了JdbcDaoSupport这个类 -->
  10. <bean id="memberDao" class="com.hao.dao.MemberDao">
  11. <property name="dataSource" ref="dataSource"></property>
  12. </bean>
5.2 直接注入JdbcTmplate

  1. public class MemberDaoForNoExtend {
  2. //利用setter的方法注入jdbcTmplate
  3. private JdbcTemplate jdbcTemplate;
  4. public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  5. this.jdbcTemplate = jdbcTemplate;
  6. }
  7. /**
  8. * 添加用户
  9. *
  10. * @param member
  11. */
  12. public void add(Member member) {
  13. String sql = "insert into member values(null,?,?)";
  14. jdbcTemplate.update(sql, member.getName(), member.getAge());
  15. }
  16. // 后面的代码省略...
  17. }

  在XML中的配置,此种方式要在Dao层注入jdbcTemplate

  1. <!-- 定义jdbctemplate 需要注入数据源 -->
  2. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  3. <property name="dataSource" ref="dataSource"/>
  4. </bean>
  5. <!-- 定义Dao层类 需要注入jdbcTemplate-->
  6. <bean id="memberDao" class="com.hao.dao.MemberDao">
  7. <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  8. </bean>

6. 测试

  测试1 --> 5.1中的方式测试

  1. import org.junit.Test;
  2. import org.junit.runner.RunWith;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Qualifier;
  5. import org.springframework.test.context.ContextConfiguration;
  6. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  7. import com.hao.dao.MemberDao;
  8. import com.hao.entity.Member;
  9. @RunWith(SpringJUnit4ClassRunner.class)
  10. @ContextConfiguration("classpath:applicationContext1.xml")
  11. public class JDBCTest1 {
  12. @Autowired
  13. @Qualifier("memberDao")
  14. private MemberDao memberDao;
  15. @Test
  16. public void test1() {
  17. Member member = new Member();
  18. member.setName("小涛");
  19. member.setAge(23);
  20. memberDao.add(member);
  21. }
  22. @Test
  23. public void test2() {
  24. int findCount = memberDao.findCount();
  25. System.out.println(findCount);
  26. }
  27. @Test
  28. public void test3() {
  29. Member member = new Member();
  30. member.setId(12);
  31. memberDao.deleteById(member);
  32. }
  33. }

  测试2 --> 5.2中的方式测试

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration("classpath:applicationContext2.xml")
  3. public class JDBCTest2 {
  4. @Autowired
  5. @Qualifier("memberDaoForNoExtend")
  6. private MemberDaoForNoExtend memberDaoForNoExtend;
  7. @Test
  8. public void test1() {
  9. Member member = new Member();
  10. member.setName("小明");
  11. member.setAge(23);
  12. memberDaoForNoExtend.add(member);
  13. }
  14. }

JdbcTemplate 的CRUD(待整理)

  • 保存:update(String sql,Object... args)
  • 修改:update(String sql,Object... args)
  • 删除:update(String sql,Object... args)
  • 查询:
    • 简单查询:

      • queryForObject(String sql,Class clazz,Object... args);
    • 复杂查询:(返回对象,和对象集合)
      • queryForObjectString sql,RowMapper<T> rowMapper,Object... args);
      • query(String sql,RowMapper<T> rowMapper,Object... args);

三、Hibernate

org.springframework.orm.hibernate3.support.HibernateDaoSupport

四、MyBatis

org.springframework.orm.ibatis.support.SqlMapClientDaoSupport

【Spring】对持久层技术的整合的更多相关文章

  1. 对spring 对持久层的支持和数据库连接池的理解

    1.spring对持久层的支持在于,得到数据库连接之后操作上的封装,将操作简化了.也就是说以后操作sql语句就用XXXTemplate(就是一个工具类)对象了. 2.数据库连接池的作用只在于得到数据库 ...

  2. SpringBoot整合持久层技术--(三)Spring Data JPA

    简介: JPA(java Persistence API)和SpringData是两个范畴的概念.spring data jpa是spring公司下的spring data项目的一个模块. sprin ...

  3. Spring 5.x 、Spring Boot 2.x 、Spring Cloud 与常用技术栈整合

    项目 GitHub 地址:https://github.com/heibaiying/spring-samples-for-all 版本说明: Spring: 5.1.3.RELEASE Spring ...

  4. SpringBoot整合持久层技术--(一)JdbcTemplate

    简介: JdbcTemplate是Spring提供的一套JDBC模板框架,利用AOP技术解决直接使用JDBC带来的重复代码问题.它没有MyBatis使用那么灵活,但是却比直接使用JDBC方便得多.Sp ...

  5. 05_ssm基础(四)之Spring与持久层的整合

    30.31.spring对jdbc的支持jdbcTemplate 使用Spring的JDBC准备:  1):拷贝jar:       mysql-connector-java-5.1.11.jar:M ...

  6. SpringBoot整合持久层技术--(二)MyBatis

    简介: 原名iBatis,SpringBoot中使用MyBatis: pom.xml <dependency> <groupId>org.springframework.boo ...

  7. Spring Boot 整合Web 层技术(整合Servlet)

    1 整合Servlet 方式一1.1通过注解扫描完成Servlet 组件的注册      1.1.1创建Servlet /*** 整合Servlet 方式一*/@WebServlet(name = & ...

  8. SpringBoot整合持久层技术-创建项目

    新建项目 Pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  9. springboot整合持久层技术(mysql驱动问题)

    java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more tha ...

随机推荐

  1. c#将字符串转化为合理的文件名

    string name = System.Text.RegularExpressions.Regex.Replace(url, "[<>/\\|:\"?*]" ...

  2. 【Java例题】5.5 映射类的使用

    5.映射类的使用.使用HashMap保存英文-中文对照单词词典.单词词典可以增加和删除词汇.输入一个英文单词,翻译成中文并显示.输入一个中文单词,翻译成英文并显示. package chapter6; ...

  3. 【Java例题】6.1 进制转换

    1.进制转换.输入一个某种进制的整数,将其转换为其它进制的整数.说明:仅考虑十.二.八和十六进制. package chapter6; import java.util.*; public class ...

  4. .Net异步编程详解入门

    前言 今天周五,早上起床晚了.赶着挤公交上班.但是目前眼前有这么几件事情.刷牙洗脸.泡牛奶.煎蛋.在同步编程眼中.先刷牙洗脸,然后烧水泡牛奶.再煎蛋,最后喝牛奶吃蛋.毫无疑问,在时间紧促的当下.它完了 ...

  5. 2月11日 阿里巴巴Java开发手册 读后感

    该手册分为几个部分: 印象深刻的几点: (五)集合处理 2.[强制]ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException 异常:java. ...

  6. 从MySQL迁移到MariaDB(CentOS)

    MySQL是世界上最流行的开源关系数据库.原来 MariaDB 的设计初衷之一就是完全兼容 MySQL,包括 API 和客户端协议,使之能轻松成为 MySQL 的代替品.MariaDB 与 MySQL ...

  7. Java——反射:运行时的类信息

    RTTI的使用 如果不知道某个对象的确切类型,RTTI会告诉我们,但是有一个限制:这个类型在编译时必须已知,这样才能使用RTTI识别它,并利用这些信息做一些有用的事情.  2.什么情况下需要反射 假设 ...

  8. Vue 路由模块化配置

    博客地址:https://ainyi.com/77 企业运营后台页面很多,路由如若不区分模块化配置,所有路由挤在同一个文件将不好维护,所以路由的配置也要模块化 分享两个解决方案 -- Vue 路由配置 ...

  9. 阿里、网易和腾讯面试题 C/C++

    一.线程.锁 1.Posix Thread互斥锁 线程锁创建 a.静态创建 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; b.动态创建 pthr ...

  10. IDEA部署 java Web项目 常见配置

    前言 从eclipse上转到idea上,第一次使用idea部署web项目,真折磨人,写了一个 helloworld 5分钟,了解idea部署web项目5小时. 我使用的是idea 2019.1版本,其 ...