MyBatis日志管理与动态SQL
日志管理
- 日志文件是用于记录系统操作事件的记录文件或文件集合
- 日志保存历史数据,是诊断问题以及理解系统活动的重要依据
日志返回首页 (qos.ch)
日志输出级别(优先级 高到低) error: 错误 - 系统的故障日志 warn: 警告 - 存在风险或使用不当的日志 info: 一般性消息 debug: 程序内部用于调用信息 trace: 程序运行的跟踪信息
MyBatis 动态SQL
动态SQL是指根据参数数据动态组织SQL的技术
MyBatis 二级缓存
- —级缓存默认开启,缓存范围SqlSession会话一级缓存
- 二级缓存手动开启,属于范围Mapper Namespace
二级缓存运行规则
- 二级开启后默认所有查询操作均使用缓存
- 写操作commit提交时对该namespace缓存强制清空
- 配置useCache=false可以不用缓存
- 配置flushCache=true代表强制清空缓存
关联查询
一对多
代码语言:javascript复制<!--
resultMap 可用于说明一对多或多对一的映射逻辑
id 是 resultMap 属性引用的标志
type 指向 One 的实体(Goods)
-->
<resultMap id="rmGoods1" type="pers.hua.mybatis.entity.Goods">
<!-- 映射 goods 对象的主键到 goods_id 字段-->
<id column="goods_id" property="goodsId"/>
<!--
collection 的含义是:在 select * from t_goods limit 0,1
得到结果后,对所有的 Goods 对象遍历得到 goods_id 字段值,
并代入到 goodsDetail 命名空间的 findByGoodsId 的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>
多对一
代码语言:javascript复制<resultMap id="rmGoodsDetail" type="pers.hua.mybatis.entity.GoodsDetail">
<id column="gd_id" property="gdId"/>
<result column="goods_id" property="goodsId"/>
<!-- association:多对一-->
<association property="goods" select="goods.selectById" column="goods_id"/>
</resultMap>
<select id="selectManyToOne" resultMap="rmGoodsDetail">
select * from t_goods_detail limit 0,1
</select>
分页查询
Maven引入PageHelper分页插件、jsqlparser
代码语言:javascript复制 <plugins>
<!-- 启用分页插件-->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 设置数据库类型-->
<property name="helperDialect" value="mysql"/>
<!-- 分页合理化-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
整合C3P0连接池
Maven引入C3P0
代码语言:javascript复制<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
创建DataSource
代码语言:javascript复制/**
* C3P0与MyBatis兼容使用的数据源工厂类
*/
public class C3P0DataSourceFactory extends UnpooledDataSourceFactory {
public C3P0DataSourceFactory(){
this.dataSource = new ComboPooledDataSource();
}
}
MyBatis批处理
代码语言:javascript复制<!-- INSERT INTO table-->
<!-- VALUES ("a","a1","a2"),("b","b1","b2"),(......);-->
<insert id="bachInsert" parameterType="java.util.List">
insert into t_goods(title, sub_title, original_cost, current_price, discount, is_free_delivery, category_id) VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.title},#{item.subTitle},#{item.originalCost},#{item.currentPrice},#{item.discount},#{item.isFreeDelivery},#{item.categoryId})
</foreach>
</insert>