锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

MyBatis-小葵花宝典

时间:2022-08-11 09:00:02 拉线传感器yhl

???文章摘要

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

相关文章