热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ORM技术体系MyBatis

一、核心API介绍1、Mapper映射器。由一个Java接口和XML文件(或者注解构成)2、SqlSession就相当于一个数据库连接(Connection对象),可以在一个事务里



一、核心 API 介绍
1、Mapper映射器。由一个 Java 接口和 XML 文件(或者注解构成)
2、SqlSession 就相当于一个数据库连接(Connection 对象),可以在一个事务里面执行多条 SQL,然后通过commit、rollback 方法提交或者回滚事务。
3、SqlSessionFactory 可以被认为是一个数据库连接池,里面存储SqlSession对象。单例模式的对象,在应用中被共享。
4、SqlSessionFactoryBuilder 的作用是使用构建者模式创建 SqlSessionFactory 接口对象。

二、全局配置文件、配置文件

三、Mybatis 中的参数绑定
在映射配置文件中向 SQL 语句中绑定参数的语法结构为#{ }和${ }。
#{ } 和 ${ }的区别:
#{ } 解析为一个 JDBC 预编译语句(PreparedStatement)的参数标记符占位符 ?。使用该方式可避免 SQL 注入。






























S


t


r


i


n


g














M


y


b


a


t


i


s











S


Q


L










































{ } 仅仅为一个纯碎的 String 替换,在 Mybatis 的动态 SQL 解析阶段将会进行变量替换。


仅仅为一个纯碎的String替换,在Mybatis的动态SQL解析阶段将会进行变量替换。{ } 在预编译之前已经被变量替换了,这会存在 SQL 注入问题
四、使用 ThreadLocal 存储 SqlSession
如果多个 DML 操作属于一个事务,因为 commit()和 rollback()都是由 SqlSession 完成的,所以必须保证使用一个 SqlSession。但是多个不同的 DML 操作可能在不同类的不同方法中,每个方法中要单独的获取 SqlSession。比如商城下订单时,其实涉及商品库存变化、订单添加、订单明细添加、付款、日志添加等多个 DML 操作,分布在不同类中。如何在多个 DML 操作之间使用同一个 SqlSession 呢,可以使用 ThreadLocal 来存储。保证一个线程中的操作使用的都是一个 SqlSession。
创建 Mybatis 工具类

public class MybatisUtils {
private static ThreadLocal threadLocal = new
ThreadLocal<>();
private static SqlSessionFactory sqlSessiOnFactory= null;
static{
//创建 SqlSessionFactory
InputStream is = null;
try{
is = Resources.getResourceAsStream("mybatis-cfg.xml");
}catch (IOException e){
e.printStackTrace();
}
sqlSessiOnFactory= new
SqlSessionFactoryBuilder().build(is);
}
//获取 SqlSession
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
29}
return sqlSession;
}
//关闭 SqlSession
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close();
threadLocal.set(null);
}
}
}
@Override
public void deleteUsersById(int userid) {
SqlSession sqlSession = MybatisUtils.getSqlSession();
final int delete =
sqlSession.delete("com.bjsxt.mapper.UserMapper.deleteUsersById",
userid);
}

五、日志处理
日志处理,线上问题追踪、错误排查、基于日志的业务的逻辑统计分析。常用日志框架Log4J、common Logging 、slf4J
Log4j 的日志级别
Log4j 定义了 8 个日志级别(除去 OFF 和 ALL,可以说分为 6 个级别),优先级从低到高 DEBUG、INFO、WARN、ERROR 四个日志级别。

六、分页查询
1、rowbounds ->offset:偏移量,从 0 开始计数 limit:限制条数
List selectUsersRowBounds(RowBounds rowBounds);
2、SQL语句分页:SQL 语句来实现分页处理。在 MySQL 数据库中我们可以使用 limit 实现分页。


