Mybatis框架
学习目标:
- 熟练运用Mybatis框架进行开发
- 掌握Mybatis和Spring框架的整合
核心功能:
- 动态代理的操作------>动态SQL
- JDBC的操作
1、什么是Mybatis?
MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架
- 支持自定义 SQL、存储过程以及高级映射的持久层框架。
- MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架。
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects - 普通老式 Java 对象)为数据库中的记录。
2、MyBatis的功能架构:
Mybatis的功能架构分为三层:
- API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
- 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
- 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
核心配置文件 mybatis-config.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>
<!-- 引入外部配置资源 -->
<properties resource="jdbc.properties"></properties>
<!-- 类型别别名 -->
<typeAliases>
<typeAlias type="com.jege.mybatis.mapper.User" alias="User" />
</typeAliases>
<!-- mybatis数据库连接和应用环境 -->
<environments default="dev">
<environment id="dev">
<!-- JDBC事务 -->
<transactionManager type="JDBC" />
<!-- 配置数据库的属性) -->
<dataSource type="POOLED">
<property name="url" value="${jdbc.url}" />
<property name="driver" value="${jdbc.driver}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 加载mybatis的映射文件 -->
<mappers>
<mapper resource="com/jege/mybatis/mapper/UserMapper.xml" />
</mappers>
</configuration>
3、第一个mybatis程序
1、创建一个数据表,并插入数据
# 给表t_monkey插入数据
insert into t_monkey(name, hometown, weapon, birthdate)
values
('灵明石猴', '东胜神洲', '定海神针', current_date) ,
('赤尻马猴', '西牛贺洲', '精钢混铁杖', current_date) ,
('通背猿猴', '南儋部州', '擎天柱', current_date) ,
('六耳猕猴', '北俱芦洲', '随心铁杆兵', current_date) ;
2、创建一个普通Maven工程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFgoL8UI-1608623090222)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201222153512477.png)]
3、配置pom.xml文件,导入三个相关jar包以及设置静态资源过滤
<dependencies>
<!-- junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- mybatis 包 -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- 数据库驱动包 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
<build>
<!-- 希望maven在导出项目的时候,将配置和资源导出 -->
<resources>
<!-- src/main/java 的资源-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!--src/main/resources的资源-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
4、 创建实体类(构造方法、getset方法、toString方法)
package com.hlm.entity;
/*
*Author:HLM
*Date:2020/08/24
*Description:
*/
import java.util.Date;
/**
* 实体类 Monkey
* @author HLM
*/
public class Monkey {
//声明数据库表中的字段
private int id ;
private String name ;
private String hometown ;
private Date birthdate ;
//构造方法
public Monkey(int id, String name, String hometown, Date birthdate) {
this.id = id;
this.name = name;
this.hometown = hometown;
this.birthdate = birthdate;
}
//get、set方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHometown() {
return hometown;
}
public void setHometown(String hometown) {
this.hometown = hometown;
}
public Date getBirthdate() {
return birthdate;
}
public void setBirthdate(Date birthdate) {
this.birthdate = birthdate;
}
//重写toString方法
@Override
public String toString() {
return "Monkey:"+
"id="+id+
",name="+name+
",hometown="+hometown+
",birthdate="+birthdate+
"\t" ;
}
}
5、在resources目录下建立mybatis-config.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">
<!--配置mybatis的运行环境-->
<configuration>
<!--default表示默认使用id为"development"的环境-->
<environments default="development">
<!-- environment可以有多个 ,default表示默认使用哪个环境 -->
<environment id="development">
<!-- transactionManager 配置JDBC的事务管理 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源,配置JDBC数据源连接池 -->
<dataSource type="POOLED">
<!-- value的值可以固定 -->
<!-- 数据库驱动(jdbc的四个内容) -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demos?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="hlm"/>
<property name="password" value="hlm"/>
</dataSource>
</environment>
</environments>
<!--注册AccountMapper.xml-->
<mappers>
<mapper resource="com/hlm/mapper/AccountMapper.xml"/>
</mappers>
</configuration>
6、创建mybatis工具类utils
package com.hlm.utils;
/*
*Author:HLM
*Date:2020/08/24
*Description:
*/
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class Utils {
private static SqlSessionFactory sqlSessionFactory ;
//准备配置文件
static {
String resource = "mybatis-config.xml";
//获取配置文件的流
InputStream inputStream;
{
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
System.out.println("获取配置文件的流出错!");
e.printStackTrace();
}
}
}
//提供静态方法返回sqlSessionFactory
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory ;
}
}
7、在mapper包下创建MonkeyMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--映射MonkeyMapper接口-->
<!--namespace表示MonkeyMapper接口的文件路径名-->
<mapper namespace="com.hlm.mapper.MonkeyMapper">
<!--编写SQL语句,id为接口中的方法名,resultType为返回值的类型-->
<select id="getAllMonkey" resultType="com.hlm.entity.Monkey">
select * from t_monkey
</select>
</mapper>
8、到mybatis-config.xml中关联映射文件(重要)
<!--注册MonkeytMapper.xml-->
<mappers>
<mapper resource="com/hlm/mapper/MonkeyMapper.xml"/>
</mappers>
9、在Test包下的java包创建一个测试类
import java.util.List;
public class MonkeyTest {
@Test
//实现接口中的方法
public void getAllMonkey(){
SqlSessionFactory sqlSessionFactory = Utils.getSqlSessionFactory() ;
SqlSession sqlSession = sqlSessionFactory.openSession();
MonkeyMapper monkeyMapper = sqlSession.getMapper(MonkeyMapper.class) ;
List<Monkey> allMonkey = monkeyMapper.getAllMonkey();
for (Monkey monkey: allMonkey) {
System.out.println(monkey);
}
}
}
10、执行测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEyIjS14-1608623090225)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201222154033280.png)]
sqlSession = sqlSessionFactory.openSession();
MonkeyMapper monkeyMapper = sqlSession.getMapper(MonkeyMapper.class) ;
List allMonkey = monkeyMapper.getAllMonkey();
for (Monkey monkey: allMonkey) {
System.out.println(monkey);
}
}
}
#### 10、执行测试
[外链图片转存中...(img-XEyIjS14-1608623090225)]
### 4、