一、MyBatis相关概念

  1. 对象 / 关系数据库映射(ORM)

    • ORM全称Object/Relation Mapping:表示对象-关系映射的缩写
    • ORM完成⾯向对象的编程语⾔到关系数据库的映射。当ORM框架完成映射后,程序员既可以利⽤⾯向对象程序设计语⾔的简单易⽤性,⼜可以利⽤关系数据库的技术优势。ORM把关系数据库包装成⾯向对象的模型。ORM框架是⾯向对象设计语⾔与关系数据库发展不同步时的中间解决⽅案。采⽤ORM框架后,应⽤程序不再直接访问底层数据库,⽽是以⾯向对象的放松来操作持久化对象,⽽ORM框架则将这些⾯向对象的操作转换成底层SQL操作。ORM框架实现的效果:把对持久化对象的保存、修改、删除等操作,转换为对数据库的操作
  2. Mybatis 简介
    • MyBatis是⼀款优秀的基于ORM的半⾃动轻量级持久层框架,它⽀持定制化SQL、存储过程以及⾼级映射。MyBatis避免了⼏乎所有的JDBC代码和⼿动设置参数以及获取结果集。MyBatis可以使⽤简单的XML或注解来配置和映射原⽣类型、接⼝和 Java 的 POJO (Plain Old Java Objects,普通⽼式Java对 象)为数据库中的记录。
  3. Mybatis 优势
    • Mybatis是⼀个半⾃动化的持久层框架,对开发⼈员开说,核⼼sql还是需要⾃⼰进⾏优化,sql和java编码进⾏分离,功能边界清晰,⼀个专注业务,⼀个专注数据。

二、MyBatis基本使用

不做赘述,有需要的小伙伴可关注公众号......

三、MyBatis 配置文件

1. 核心配置文件

MyBatis 核心配置文件层级关系

environments 标签

数据库环境的配置,支持多环境配置

其中,事务管理器(transactionManager)类型有两种

  • JDBC:这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的链接来管理事务作用域
  • MANAGED:此配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为 false 来阻止它默认的关闭行为

其中,数据源(DataSource)类型有三种:

  • UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接
  • POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来
  • JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用

mapper

该标签的作用是加载映射,加载方式有下面几种

  • 使用相对于类路径的资源引用:

    <mapper resource="mapper/UserMapper.xml"></mapper>
  • 使用完全限定资源定位符(URL):

    <mapper url="file:///var/mappers/UserMapper.xml"/>
  • 使用映射器接口实现类的完全限定类名:

    <mapper class="com.mfc.dao.UserDao"/>
  • 将包内的映射器接口实现全部注册为映射器:

    <package name="com.mfc.dao"/>

properties 标签

实际开发中,习惯将数据源的配置信息单独抽取成一个 properties 文件,该标签可以加载额外配置的 properties 文件

typeAliases 标签

类型别名是为 Java 类型设置一个短的名字。原来的类型名称如下:

配置 typeAliases ,为 com.mfc.entity.User 定义别名为 user

  • 方法一:使用 typeAlias 标签取别名

  • 方法二:使用 package 标签取别名。给实体类所在的包下面的所有实体类取别名,别名就是类名,并且不区分大小写

上面是程序员可以自定义的别名,Mybatis 框架已经为我们设置好了一些常用的别名

2. 映射配置文件

2.1 动态SQL

MyBatis 的映射文件中,前面我们使用的 SQL 都比较简单,有些时候业务逻辑复杂时,SQL 会是动态变化的,此时前面那些简单的 SQL 就不能满足要求了

动态 SQL 之 标签

根据实体类的不同取值,使用不同的 SQL 语句来进行查询。比如 id 不为空的时候,可以根据 id 查询,username 不为空的时候,可以根据 username 查询。这种情况通常在多条件组合查询中遇到

<mapper namespace="com.mfc.dao.UserDao">
<select id="selectList" resultType="com.mfc.entity.User" parameterType="com.mfc.entity.User">
select * from user
<where>
<if test="id != 0">
and id = #{id}
</if>
<if test="username != null">
and username = #{username}
</if>
</where>
</select>
</mapper>

