文章目录
1.JDBC不足
JDBC作为Java操作数据库的模板,如果想要对数据库进行操作,必须使用JDBC,但是在使用JDBC进行数据库操作时,重复代码多,动态SQL构建繁琐,将查询结果转化为对象,相当麻烦,开发效率低。
基于JDBC开发效率相对低的情况,市面上各个组织,对JDBC进行封装,产生各种数据库操作层解决方案:
Hibernate 重量级的ORM框架
ibatis 轻量级ORM框架 与2010-06-16 改名 mybatis
Spring JPA
Mybatis plus
Spring JDBCTemplate
以上框架都是对JDBC的封装,处理Java操作数据库数据的问题。
2.为什么要学习框架
2.1.1 提高开发效率
在Java中,框架在一定程度就是对某些功能的封装,对外暴露统一操作API,可以简化开发难度,提高开发效率。
2.1.2 提高代码的可维护性
由于框架在一定程度上说,就是模板,所有基于某个框架进行开发的项目,肯定要遵循模板规则,那么在维护时,只需要了解模板规则即可。
2.1.3 可以提高代码的健壮性
市面上相对比较流行的框架,被大多人使用,出现的问题能够及时暴露,问题也能得到较快的修复。
3.Mybatis概述
3.1 简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
Mybtais是一个ORM框架,轻量级的ORM框架。相对于重量级的ORM框架Hibernate而言,mybatis是一个半自动框架,而Hibernate是一个全自动框架。并且,Hibernate提出跨"平台",Hinernate的跨平台是指Hinernate可以在多种数据库下进行操作,同一套代码支持多种数据库,HQL语句,Hibernate方言,对数据库操作进行翻译,根据不同的数据,将API翻译成不同的SQL,对数据进行操作,依赖ORM思想。
Mybatis是一个半自动的框架,早期Hibernate在流行时,开发者发现Hibernate虽然功能强大,但是由于如果想使用全自动功能,将Hibernate和数据库关心进行配置,配置很繁琐,其二,Hibernate对功能进行全方面的封装,将用户的操作,转化为SQL语句,然后进行数据库操作,整个转换过程是Hibernate,开发无法控制,如果要进行SQL语句优化是没法实现的。所以,在数据库压力逐渐增大的情况下,Hibernate框架性能问题就出现了。基于这样的情况,Mybatis框架应运而生,mybatis将SQL语句的定义控制权,完全交给了开发者,并且暴露一套API,对JDBC中:事务,参数,查询结果等进行配置处理。Mybatis也是基于ORM思想.
Mybatis(半自动化):还是需要书写sql
Hibernate(全自动化):不需要写sql就能操作数据库—>HQL
3.2 ORM
ORM : Object relation mapping
对象关系映射
将数据库信息和Java中实体类进行映射
users: 1 张三 20 User: id、uName、age
4.Mybatis入门使用
4.1 创建数据库和表
4.2 创建空项目
4.3 创建Maven的java项目
4.4 引入Mybatis相关jar包依赖
1、导入依赖
2、书写mybatis的主配置文:连接信息 mybatis.xml
3、书写存放sql语句的局部配置文件 xxx.xml(与dao层类的类名保持一致)
4、关联主配置与局部配置
5、启动mybatis,调用核心类测试
<dependencies>
<!--引入mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!--引入mysql的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
4.5 编写实体类User
package com.bjpowernode.domain;
import java.util.Date;
/**
* @项目 code-mybatis
* @描述 用户实体类
* @时间 2021-07-15 22:23
**/
public class User {
private Integer id;
private String name;
private Integer age;
private String sex;
private String address;
private Date birth;
public User(Integer id, String name, Integer age, String sex, String address, Date birth) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
this.birth = birth;
}
public User(String name, Integer age, String sex, String address, Date birth) {
this.name = name;
this.age = age;
this.sex = sex;
this.address = address;
this.birth = birth;
}
public User() {
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
", birth=" + birth +
'}';
}
}
4.6 编写映射文件UserMapper接口
package com.bjpowernode.mapper;
import com.bjpowernode.domain.User;
import java.util.Map;
public interface UserMapper {
/**
* 根据ID查询 返回 Map
* @param id
* @return
*/
Map<String,Object> queryById1(Integer id);
/**
* 根据ID查询 返回 自定义对象
* @param id
* @return
*/
User queryById2(Integer id);
}
4.7 编写映射文件UserMapper.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="com.bjpowernode.mapper.UserMapper">
<select id="queryById1" resultType="java.util.Map">
select * from user where id = 1
</select>
<select id="queryById2" resultType="com.bjpowernode.domain.User">
select * from user where id = 1
</select>
</mapper>
4.8 编写mybatis.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=UTF8&serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
4.9 编写测试类
public class Test {
public static void main(String[] args) throws Exception {
//1.引入配置文件
String config = "mybatis.xml";
InputStream in = Resources.getResourceAsStream(config);
//2.解析配置文件 构建 SqlSession 构建对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//3.使用构建对象构建 SqlSessionFactory 对象 创建Sql会话对象 程序和数据库进行SQL会话对象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
//4.创建一个具体的SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//5.进行数据库具体sql会话
User user = sqlSession.selectOne("com.example.mapper.UserMapper.queryById2",1);
System.out.println(user);
//6.关闭会话
sqlSession.close();
}
}
4.10 执行过程简单分析
1.解析了xml 配置文件 —> configuration
-
将映射文件信息 解析 mappedStatements map结构 每个 mapper文件中的指令 被封装为MappedStatement
-
SqlSession 根据传入 statement 的key 从mappedStatements 中获取到对应 MappedStatement
-
MappedStatement 中已经定义了好了参数类型 返回结果的类型 还有原生sql
-
获取原生sql 参数类型 返回结果的类型 ,根据参数类型 原生sql 可以内部预处理 sql 将sql 发送给数据库
-
接收sql 执行的结果 ,将其封装为对应的返回类型
5.Mybatis进行CRUD
5.1 方式 一:指令ID方式
根据mybatis将映射信息封装为:MappedStatement对象,存在Map中,将namespace和指令ID当做key
根据key获取对应MappedStatement对象,进行数据库操作
5.1.1 创建项目修改pom.xml引入相关依赖
<dependencies>
<!--引入mybatis的依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--引入mysql的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
</dependencies>
5.1.2 复制上个项目里面的所有类和配置
5.1.3 SqlSessionUtils工具类
/**
* 创建SqlSession的工具类
*/
public class SqlSessionUtils {
private static final SqlSessionFactory sqlSessionFactory ;
static {
//配置文件
String config = "mybatis.xml";
//将配置文件转化为流对象
InputStream in = null;
//创建SqlSessionFactory的构建对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = null;
try {
//将配置文件转化为流对象
in = Resources.getResourceAsStream(config);
//创建SqlSessionFactory的构建对象
sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
} catch (IOException e) {
e.printStackTrace();
}
//通过配置信息 构建 SqlSessionFactory工厂
sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
}
/**
* 获取SQL会话对象
* @return
*/
public static SqlSession getSession(){
return sqlSessionFactory.openSession();
}
}
5.1.4 数据库数据操作类UserDao
package com.bjpowernode.dao;
import com.bjpowernode.domain.User;
import com.bjpowernode.utils.SqlSessionUtils;
import org.apache.ibatis.session