一、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. Airtest 的连接安卓模拟器

    1. 开启安卓模拟器 2. 查看进程,MEmuHeadless.exe的进行程号, 然后在cmd中输入 netstat -ano|findstr "16116" 3. 到 airt ...

  2. ES6之async与await

    · async - await 是 Promise 和 Generator 的语法糖,目的只是为了让我们书写代码时更加流畅,增强代码的可读性. · async - await 是建立在Promise机 ...

  3. 第09讲:Flink 状态与容错

    Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...

  4. SharePoint Online 为Modern Page添加脚本

    前言 众所周知,如果我们想向SharePoint 页面添加脚本,最方便的便是经典页面,添加方式主要有内容编辑器Web部件或者直接使用SharePoint Designer. 但是,如果页面是Moder ...

  5. AT2401 [ARC072C] Alice in linear land

    基于观察,可以发现这样一条性质: 我们并不关心当前位置和终点的绝对关系,只在乎当前位置和终点的距离,当这个距离确定的时候接下来能走到的位置也是确定的. 基于这个观察可以发现,本质上每个位置的状态就是和 ...

  6. 分子动力学模拟之基于自动微分的LINCS约束

    技术背景 在分子动力学模拟的过程中,考虑到运动过程实际上是遵守牛顿第二定律的.而牛顿第二定律告诉我们,粒子的动力学过程仅跟受到的力场有关系,但是在模拟的过程中,有一些参量我们是不希望他们被更新或者改变 ...

  7. response.getWriter().write()和 response.getWriter().print()的区别 以及 PrintWriter对象 和 out对象 的区别

    感谢原文作者:krismile__qh 原文链接:https://blog.csdn.net/krismile__qh/article/details/89926001 一.response.getW ...

  8. Java多线程基础-ThreadLocal

    感谢原文作者:Yuicon 原文链接:https://segmentfault.com/a/1190000016705955 序 在多线程环境下,访问非线程安全的变量时必须进行线程同步,例如使用 sy ...

  9. js将HTML中table导出到EXCEL word (只支持IE) 另用php 配合AJAX可以支持所有浏览器

    转载请注明来源:https://www.cnblogs.com/hookjc/ <HTML>     <HEAD>       <title>WEB页面导出为EXC ...

  10. java基础之抽象类的介绍

    抽象类的特点: 1.当方法只有声明没有具体实现的时候,需要用abstract修饰符修饰.抽象方法必须定义在抽象类当中,所以抽象类也需要用abstract修饰 2.抽象类不可以被实例化,为什么呢?   ...