动态 SQL 之 标签

标签的属性含义:

  • collection:代表要遍历的几何元素,注意编写时不要写 #{}
  • open:代表语句的开始部分
  • close:代表语句的结束部分
  • item:代表遍历集合的每个元素,生成的变量名
  • sperator:代表分隔符

标签使用:

<mapper namespace="com.mfc.dao.UserDao">
<select id="findByIds" parameterType="list" resultType="com.mfc.entity.User">
select * from user
<where>
<foreach collection="array" open="id in(" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
</select>
</mapper>
2.2 SQL 片段抽取

Sql 中可以将重复的 Sql 提取出来,使用时用 include 引用即可,最终达到 SQL 重用的目的

四、MyBatis 映射

1. 一对一

实体类

public class Orders {
private Integer id;
private String ordertime;
private Double total;
private User user;
// set、get、toString 方法省略。。。
}
public class User {
private Integer id;
private String username;
// set、get、toString 方法省略。。。
}

映射文件

<mapper namespace="com.mfc.dao.OrdersDao">
<resultMap id="orderMap" type="com.mfc.entity.Orders">
<result property="id" column="id"></result>
<result property="ordertime" column="ordertime"></result>
<result property="total" column="total"></result>
<association property="user" javaType="com.mfc.entity.User">
<id property="id" column="uid"></id>
<result property="username" column="username"></result>
</association>
</resultMap>
<select id="selectOrders" resultMap="orderMap">
select * from orders o,user u where o.uid=u.id
</select>
</mapper>

2. 一对多

实体类

public class Orders {
private Integer id;
private String ordertime;
private Double total;
private Integer uid;
// set、get、toString 方法省略。。。
}
public class User {
private Integer id;
private String username;
private List<Orders> orders = new ArrayList<>();
// set、get、toString方法省略。。。
}

映射文件

<mapper namespace="com.mfc.dao.UserDao">
<resultMap id="userMap" type="com.mfc.entity.User">
<result property="id" column="id"></result>
<result property="username" column="username"></result>
<collection property="orders" ofType="com.mfc.entity.Orders">
<id property="id" column="oid"></id>
<result property="ordertime" column="ordertime"></result>
<result property="total" column="total"></result>
</collection>
</resultMap> <select id="selectUser" resultMap="userMap">
select *,o.id oid from user u left join orders o on o.uid=u.id
</select>
</mapper>

3. 多对多

实体类

public class User {
private Integer id;
private String username;
private List<Role> roles = new ArrayList<>();
// set、get、toString方法省略。。。
}
public class Role {
private Integer id;
private String rolename;
// set、get、toString方法省略。。。
}

映射文件

<mapper namespace="com.mfc.dao.UserDao">
<resultMap id="userMap" type="com.mfc.entity.User">
<result property="id" column="id"></result>
<result property="username" column="username"></result>
<collection property="roles" ofType="com.mfc.entity.Role">
<id property="id" column="rid"></id>
<result property="rolename" column="rolename"></result>
</collection>
</resultMap> <select id="selectUser" resultMap="userMap">
SELECT
u.*, r.id rid,
r.rolename rolename
FROM
USER u
LEFT JOIN user_role ur ON u.id = ur.uid
INNER JOIN role r ON ur.rid = r.id
</select>
</mapper>

