MyBatis-小葵花宝典
时间:2022-08-11 09:00:02
???文章摘要
- 前言
-
-
- ?框架是什么?
-
- 第一部分:MyBatis基础
-
- 一、MyBatis介绍
-
- ?1、MyBatis简介
- ?2、MyBatis开发流程:
- 二、MyBatis基本使用
- ?1、MyBatis环境配配置
- ?2、SqlSessionFactory、Sqlssession
- 三、MyBatis使用案例
- 四、SQL传参
-
- ?1、MyBatis 获取 多表相关查询结果
- ?2、ResultMap结果映射
- 五、MyBtis的数据写入
-
- ?selectKey 与 useGeneratedKeys 的区别
- 六、SQL注入
- 七、总结第一部分:
- 第二部分:MyBatis 进阶
-
- 一、MyBatis日志管理与动态SQL
-
- ?1、MyBatis 日志管理
- ?1、动态SQL
- 二、MyBatis二级缓冲
-
- ?级缓存操作规则
- 三、MyBatis 对象关联查询
- 四、分页插件 PageHelper
- 五、MyBtis 配置C3P0连接池
- 六、MyBtis 批量处理
- 七、MyBtis 注解开发
- 总结
前言
???本文分为两部分,第一部分是MyBatis基础。首先介绍mybatis框架。然后是MyBatis开发过程涉及六个步骤。第二部分是MyBatis进步。日志管理,动态。SQL、缓冲机制,多表级联查询,PageHelper插件、还有MyBatis使用细节、工作流程等。
?框架是什么?
???生活中: 本文的目录、电脑主板、大楼的骨架、=>这些都是框架。框架提供了整体结构和底层支撑。例如建筑框架建设完成后,开发商可以设计每个套房的尺寸、设计、装修和开发商。但不可能有大的变化,因为建筑的框架已经确定。
???开发中: 框架是开发人员可以定制的应用框架。框架是确保开发人员同的方式开发程序的规则。框架提倡不要重复造轮,包装基本功能。
???SSM开发框架: Spring 对象容器框架(框架框架)。SpringMVC框架 架构模式。MyBatis框架 简化数据库与程序的交互。Spring提供底层对象管理,SpringMVC提供了web上的交互,MyBatis 数据库操作方便。
???框架的优点: 提高开发效率,编码规则统一,应用配置灵活,维护性高。
第一部分:MyBatis基础
一、MyBatis介绍
?1、MyBatis简介
???◆MyBatis是优秀的持久层框架,持久就是将内存中的数据保存到数据库中。
???◆MyBatis使用 XML 将 SQL 与程序 降低耦合度,维护程序很方便。
???◆基于高效执行JDBC操作数据库。MyBatis官方地址:官方地址: https://mybatis.org/mybatis-3/ ”。
?2、MyBatis开发流程:
???① 引入MyBatis依赖
???② 创建XML核心配置文件
???③ 创建实体(Entity)类
???④ 创建Mapper映射文件
???⑤ 初始化SeesionFactory
???⑥ 利用SqlSession对象操作数据
二、MyBatis基本使用
???MyBatis采用XML保存环境配置信息的文件。 其中用到
MyBatis环境配置标签。 在该标签中包含:数据库驱动、URK、用户名和密码。
???SqlSessionFactory (SQL会话工厂)是的MyBatis核心对象。 SqlSessionFactory在应用中是 唯一 的。 用于初始化MyBatis,创建SqlSession对象。
???SqlSession是MyBatis操作数据库的核心对象,SqlSession使用JDBC与数据库交互的方式。 SqlSession对象还提供,数据表CRUD对应方法。
?1、MyBatis环境配配置
环境配置 不同的环境不同id名 <environment id="dev"> 解释数据库的事务 通过调用JDBC的commit 或 rollback方法提交 <transactionManager type="JDBC">transactionManager> 数据源 数据库连接采用连接池管理(这里使用MyBatis自带连接池) <dataSource type="POOLED"> 属性
<property
name="driver" value="com.mysql.jdbc.Driver">
<property name="url" value="jdbc:mysql://localhost:3306/...">
<property name="username" value="root">
<property name="password" value="root">
dataSource>
environment>
实际案例演示:⚓️⚓️⚓️
① pom.xml中 添加 MyBatis依赖、数据库驱动、等
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>testWeb-serletartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
properties>
镜像仓库
<repositories>
<repository>
<id>aliyunid>
<name>aliyunname>
<url>https://maven.aliyun.com/repository/publicurl>
repository>
repositories>
添加依赖:MyBatis、MySQL驱动
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.1version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.47version>
dependency>
project>
② 在resources目录下,创建MyBatis的
mybatis-config.xml
核心配置文件
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/teat?......"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
mappers>
configuration>
2、SqlSessionFactory、Sqlssession
SqlSessionFactory
创建案例:⚓️⚓️⚓️
public class MyBatisTestor {
@Test
public void testSqlSessionFactor() throws IOException {
* 利用Reader 加载lasspath下的 mybatis-config.xml 核心文件
// 资源 按照字符流进行读取
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
* 初始化SqlsessionFactory对象,同时解析mybatis.xml文件
// 构造者模式 初始化SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
* 创建Sqlssion对象,Sqlsession是JDBC的扩展类,用于与数据库交互
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取底层的 数据库连接对象|(测试用,实际开发MyBatis自动完成)
Connection coon = sqlSession.getConnection();
System.out.println(coon);
}
}
有开就有关,上面案例的 资源关闭 代码如下:
public class MyBatisTestor {
@Test
public void testSqlSessionFactor() throws IOException {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = null;
try{
sqlSession = sqlSessionFactory.openSession();
Connection coon = sqlSession.getConnection();
System.out.println(coon);
}catch(Exception){
e.printStackTrace();
}finally{
if(sqlSession != null){
sqlsession.close();
}
}
}
}
上面的代码很复杂,可以对其封装📇。 封装成 : MyBatisUtils
工具类👈。 同时也能保证SqlSessionFactory的全局唯一性。在主包下创建utils包,在该包中创建此工具类。
public class MyBatisUtils {
//利用static 属于类不属于对象,且全局唯一
private static SqlSessionFactory sqlSessionFactory=null;
//利用静态块在初始化类时,实例化sqlsessionFactory
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
// 在类的初始化的过程中,产生的错误
throw new ExceptionInInitializerError(e);
}
}
// 创建新的 Sqlsession 对象
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
}
// 关闭或释放 Sqlsession 对象
public static void closeSession(SqlSession sqlSession){
if (sqlSession != null){
sqlSession.close();
}
}
}
===========================下面代码测试用例==========================
// MyBatisUtils 的测试
@Test
public void testMyBatisUtils(){
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.openSession();
Connection connection = sqlSession.getConnection();
System.out.println(connection);
} catch (Exception e) {
e.printStackTrace();
}finally {
MyBatisUtils.closeSession(sqlSession);
}
}
}
三、MyBatis使用案例
MyBatis数据查询
使用案例:⚓️⚓️⚓️
第1️⃣步:创建实体类(Entity),存放查询结果。
在主包下创建entity包,在该包中创建此 实体类。
public class Goods {
private Integer goodsId;//商品编号
private String title;//标题
private String subTitle;//子标题
private Float originalCost;//原始价格
private Float currentPrice;//当前价格
private Float discount;//折扣率
private Integer isFreeDelivery;//是否包邮
private Integer categoryId;//分类编号
······
······
//以省略 get、set 方法
······
······
}
第2️⃣步:创建Mapper XML
目的:说明上面的实体类,和哪个数据库的表对应,表中的属性和哪个字段对应。
在resources目录下,创建 mappers包。 此包保存的都是XML文件 (MyBatis映射文件)
。
此处创建的是 goods.xml 文件
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="goods">
mapper>
第3️⃣步:编写 < select > SQL 标签
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="goods">
<select id="selectAll" resultType="com.XXXX.mybatis.entity.Goods">
select * from t_goods order by goods_id limt 10
select>
mapper>
完成 2、3 两步。就是完整的 Mapper XML了。 Mybatis 要认识 该Mapper XML文件,就需要在mybatis-config.xml中 对其进行声明。
<mappers>
<mapper resource="mappers/goods.xml" />
mappers>
书写以上标签后,MyBatis 启动时会自动加载,goods.xml文件
然后可以对,2、3 两步进行测试: SqlSession执行 select 语句
//测试 selectAll(设置的一个sql语句的别称(也就是设置了sql语句的id))sql语句
@Test
public void testSelectAll() throws Exception{
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.openSession();
//作为SqlSession对象来说,最核心执行SQL查询语句的方法是:select();/select...();
// 因为selectAllsql语句 返回的是多条数据 这里选择:selectList();
//其中selectList();里面的参数是=》selectList("命名空间.SQL语句的id");
List<Goods> list = sqlSession.selectList("goods.selectAll");
//执行完sql语句过后,list集合就包含了查询结果。下面可以遍历看一下
for (Goods g:list){
System.out.println(g.getTitle());
}
} catch (Exception e) {
throw e;
}finally {
MyBatisUtils.closeSession(sqlSession);
}
}
数据库底层的 goods_id 和实体类 goodsId 是无法对应的,所以需要开启 驼峰命名映射
}
第4️⃣步:开启驼峰命名映射
在 mybatis-config.xml中 添加< settings > 标签
<settings>
驼峰命名 转换 例:goods_id => goodsId
<setting name="mapUnderscoreToCamelCase" value="true"/>
settings>
四、SQL传参
在用户界面动态输入数据,然后把用户的数据编成SQL语句,进行处理。
需要编写 Mapper 目录下的 xml 文件,改变 select标签。
<select id="selectById" parameterType="Integer" resultType="com.XXXX.mybatis.Goods">
下面这个就代表从外侧 传进来的Integer数据
select * from t_goods order by goods_id = #{value}
select>
下面是 代码对比:
之前的 数据查询 SQL:
<select id="selectAll" resultType="com.xxxx.mybatis.entity.Goods">
select * from t_goods order by goods_id desc limit 10
select>
SQL传参的 代码:
<select id="selectByid" parameterType="Integer" resultType="com.xxxx.mybatis.entity.Goods">
select * from t_goods where goods_id = #{value}
select>
测试使用案例:⚓️⚓️⚓️
动态查询 一条数据
public void testSlectById(){
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.openSession();
根据编写的 select标签 只返回一条数据,所以选择selectOne(命名空间.SQL语句的id ,外侧传入的参数)方法
Goods goods = sqlSession.selectOne("goods.selectByid", 1888);
System.out.println(goods.getTitle());
} catch (Exception e) {
e.printStackTrace();
}
}
测试使用案例二: 动态传入多条数据 ⚓️⚓️⚓️
因为在Mybatis中 goods.xml文件里的select标签 ,只支持一个parameterType=" xxxx ",所以要传递多参,还是需要 改变 select标签。=> parameterType="java.util.Map"
goods.xml 文件中的 select标签 <select id="selectBypriceRange" parameterType="java.util.Map" resultType="com.xxxx.mybatis.entity.Goods"> select * from t_goods where current_price between #{ min} and #{ max} order by current_price limit 0,#{ limt} </select> =======================改完上面的标签后,下面是测试代码=========================== public void testSelectByPriceRange(){ SqlSession sqlSession = null; try { sqlSession = MyBatisUtils.openSession(); // 因为 goods.xml中的 select标签 内部设置Map 所以下面创建Map Map param = new HashMap(); param.put("min",100); param.put("max",500元器件数据手册
、IC替代型号,打造电子元器件IC百科大全!