一、持久层技术

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

二、JdbcTemplate

开发步骤:

1. 导入相关的jar包

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>

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

  创建一个数据库test

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

  引入Maven 坐标:

<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>

  配置信息:

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

  引入Maven 坐标:

<!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>

  配置信息:

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

属性文件jdbc.properties

jdbc.driver = com.mysql.jdbc.Driver
jdbc.url = jdbc:mysql:///test
jdbc.user = root
jdbc.password = 123

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

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

  需要引入context的命名空间:

<?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 http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  配置如下:

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

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

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

3. 创建表

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

CREATE TABLE `member` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB

4. 编写实体类

public class Member {
private Integer id;
private String name;
private Integer age; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} @Override
public String toString() {
return "Member [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}

5. Dao层实现

5.1 继承JdbcDaoSupport

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

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

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport; import com.hao.entity.Member; public class MemberDao extends JdbcDaoSupport { /**
* 添加用户
*
* @param member
*/
public void add(Member member) {
String sql = "insert into member values(null,?,?)";
this.getJdbcTemplate().update(sql, member.getName(), member.getAge());
} /**
* 根据id更新用户名
*
* @param member
*/
public void updateById(Member member) {
String sql = "update member set name = ? where id =?";
this.getJdbcTemplate().update(sql, member.getName(), member.getId());
} /**
* 根据id删除用户
*
* @param member
*/
public void deleteById(Member member) {
String sql = "delete from member where id = ? ";
this.getJdbcTemplate().update(sql, member.getId());
} /**
* 查询用户总数
*
* @return
*/
public int findCount() {
String sql = "select count(*) from member";
// spring 3.2之后的版本不在支持queryInt(sql);
return this.getJdbcTemplate().queryForObject(sql, int.class);
} /**
* 通过id查询用户名
*
* @param id
* @return
*/
public String findNameById(int id) {
String sql = "select name from member where id = ?";
return this.getJdbcTemplate().queryForObject(sql, String.class, id);
} /**
* 根据id查询用户
*
* @param id
* @return
*/
public Member findById(int id) {
String sql = "select * from member where id = ?";
Member member = this.getJdbcTemplate().queryForObject(sql, new UserRowMapper(), id);
return member;
} /**
* 查询所有用户
*
* @return
*/
public List<Member> findAll() {
String sql = "select * from member";
return this.getJdbcTemplate().query(sql, new UserRowMapper()); } class UserRowMapper implements RowMapper<Member> {
/**
* rs:结果集. rowNum:行号
*/
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
Member member = new Member();
member.setId(rs.getInt("id"));
member.setName(rs.getString("name"));
return member;
} }
}

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

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

    <!-- 配置c3p0连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <!-- 此处直接注入数据源,因为Dao层中继承了JdbcDaoSupport这个类 -->
<bean id="memberDao" class="com.hao.dao.MemberDao">
<property name="dataSource" ref="dataSource"></property>
</bean>
5.2 直接注入JdbcTmplate

public class MemberDaoForNoExtend { //利用setter的方法注入jdbcTmplate
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
} /**
* 添加用户
*
* @param member
*/
public void add(Member member) {
String sql = "insert into member values(null,?,?)";
jdbcTemplate.update(sql, member.getName(), member.getAge());
} // 后面的代码省略... }

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

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

6. 测试

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

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.hao.dao.MemberDao;
import com.hao.entity.Member; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext1.xml")
public class JDBCTest1 { @Autowired
@Qualifier("memberDao")
private MemberDao memberDao; @Test
public void test1() {
Member member = new Member();
member.setName("小涛");
member.setAge(23);
memberDao.add(member);
} @Test
public void test2() {
int findCount = memberDao.findCount();
System.out.println(findCount);
} @Test
public void test3() {
Member member = new Member();
member.setId(12);
memberDao.deleteById(member);
} }

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class JDBCTest2 { @Autowired
@Qualifier("memberDaoForNoExtend")
private MemberDaoForNoExtend memberDaoForNoExtend; @Test
public void test1() {
Member member = new Member();
member.setName("小明");
member.setAge(23);
memberDaoForNoExtend.add(member);
}
}

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. solidity智能合约字节数最大值及缩减字节数

    智能合约最大字节数 在Solidity中,EIP 170将contract的最大大小限制为24 KB .因此,如果智能合约内容过多,会导致无法进行发布操作. 减少压缩字节数方法 方法及变量命名 在一定 ...

  2. 腾讯PCG(后台开发) 牛客网视频面试 一面

    腾讯视频面试 作为一个小渣渣记录一下,腾讯是我一直想进的公司,但其实准备的时间不是很长,也不是科班还是存在很大的劣势,记录一下找工作的经历. 首先说一下,这是我第一次视频面试,还是蛮紧张的.不过面试官 ...

  3. python3:面向对象(多态和继承、方法重载及模块)

    1.多态 同一个方法在不同的类中最终呈现出不同的效果,即为多态. class Triangle: def __init__(self,width,height): self.width = width ...

  4. gin+vue的前后端分离开源项目

    该项目是gin+vue的前后端分离项目,使用gorm访问MySQL,其中vue前端是使用vue-element-admin框架简单实现的: go后台使用jwt,对API接口进行权限控制.此外,Web页 ...

  5. spring-boot-plus项目配置文件(四)

    spring-boot-plus项目配置文件 配置文件说明 配置说明 项目中配置文件主要使用yml格式 配置文件位置:spring-boot-plus\src\main\resources\confi ...

  6. 为什么不建议在hbase中使用过多的列簇

    我们知道,hbase表可以设置一个至多个列簇(column families),但是为什么说越少的列簇越好呢? 官网原文: HBase currently does not do well with ...

  7. Redis 学习笔记(篇九):主从复制

    Redis 中,可以通过执行 savleof 命令或者设置 slaveof 选项,让一个服务器去复制另一个服务器,我们称被复制的服务器为主服务器,而对主服务器进行复制的服务器则被称为从服务器. Red ...

  8. egret项目发布为微信小程序

    1.更改游戏的缩放模式 因为微信小游戏不支持showAll,如果你使用了showAll模式.可以改成fixedWidth或fixedHeight.在index.html里修改,如下图 但这个又涉及到了 ...

  9. ngxin安装之yum安装

    nginx部署至yum安装 1. 配置nginx所需的YUM源 [root@nginx]# cat /etc/yum.repos.d/yum.repo [nginx-stable] name=ngin ...

  10. JVM调优实战:G1中的to-space exhausted问题

    最近刚刚将自己的一个应用从CMS升级到G1,在一天早上,刚刚到办公室坐下,就收到手机一阵报警,去查看了监控,发现机器的内存出现了一个90度的涨幅,如下图所示: 在查看GC日志后,发现那个时间点附近出现 ...