【年薪百万之IT界大神成长之路五】springMVC + ? 持久化框架的选择(Mybatis 附源码)

 

[catalog]

 
  1. ORM 与数据持久化
  2. 常用的持久层框架有哪些
  3. 持久层框架对比
  4. mybatis 连接数据库
  5.【每日一面】持久层框架中的一级缓存,二级缓存和延迟加载
 
 

1. ORM与数据持久化

 

  • 什么是ORM

ORM(Object Relation Mapping)对象关系映射用于在关系型数据库和业务实体对象之间作一个映射,把关系型数据库封装成业务实体对象,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

  • 什么是数据持久化

数据持久化(data persistence)狭义的持久化仅仅指把域对象永久保存到数据库中;广义的持久化还包括和数据库相关的各种操作(增删改查等)。持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。可以减少访问数据库的次数,增加应用程序执行速度,提高代码重用性,更改数据库字段只需修改持久化层即可。通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合

2. 常用的持久层框架有哪些

JPA

JPA(Java Persistence API)Java 持久化接口,支持大数据集、事务、并发等容器级事务。支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。JPA定义了独特的JPQL(Java Persistence Query Language),支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。从功能上来说,JPA就是Hibernate功能的一个子集。Hibernate 从3.2开始,就开始兼容JPA。JPA是一套ORM规范,Hibernate实现了JPA规范。

Hibernate

Hibernate(过冬,冬眠)它需要你创建一系列的持久化类,每个类的属性都可以简单的看做和一张数据库表的属性一一对应,当然也可以实现关系数据库的各种表件关联的对应。当我们需要相关操作是,不用再关注数据库表。我们不用再去一行行的查询数据库,只需要持久化类就可以完成增删改查的功能。使我们的软件开发真正面向对象,而不是面向混乱的代码。

Mybatis

