资讯详情

MyBatis-小葵花宝典

???文章摘要

  • 前言
      • ?框架是什么?
  • 第一部分: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

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台