一、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. 【Vue源码学习】依赖收集

    前面我们学习了vue的响应式原理,我们知道了vue2底层是通过Object.defineProperty来实现数据响应式的,但是单有这个还不够,我们在data中定义的数据可能没有用于模版渲染,修改这些 ...

  2. 带你十天轻松搞定 Go 微服务系列(七)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务 产品服务 订单服务 支付服务 RPC 服务 Auth 验证( ...

  3. Java架构系列问题合集-目录

    接下来会做一个系列, 分类说明关于Java项目研发和架构工作需要了解的问题 Java语法 Java语法专题1: 类初始化的构造顺序 https://www.cnblogs.com/milton/p/1 ...

  4. MySQL server has gone away 异常

    原因 一种可能是发送的SQL语句太长,以致超过了max_allowed_packet的大小,如果是这种原因,你只要修改my.cnf,加大max_allowed_packet的值即可. 还有一种可能是因 ...

  5. opencv结构IplImage

    转载请注明来源:https://www.cnblogs.com/hookjc/ typedef struct _IplImage{int nSize;                    /* Ip ...

  6. Spring中声明式事务的几个属性的解释

    声明式事务 @Transactional (通常用在service层)事务属性:传播行为,隔离级别,回滚,只读,过期 1,spring支持事务传播行为:propagation(常用以下两个)    ① ...

  7. SQLMAP配置洋葱路由

    [笔者目前使用的系统是kali渗透系统] =================================================================== 首先下载tor apt ...

  8. ELK-EFK-v7.12.0日志平台部署

    ELK和EFK是什么 ELK和EFK是四个开源产品的组合: Elasticsearch 一个基于Lucene搜索引擎的NoSQL数据库 Logstatsh 一个日志管道工具,接受数据输入,执行数据转换 ...

  9. netty系列之:channel,ServerChannel和netty中的实现

    目录 简介 channel和ServerChannel netty中channel的实现 AbstractChannel和AbstractServerChannel LocalChannel和Loca ...

  10. Vue 源码解读(5)—— 全局 API

    目标 深入理解以下全局 API 的实现原理. Vue.use Vue.mixin Vue.component Vue.filter Vue.directive Vue.extend Vue.set V ...