MyBatis基础--日志管理、动态SQL、二级缓存、对象管理查询、PageHelper分页插件、C3P0连接池

一、MyBatis日志管理:

1、在pom.xml文件中引入依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.10</version>
</dependency>

2、在resources目录下创建logback.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n</pattern>
        </encoder>
    </appender>
    <!--
        日志输出级别(优先级别从高到低):
        error:错误 - 系统的故障日志
        warn:警告 - 存在风险或使用不当的日志
        info:一般性消息
        debug:程序内部用于调试信息
        trace:程序运行的跟踪信息
    -->
    <root level="DEBUG">
        <appender-ref ref="console" />
    </root>
</configuration>

!注意:“=” 左右不留空格。


二、动态SQL的应用场景:

动态SQL:是指根据数据动态组织SQL技术

<!-- 根据test中的条件判断是否加入if中的SQL -->
<if test="type != null">
 	AND type = #{type,jdbcType=INTEGER}
</if>

<!-- 根据查询的条件,动态组织筛选语句,并保证语法正确 -->
<where>
     <if test="type != null">
 		AND type = #{type,jdbcType=INTEGER}
	 </if>
</where>
<!-- 上下两种写法等价 -->
where 1=1
<if test="type != null">
 	AND type = #{type,jdbcType=INTEGER}
</if>

三、MyBatis二级缓存:

一级缓存:默认开启,缓存范围SqlSession会话,生命周期短。
二级缓存:手动开启,属于范围Mapper Namespace,只缓存namespace下的所有查询数据。
在这里插入图片描述

1、二级缓存运行规则

  1. 二级缓存开启后,默认查询操作均使用缓存。
<!-- 开启了二级缓存
	eviction:是缓存的清除策略,当缓存对象数量达到上限后,自动触发对应算法对缓存对象清除
		1.LRU - 最近最久未使用:移除最长时间不被使用的对象。如下第二行为最近访问时间,将移除o512
		LFU - 最近最少使用:移除最近访问频率最低的对象。
		o1	o2	o3	o4	...	o512
		14	99	82	2		888
		2.FIFO - 先进先出:按对象进入缓存的顺序来移除它们。
		3.SOFT - 软引用:移除基于垃圾收集器状态和软引用规则的对象。
		4.WEAK - 弱引用:更积极的移除基于垃圾收集器状态和弱引用规则的对象。
	flushInterval: 代表间隔多长时间自动清空缓存,单位毫秒,600000毫秒 = 10秒
	size: 缓存存储上限,用于保存对象或集合(1个集合算1个对象)的数量上限。
	readOnly: 设置为true,代表返回只读缓存,每次从缓存取出的是缓存对象本身,这种执行效率较高。
			   设置为false,代表每次取出的是缓存对象的"副本",每次取出的对象都是不同的,这种安全性较高。 -->
<cache eviction="LRU" flushInterval="600000" size="512" readOnly="true" />
  1. 写操作commit提交时对该namespace缓存强制清空。
sqlSession.commit();//提交事务数据
  1. 配置useCache=false可以不用缓存。
<select id="selectAll" resultType="com.imooc.entity.Student" useCache="false">
    select * from student order by id DESC limit 10
</select>
  1. 配置flushCache=true代表强制清空缓存。在commit之前清空缓存。