MyBatis 使用(XML版本)的更多相关文章

  1. spring boot 整合mybatis 的xml版本【包括逆向工程以及分页插件】

    逆向工程很方便,可以直接根据数据库和配置文件生成pojo,mapper接口和相应的映射文件. xml版本和全注解版本其实差不多,大部分情况下,都会保留xml文件方便其他人去扩展新的dml方法. 文章旨 ...

  2. springboot使用之二:整合mybatis(xml方式)并添加PageHelper插件

    整合mybatis实在前面项目的基础上进行的,前面项目具体整合请参照springboot使用之一. 一.整合mybatis 整合mybatis的时候可以从mybatis官网下载mybatis官网整合的 ...

  3. Java DB 访问之 mybatis mapper xml 配置方式

    1 项目说明 项目采用 maven 组织 ,jdbc 唯一的依赖就是 mysql-connector-java pom 依赖如下: mysql 数据连接 : mysql-connector-java ...

  4. 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD

    使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...

  5. Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解

    封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...

  6. MyBatis Mapper.xml文件中 $和#的区别

    MyBatis Mapper.xml文件中 $和#的区别   网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...

  7. mybatis 与 xml

    mybatis的两大重要组件:配置和映射文件,都是可以通过xml配置的(新版本新增了注解的方式配置Mapper),下面来解析下mybatis是怎么做的 其中,关于配置文件解析的主要是在这个类XMLCo ...

  8. mybatis mapper.xml 配置文件问题(有的错误xml是不报的) 导致服务无法启动 。

    转载自 开源编程 一舟mybatsi xml编译报错,tomcat启动一直循环,导致内存溢出,启动失败 mapper.xml怎么知道有没有编译错误,哪个位置有错误 这应该是mybatis的一个bug, ...

  9. mybatis的xml文件中如何处理大小于号

    在mybatis的xml配置文件中会遇到大小于号转化的问题,解决问题的方法如下: 1.用转义字符把>和<替换掉 SELECT * FROM test WHERE AND start_dat ...

随机推荐

  1. Kubernetes的Controller进阶(十二)

    一.Controller 既然学习了Pod进阶,对于管理Pod的Controller肯定也要进阶一下,之前我们已经学习过的Controller有RC.RS和Deployment,除此之外还有吗,如果感 ...

  2. Vue2和Vue3技术整理1 - 入门篇 - 更新完毕

    Vue2 0.前言 首先说明:要直接上手简单得很,看官网熟悉大概有哪些东西.怎么用的,然后简单练一下就可以做出程序来了,最多两天,无论Vue2还是Vue3,就都完全可以了,Vue3就是比Vue2多了一 ...

  3. 洛谷P7814 「小窝 R3」心の記憶

    题意 第一行给定两个数字\(n\) \(m\) \((m \ge n)\)分别代表给定字符串长度以及需要构造出的字符串长度 第二行给定一个长度为\(n\)的字符串 (假设原来的字符串是\(a\) 需要 ...

  4. canvas绘制“飞机大战”小游戏,真香!

    canvas是ArkUI开发框架里的画布组件,常用于自定义绘制图形.因为其轻量.灵活.高效等优点,被广泛应用于UI界面开发中. 本期,我们将为大家介绍canvas组件的使用. 一.canvas介绍 1 ...

  5. 转载_认识C语言的32个关键字

    简单介绍: 1 auto : 声明自动变量 2 short :声明短整型变量或函数 3 int: 声明整型变量或函数 4 long :声明长整型变量或函数 5 float:声明浮点型变量或函数 6 d ...

  6. PTM人员(产品技术经理)

    以下是一位PTM的工作总结: 责任感 作为PTM一定要有责任感,项目中的所有事情都要作为自己的事情,如果碰到有些项目中的工作没人负责,那么就是PTM的工作没有做到位.   全局观 作为PTM一定要比普 ...

  7. Oracle - Trunc() 函数截取日期&截取数值

    Oracle TRUNC函数可以截取数字和日期类型:截取日期:select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; --显示当前时间 s ...

  8. netty系列之:不用怀疑,netty中的ByteBuf就是比JAVA中的好用

    目录 简介 ByteBuf和ByteBuffer的可扩展性 不同的使用方法 性能上的不同 总结 简介 netty作为一个优秀的的NIO框架,被广泛应用于各种服务器和框架中.同样是NIO,netty所依 ...

  9. uni-app、Vue3 + ucharts 图表 H5 无法渲染

    文章已收录到 github,欢迎 Watch 和 Star. 简介 从问题定位开始,到给框架(uni-app)提 issue.出解决方案(PR),再到最后的思考,详细记录了整个过程. 前序 当你在业务 ...

  10. 《PHP程序员面试笔试宝典》——如何回答技术性的问题?

    如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 程序员面试中,面试官会经常询问一些技术性的问题,有的问题可能比较简单,都是历年的面试.笔试真题,求职者在平时的复习中会经 ...