3、PageHelper使用分页插件
分页查询 API
PageHelper.startPage(int pageNum,int pageSize);
给定分页参数,该方法需要在执行查询之前调用
pageNum:起始的页数,从 1 开始计算。
pageSize:每页显示的条数。
PageInfo 对象
存放分页结果对象
pageInfo.getList() 获取分页查询结果。
pageInfo.getTotal() 获取查询总条数。
pageInfo.getPages() 获取总页数。
pageInfo.getPageNum() 获取当前页。
pageInfo.getSize() 获取每页显示的条数。
使用步骤:

sqlSession.getMapper(UsersMapper.class);
UsersExample usersExample = new UsersExample();
PageHelper.startPage(3,2);
List list =usersMapper.selectByExample(usersExample);
list.forEach(System.out::println);
PageInfo pageInfo = new PageInfo<>(list);

七、MyBatis动态代理
------mybatis 主键值回填 ----------------

keyProperty="userid">
insert into users values(default ,#{username},#{usersex})

parameterType="com.telecomyt.plat.cmac.alarm.entity.AlarmDispose" useGeneratedKeys="true">
insert into alarm_dispose (alarm_content_id........)values ()
------------动态代理原理解析mapperproxy.newInstance//代理对象也就是接口实现类、JDK动态代理-对象创建mapperProxy

------------动态SQL-----------------------

if条件的判断:


and username = #{username}

多选一条件:choose中没有条件满足执行otherwise


根据用户给定的条件进行查询使用 where 标签实现

select * from users


and userid = #{userid}


and username = #{username}


and usersex = #{usersex}


模糊查询

select * from users where username like concat('%',#{name},'%')

set标签

update users


username = #{username},


usersex = #{usersex},


集合


八、MyBatis缓存
缓存是一般的 ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力,缓存的重要性是不言而喻的。Mybatis 会将相同查询条件的 SQL 语句的查询结果存储在内存或者某种缓存介质当中MyBatis 缓存方式分为一级缓存和二级缓存,同时也可配置关于缓存设置。一级缓存是将结果缓存在 SqlSession 对象中,二级缓存是存储在 SqlSessionFactory 对象中。默认情况下,MyBatis 开启一级缓存,没有开启二级缓存。当数据量大的时候可以借助一些第三方缓存技术来协助保存 Mybatis 的二级缓存数据。

一级缓存也叫本地缓存,MyBatis 的一级缓存是在会话(SqlSession)层面进行缓存的。MyBatis 的一级缓存是默认开启的,不需要任何的配置。MyBatis 在开启一个数据库会话时,会创建一个新的 SqlSession 对象,SqlSession 对象中会有一个新的 Executor 对象。Executor 对象中持有一个新的PerpetualCache 对象;当会话结束时,SqlSession 对象及其内部的 Executor 对象还有 PerpetualCache 对象也一并释放掉。
在这里插入图片描述

二级缓存是 SqlSessionFactory 上的缓存,可以是由一个 SqlSessionFactory 创建的不同的 SqlSession 之间共享缓存数据。默认并不开启。二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis 要求缓存的 POJO 必须是可序列化的, 也就是要求实现 Serializable 接口。在映射配置文件中配置就可以开启缓存了。

二级缓存的特点


  1. 映射语句文件中的所有 select 语句将会被缓存。
  2. 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  3. 二级缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响
  4. 如果在加入标签的前提下让个别 select 元素不使用缓存,可以使用 useCache属性,设置为 false。
  5. 缓存会使用默认的 Least Recently Used(LRU,最近最少使用的)算法来收回

九、多表查询



```java
resultMap="usersAndOrdersAndItems">
select * from users as u,orders as o, orders_items as oi ,items as i
where u.userid = o.user_id and o.orderid = oi.order_id and
oi.item_id = i.itemid and u.userid = #{userid}

在这里插入图片描述

或者使用修改全局配置文件配置触发方法

延迟加载,调用get方法后才能进行查询加载,此为延迟加载。



推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
author-avatar
Dewey
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有