<insert id="insetStudent1" parameterType="com.imooc.entity.Student" useGeneratedKeys="true" flushCache="true">
    insert into student(reg_no,`name`,sex,age,grade,major)
    values (#{regNo},#{name},#{sex},#{age},#{grade},#{major})
</insert>

四、OneToMany对象关联查询

创建实体类:Goods 和 GoodsDetail

package com.imooc.mybatis.entity;
import java.util.List;

public class Goods {
    private Integer goodsId;//商品编号
    private String title;//标题
    private String subTitle;//子标题
    private Float originalCost;//原始价格
    private Float currentPrice;//当前价格
    private Float discount;//折扣率
    private Integer isFreeDelivery;//是否包邮 ,1-包邮 0-不包邮
    private Integer categoryId;//分类编号
    private List<GoodsDetail> goodsDetails;
//生成set和get方法
}
package com.imooc.mybatis.entity;

public class GoodsDetail {
    private Integer gdId;
    private Integer goodsId;
    private String gdPicUrl;
    private Integer gdOrder;
    //生成set和get方法
}

创建对应的xml文件:

 <!--
        resultMap可用于说明一对多或者多对一的映射逻辑
        id 是resultMap属性引用的标志
        type 指向One的实体(Goods)
    -->
    <resultMap id="rmGoods1" type="com.imooc.mybatis.entity.Goods">
        <!-- 映射goods对象的主键到goods_id字段 -->
        <id column="goods_id" property="goodsId"></id>
        <!--
            collection的含义是,在
            select * from t_goods limit 0,1 得到结果后,对所有Goods对象遍历得到goods_id字段值,
            并代入到goodsDetail命名空间的selectByGoodsId的SQL中执行查询,
            将得到的"商品详情"集合赋值给goodsDetails List对象.
        -->
        <collection property="goodsDetails" select="goodsDetail.selectByGoodsId"
                    column="goods_id"/>
    </resultMap>
    <select id="selectOneToMany" resultMap="rmGoods1">
        select * from t_goods limit 0,10
    </select>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="goodsDetail">
    <select id="selectByGoodsId" parameterType="Integer"
            resultType="com.imooc.mybatis.entity.GoodsDetail">
        select * from t_goods_detail where goods_id = #{value}
    </select>
</mapper>

mybatis-config.xml中注册

<mappers>
   <mapper resource="mappers/goods.xml"/>
    <mapper resource="mappers/goods_detail.xml"/>
</mappers>

五、ManyToOne对象关联查询

创建实体:Goods 和 GoodsDetail

package com.imooc.mybatis.entity;
import java.util.List;

public class Goods {
    private Integer goodsId;//商品编号
    private String title;//标题
    private String subTitle;//子标题
    private Float originalCost;//原始价格
    private Float currentPrice;//当前价格
    private Float discount;//折扣率
    private Integer isFreeDelivery;//是否包邮 ,1-包邮 0-不包邮
    private Integer categoryId;//分类编号
//生成set和get方法
}
package com.imooc.mybatis.entity;

public class GoodsDetail {
    private Integer gdId;
    private Integer goodsId;
    private String gdPicUrl;
    private Integer gdOrder;
    private Goods goods;
    //生成set和get方法
}

创建对应的xml文件:使用association标签,通过goods_id去调用goods.selectById的查询方法,将结果填充到goods实体。

<resultMap id="rmGoodsDetail" type="com.imooc.mybatis.entity.GoodsDetail">
   <id column="gd_id" property="gdId"/>
    <result column="goods_id" property="goodsId"/>
    <association property="goods" select="goods.selectById" column="goods_id"></association>
</resultMap>
<select id="selectManyToOne" resultMap="rmGoodsDetail">
    select * from t_goods_detail limit 0,20
</select>
<select id="selectById" parameterType="Integer" resultType="com.imooc.mybatis.entity.Goods">
   select * from t_goods where  goods_id = #{value}
</select>

六、PageHelper分页插件

官方文档地址:https://pagehelper.github.io/docs/howtouse/

1、使用流程

具体使用查看官方文档

1.maven中引入PageHelper和jsqlparser

<!-- pagehelper 分页插件 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.3.0</version>
</dependency>
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>4.3</version>
</dependency>

2.mybatis-config.xml增加Plugin配置

<!-- 启用pagehelper分页插件 -->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 设置数据库类型 -->
        <property name="helperDialect" value="mysql"/>
        <!-- 分页合理化 -->
        <property name="reasonable" value="true"/>
    </plugin>
</plugins>

3.代码中使用PageHelper.startPage()自动分页

 public void testSelectPage() throws Exception {
    SqlSession session = null;
    try {
        session = MyBatisUtils.openSession();
        /*startPage方法会自动将下一次查询进行分页*/
        PageHelper.startPage(2,10);
        Page<Goods> page = (Page) session.selectList("goods.selectPage");
        System.out.println("总页数:" + page.getPages());
        System.out.println("总记录数:" + page.getTotal());
        System.out.println("开始行号:" + page.getStartRow());
        System.out.println("结束行号:" + page.getEndRow());
        System.out.println("当前页码:" + page.getPageNum());
        List<Goods> data = page.getResult();//当前页数据
        for (Goods g : data) {
            System.out.println(g.getTitle());
        }
        System.out.println("");
    } catch (Exception e) {
        throw e;
    } finally {
        MyBatisUtils.closeSession(session);
    }
}

七、MyBatis整合C3P0连接池

1、maven引入依赖

<dependency>
   <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.4</version>
</dependency>

2、创建数据源工厂类

package com.imooc.mybatis.datasource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory;

/**
 * C3P0与MyBatis兼容使用的数据源工厂类
 */
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
    public C3P0DataSourceFactory(){
        this.dataSource = new ComboPooledDataSource();
    }
}

3、配置mybatis-config.xml文件

<dataSource type="com.imooc.mybatis.datasource.C3P0DataSourceFactory">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/babytun?useUnicode=true&amp;characterEncoding=UTF-8"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>
    <property name="initialPoolSize" value="5"/>
    <property name="maxPoolSize" value="20"/>
    <property name="minPoolSize" value="10"/>
    <!--...-->
</dataSource>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值