???文章摘要
- 前言
-
-
- ?框架是什么?
-
- 第一部分: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使用细节、工作流程等。
?框架是什么?
??? 本文的目录、电脑主板、大楼的骨架、=>这些都是框架。框架提供了整体结构和底层支撑。例如建筑框架建设完成后,开发商可以设计每个套房的尺寸、设计、装修和开发商。但不可能有大的变化,因为建筑的框架已经确定。 ??? 框架是开发人员可以定制的应用框架。框架是确保开发人员同的方式开发程序的规则。 ??? pring 对象容器框架(框架框架)。pringMVC框架 架构模式。yBatis框架 简化数据库与程序的交互。Spring提供底层对象管理,SpringMVC提供了web上的交互,MyBatis 数据库操作方便。 ??? 提高开发效率,编码规则统一,应用配置灵活,维护性高。
第一部分:MyBatis基础
一、MyBatis介绍
?1、MyBatis简介
???◆MyBatis是优秀的持久层框架,持久就是将内存中的数据保存到数据库中。 ???◆MyBatis,维护程序很方便。 ???◆基于高效执行JDBC操作数据库。MyBatis官方地址:官方地址: https://mybatis.org/mybatis-3/ ”。
?2、MyBatis开发流程:
???① 引入MyBatis依赖 ???② 创建XML核心配置文件 ???③ 创建实体(Entity)类 ???④ 创建Mapper映射文件 ???⑤ 初始化SeesionFactory ???⑥ 利用SqlSession对象操作数据
二、MyBatis基本使用
??? 其中用到<environment>
MyBatis环境配置标签。 在该标签中包含:数据库驱动、URK、用户名和密码。 ??? SqlSessionFactory在应用中是 唯一 的。 。 ???是MyBatis操作数据库的核心对象, 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>
⚓️⚓️⚓️
① 添加 MyBatis依赖、数据库驱动、等
<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>testWeb-serlet</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
镜像仓库
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
添加依赖:MyBatis、MySQL驱动
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</project>
② 在resources目录下,
<?xml version="1.0" encoding="UTF-8" ?>
<!--添加 mybatis的DTD文档约束。官网有-->
<!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
⚓️⚓️⚓️
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();
}
}
}
}
封装成 : 。 同时也能保证SqlSessionFactory的全局唯一性。在主包下创建,在该包中创建此工具类。
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使用案例
⚓️⚓️⚓️
第1️⃣步:创建实体类(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目录下, 此包保存的都是XML文件 。
此处创建的是 goods.xml 文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--MyBatis的DTD DOCTYPE后面改成mapper-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mybatis-config.xml配置文件里的"http://mybatis.org/dtd/mybatis-3-config.dtd"> 和 这里不同-->
<!--映射器 映射器的属性:命名空间-->
<mapper namespace="goods">
</mapper>
第3️⃣步:编写 < select > SQL 标签
<?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">
<!-- 通过增加不同的命名空间,就可以区分开不同的sql语句-->
<mapper namespace="goods">
<!-- 创建select标签,该标签用于查询 该标签也有属性、id等等 在该标签中书写 完整的sql语句就可以了-->
<!-- id=相当于sql语句的名称 resultType说明数据返回的对象是什么 所有后面写我们创建的实体类 路径 -->
<select id="selectAll" resultType="com.XXXX.mybatis.entity.Goods">
select * from t_goods order by goods_id limt 10
</select>
</mapper>
<mappers>
<mapper resource="mappers/goods.xml" />
</mappers>
书写以上标签后,MyBatis 启动时会自动加载,goods.xml文件
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️⃣步:开启驼峰命名映射
<settings>
驼峰命名 转换 例:goods_id => goodsId
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
四、SQL传参
在用户界面动态输入数据,然后把用户的数据编成SQL语句,进行处理。 需要编写 Mapper 目录下的 xml 文件,改变 。
<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 ",所以要传递多参,还是需要 改变 。=> 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 标签:
拉线传感器yhl