Mybatis(篱笆墙)使用简单的 XML注解用于配置和原始映射,MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以对配置和原生Map使用简单的XML或标注,将接口和Java的POJOS(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。

JDBC

JDBC(Java Database Connectivity)Java数据库连接,JDBC API主要位于JDK中的 java.sql 包,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。它用于直接调用 SQL 命令,同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。

 

3. 持久层框架对比

 

ITGodJPAHibernateMybatisJDBC
数据库移植性JPQL语句与数据库无关,移植性好HQL语句与数据库无关,移植性好SQL语句依赖数据库,移植性不好SQL语句依赖数据库,移植性不好
缓存机制具体由供应商实现默认一级缓存,需要手动开启二级缓存默认一级缓存,需要手动开启二级缓存连接池实现,没有缓存
开发工总量只需关注对象的状态,隐藏执行细节只需关注对象的状态,隐藏执行细节需要维护结构映射和SQL语句需要频繁开启和关闭数据库连接
查询查询所有字段查询所有字段指定需要查询的字段自由度最高
日志具体由供应商实现自带需要配置Log4j需要配置Log4j
关注点业务逻辑业务逻辑SQL语句SQL语句
实体对象映射数据库表数据库表SQL查询结果——

 

4. mybatis连接数据库

 

在进行连接数据库之前,你需要有一个Maven-Web 项目!!!
 
创建数据库
对应实体类
实体类映射xml
mybatis配置xml
编写controller

 

  • 创建表 kekan_group (名字随意,仅供参考)

在这里插入图片描述

-- 建表
CREATE TABLE `kekan_group` (
  `ID` varchar(8) NOT NULL COMMENT '順番',
  `NAME` varchar(5) DEFAULT NULL COMMENT '名前',
  `NAME_KANA` varchar(5) DEFAULT NULL COMMENT '平仮名',
  `SEX` varchar(1) DEFAULT NULL COMMENT '性別',
  `BIRTHDAY` date DEFAULT NULL COMMENT '出生年月日',
  `VERSION` int NOT NULL DEFAULT (1) COMMENT 'バージョン番号',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 插入数据
insert into kekan_group values (20201101,'孫悟空','そんごくう','男','2020-11-01','1');
insert into kekan_group values (20201102,'布玛','ブルマ','女','2020-11-15','1');
insert into kekan_group values (20201103,'禿林','クリリン','男','2020-11-30','1');
  • 创建对应数据库的实体类

先打完红框部分,写好对应数据库字段的变量,注意访问权限要写成私有 private

在这里插入图片描述

点击类名 Alt+Shift+S,选择 Generate Getters and Setters 自动生成 get 和 set 方法。

在这里插入图片描述

  • java resources 下新建 mapping 文件夹并创建 KeKanGroupMapper.xml

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 为这个mapper指定一个唯一的namespace,习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的 -->
<mapper namespace="com.ITGodRoad.mapping.KeKanGroup">
	<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getKeKanGroup,id属性值必须是唯一的,不能够重复使用,parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型 
		resultType="com.ITGodRoad.entity.KeKanGroup"就表示将查询结果封装成一个KeKanGroup类的对象 -->
	<select id="getKeKanGroup"
		resultType="com.ITGodRoad.entity.KeKanGroup">
		select * from kekan_group
	</select>
</mapper>
  • 添加 mybatis 依赖和 mysql 依赖,将下面的依赖信息复制到项目中的 pom.xml 的 dependencies 节点下。
<!-- mybatis核心包 -->
<dependency>
   	<groupId>org.mybatis</groupId>
   	<artifactId>mybatis</artifactId>
   	<version>3.5.6</version>
</dependency>
<!-- MySQL的JDBC驱动包 -->
<dependency>
   	<groupId>mysql</groupId>
   	<artifactId>mysql-connector-java</artifactId>
   	<version>8.0.22</version>
</dependency>
  • 在 Java Resources 根目录中创建 MyBatisConfig.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 引用db.properties配置文件 -->
	<properties resource="db.properties"></properties>
	<!-- 类型别名,默认引入com.ITGodRoad.entity下的所有类 -->
	<typeAliases>
		<package name="com.ITGodRoad.entity" />
	</typeAliases>
	<!-- development:开发模式 work:工作模式 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<!-- 配置数据库连接信息 -->
			<dataSource type="POOLED">
				<!-- value属性值引用db.properties配置文件中配置的值 -->
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 注册 KKMapper.xml 文件 -->
		<mapper resource="mapping/KeKanGroupMapper.xml" />
	</mappers>
</configuration>
  • 因为配置中依赖了 db.properties 文件,所以还要在 Java Resources 根目录中创建 db.properties 文件

1. Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdbc.Driver’. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary…

原因:使用较高版本的mysql-connector连接jar包导致
// 原驱动文件
driver=com.mysql.jdbc.Driver
// 更改为
driver=com.mysql.cj.jdbc.Driver

2. The server time zone value ‘���� (�W����)’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the ‘serverTimezone’ configuration property) to use a more specific time…

原因:服务器时区值无法识别,或表示多个时区
// 原url
url=jdbc:mysql://localhost:3306/it_god_road
// 后面拼接参数时区转化为UTC(世界标准时间)
url=jdbc:mysql://localhost:3306/it_god_road?serverTimezone=UTC

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/it_god_road?serverTimezone=UTC
username=root
password=root
  • 编写 KeKanGroupController

在这里插入图片描述

package com.ITGodRoad.controller;

import java.io.IOException;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.ITGodRoad.entity.KeKanGroup;

public class KeKanGroupController {

	public static void main(String[] args) throws IOException {

		// mybatis的配置文件
		String resource = "mybatisConfig.xml";
		// 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
		InputStream is = Resources.getResourceAsStream(resource);
		// 构建sqlSession的工厂
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
		// 使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
		// Reader reader = Resources.getResourceAsReader(resource);
		// 构建sqlSession的工厂
		// SqlSessionFactory sessionFactory = new
		// SqlSessionFactoryBuilder().build(reader);
		// 创建能执行映射文件中sql的sqlSession
		SqlSession session = sessionFactory.openSession();
		/**
		 * 映射sql的标识字符串,
		 * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
		 * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
		 */

		/* 根据——key查找 */
		String statement = "com.ITGodRoad.mapping.KeKanGroup.getKeKanGroup";
		// 映射sql的标识字符串,getUser与映射文件中配置select标签id一致
		// 执行查询返回一个唯一user对象的sql
		List<KeKanGroup> kkg = session.selectList(statement);
		System.out.println(kkg.get(0).getName());

	}

}
  • 本地运行

在这里插入图片描述

  • 正确读取到数据库中的值 ,接下来就可以自己去写页面,开发前后端交互的程序web应用程序了!

在这里插入图片描述
 
 

【每日一面】

持久层框架中的一级缓存,二级缓存和延迟加载

一级缓存(SqlSession):也叫内置缓存,本地缓存。属于事务范围(线程级别)的缓存,当进行数据操作时,只要没有进行事务的提交操作,再次进行数据的操作不会进行数据库的操作,而是直接获取缓存中的数据。
一级缓存(SqlSession):也叫外置缓存,全局缓存。属于进程范围或集群范围的缓存,通常用来提高应用程序性能,二级缓存是跨SqlSession的可能会导致提取到“陈旧”数据,也会出现并发性的问题。基于EntityFactory进行缓存,一般用于经常被阅读但很少被修改的数据中。
延迟加载(SqlSession):也叫懒加载,需要用到数据时才进行加载,不需要用到数据时就不加载数据。在二级缓存里没有数据,则用代理模式去查找数据,如果返回null,则向数据库请求数据。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值