Fluent Mybatis快速入门详细教程

使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一。 不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数。喜欢的朋友可以阅读这篇文章   http://www.jb51.net/article/218884.htm

对底层数据表关联关系的处理,我们总是绕不开什么一对一,一对多,多对多这里比较烦人的关系。 业界优秀的ORM框架也都给出了自己的答案,简单来说就以下几种方式:

hibernate和JPA对开发基本屏蔽了底层数据的处理,只需要在model层设置数据级联关系即可。但这种设置也往往是噩梦的开始。
mybatis 提供了简单的@One @Many注解,然后编写xml映射关系来提供级联处理。
还有一种就是干脆不依赖框架,直接应用自己掌控。
因为FluentMybatis是基于mybatis上做封装和扩展的,所以这里主要聊聊mybatis处理的方式,以及给出FluentMybatis的解放方案。

那么就可以建以下3张表:

数据字典

CREATE TABLE t_member
(
id bigint(21) unsigned auto_increment primary key COMMENT ‘主键id',
user_name varchar(45) DEFAULT NULL COMMENT ‘名字',
is_girl tinyint(1) DEFAULT 0 COMMENT ‘0:男孩; 1:女孩',
age int DEFAULT NULL COMMENT ‘年龄',
school varchar(20) DEFAULT NULL COMMENT ‘学校',
gmt_created datetime DEFAULT NULL COMMENT ‘创建时间',
gmt_modified datetime DEFAULT NULL COMMENT ‘更新时间',
is_deleted tinyint(1) DEFAULT 0 COMMENT ‘是否逻辑删除'
) ENGINE = InnoDB
CHARACTER SET = utf8 COMMENT = ‘成员表:女孩或男孩信息';

CREATE TABLE t_member_love
(
id bigint(21) unsigned auto_increment primary key COMMENT ‘主键id',
girl_id bigint(21) NOT NULL COMMENT ‘member表外键',
boy_id bigint(21) NOT NULL COMMENT ‘member表外键',
status varchar(45) DEFAULT NULL COMMENT ‘状态',
gmt_created datetime DEFAULT NULL COMMENT ‘创建时间',
gmt_modified datetime DEFAULT NULL COMMENT ‘更新时间',
is_deleted tinyint(2) DEFAULT 0 COMMENT ‘是否逻辑删除'
) ENGINE = InnoDB
CHARACTER SET = utf8 COMMENT = ‘成员恋爱关系';

CREATE TABLE t_member_favorite
(
id bigint(21) unsigned auto_increment primary key COMMENT ‘主键id',
member_id bigint(21) NOT NULL COMMENT ‘member表外键',
favorite varchar(45) DEFAULT NULL COMMENT ‘爱好: 电影, 爬山, 徒步…',
gmt_created datetime DEFAULT NULL COMMENT ‘创建时间',
gmt_modified datetime DEFAULT NULL COMMENT ‘更新时间',
is_deleted tinyint(2) DEFAULT 0 COMMENT ‘是否逻辑删除'
) ENGINE = InnoDB
CHARACTER SET = utf8 COMMENT = ‘成员爱好';

添加项目Maven依赖
具体pom.xml文件

代码生成

public class AppEntityGenerator {

static final String url = “jdbc:mysql://localhost:3306/fluent_mybatis_demo?useSSL=false&useUnicode=true&characterEncoding=utf-8”;
/**
* 生成代码的package路径
*/
static final String basePackage = “cn.org.fluent.mybatis.many2many.demo”;

public static void main(String[] args) {
    FileGenerator.build(Noting.class);
}

@Tables(
    /** 数据库连接信息 **/
    url = url, username = "root", password = "password",
    /** Entity类parent package路径 **/
    basePack = basePackage,
    /** Entity代码源目录 **/
    srcDir = "example/many2many_demo/src/main/java",
    /** 如果表定义记录创建,记录修改,逻辑删除字段 **/
    gmtCreated = "gmt_create", gmtModified = "gmt_modified", logicDeleted = "is_deleted",
    /** 需要生成文件的表 ( 表名称:对应的Entity名称 ) **/
    tables = @Table(value = {"t_member", "t_member_love", "t_member_favorite"}, tablePrefix = "t_")
)
static class Noting {
}}

这样就生成了3个Entity类: MemberEntity, MemberFavoriteEntity, MemberLoveEntity。

关系分析

现在我们来理一理这里面的关系

一对多: 一个成员可以有多个爱好
多对多: 一个成员可以有多个男女朋友(前任+现任)
一对一: 一个成员只能有一个现任男女朋友
mybatis处理手法
mybatis提供了@One 和 @Many的注解来处理简单(只有主键和外键依赖)的一对一,和一对多的关系 具体到上面的关系,mybatis只能关联查询成员的爱好,对带条件的(不是只通过外键)现任男女朋友的一对一也没有办法处理。

我这里就不具体展开mybatis的配置语法了,感兴趣读者可以看下下面文章:

Mybatis一对多、多对一处理

Mybatis传递多个参数进行SQL查询的用法

MyBatis注解 & 多对一、一对多

MyBatis系列4:一对一,一对多,多对多查询及延迟加载(N+1问题)分析

鉴于mybatis只能处理简单的关联关系,fluent mybatis就没有直接封装mybatis的处理方式,那fluent mybatis是如何处理上述的关联关系的。 我们先从mybatis也可以处理的一对多的爱好列表入手

一对多的爱好列表处理
fluent mybatis要根据MemberEntity自动返回对应的爱好列表,需要下面几个设置:

MemberEntity继承RichEntity基类
在MemberEntity类里面增加方法 findMyFavorite()
给findMyFavorite方法加上注解 @RefMethod
在注解中增加关联关系: “memberId=id”,意思是 MemberFavoriteEntity.memberId等于MemberEntity.id
具体代码片段如下, 所有这些操作都可以通过代码生成,这里手工添加仅仅是为了讲解

public class MemberEntity extends RichEntity implements IEntity {
// …
/**
* 我的爱好列表
*
* @return
*/
@RefMethod(“memberId=id”)
public List findMyFavorite() {
return super.loadCache(“findMyFavorite”, MemberEntity.class);
}
}

好了,我们已经建立好通过Member实例查询爱好列表的功能了,重新编译项目 在generated-sources目录下面,会多出一个文件: Refs

/**
*

Refs:o - 查询器,更新器工厂类单例引用o - 应用所有Mapper Bean引用o - Entity关联对象延迟加载查询实现@author powered by FluentMybatis
*/
public abstract class Refs extends EntityRefQuery {
public List findMyFavoriteOfMemberEntity(MemberEntity entity) {
return memberFavoriteMapper.listEntity(new MemberFavoriteQuery()
.where.memberId().eq(entity.getId())
.end());
}
}

在这个类里面自动生成了一个方法: findMyFavoriteOfMemberEntity, 入参是MemberEntity, 出参是List, 实现里面根据member的id查询了成员的所有爱好。

增加Spring Bean
我们新建一个类: AllRelationQuery (名称根据你的喜好和业务随便取), 继承Refs, 并把AllRelationQuery加入Spring管理即可。

@Service
public class AllRelationQuery extends Refs {
}

老套路,写个测试验证下

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class FindMemberFavoriteTest {
@Autowired
private MemberMapper memberMapper;

@Before
public void setup() {
    // 省略数据准备部分
}

@Test
public void findMyFavorite() {
    MemberEntity member = memberMapper.findById(1L);
    List<MemberFavoriteEntity> favorites = member.findMyFavorite();
    System.out.println("爱好项: " + favorites.size());
}

}

查看控制台log输出

DEBUG - ==> Preparing: SELECT id, …, user_name FROM t_member WHERE id = ?
DEBUG - > Parameters: 1(Long)
DEBUG - < Total: 1
DEBUG - ==> Preparing: SELECT id, …, member_id FROM t_member_favorite WHERE member_id = ?
DEBUG - > Parameters: 1(Long)
DEBUG - < Total: 2
爱好项: 2

如日志所示,Fluent Mybatis按照预期返回了爱好列表。

给一对多关系添点油加点醋
做过业务系统的同学都知道,数据库中业务数据一般会有一个逻辑删除标识,按照上述逻辑查询出来的数据,我们会把已经废弃(逻辑删除掉)的爱好也一并查询出来了,那我们如何只查询出未逻辑删除(is_deleted=0)的爱好列表呢。

如果采用mybatis的方案,那我们只能耸耸肩,摊开双手说: “爱莫能助,你自己写SQL实现吧”, 但fluent mybatis对这类场景的支持的很好,我们只要给@RefMethod注解值加点条件就可以了, MemberFavoriteEntity.memberId=MemberEntity.id并且Favorite的逻辑删除标识和Member表一样,具体定义如下:

public class MemberEntity extends RichEntity implements IEntity {
@RefMethod(“memberId=id && isDeleted=isDeleted”)
public List findMyFavorite() {
return super.loadCache(“findMyFavorite”, MemberEntity.class);
}
}

重新编译项目,观察Refs代码

public abstract class Refs extends EntityRefQuery {
public List findMyFavoriteOfMemberEntity(MemberEntity entity) {
return memberFavoriteMapper.listEntity(new MemberFavoriteQuery()
.where.isDeleted().eq(entity.getIsDeleted())
.and.memberId().eq(entity.getId())
.end());
}
}

查询条件上带上了逻辑删除条件

跑测试,看log

DEBUG - ==> Preparing: SELECT id, …, user_name FROM t_member WHERE id = ?
DEBUG - > Parameters: 1(Long)
DEBUG - < Total: 1
DEBUG - ==> Preparing: SELECT id, …, member_id FROM t_member_favorite
WHERE is_deleted = ?
AND member_id = ?
DEBUG - > Parameters: false(Boolean), 1(Long)
DEBUG - < Total: 2
爱好项: 2

FluentMybatis轻松处理了多条件关联的一对多关系, 这个在业务中不仅仅限定于逻辑删除, 还可以推广到部署环境标识(deploy_env), 租户关系等条件上,还有只有你业务中才用到的状态相关的关系上。

Fluent Mybatis对多对多关系处理
fluent mybatis可以轻松处理一对一,一对多的简单和多条件的关联关系,但对多对多也没有提供自动化代码生成的处理手段。 因为多对多,本质上涉及到3张表, A表, B表,AB关联表。 但fluent mybatis还是提供了半自动手段,对这类场景进行了支持,比如我们需要MemberEntity中返回所有前任恋人列表。

在MemberEntity中定义方法: exFriends()

public class MemberEntity extends RichEntity implements IEntity {
/**
* 前任男(女)朋友列表
*
* @return
*/
@RefMethod
public List findExFriends() {
return super.loadCache(“findExFriends”, MemberEntity.class);
}
}

和上面的自动化的一对多关系有个区别,@RefMethod上没有设置查询条件,我们重新编译项目。 我们观察Refs类,除了刚才的findMyFavoriteOfMemberEntity方法实现外,还多出一个抽象方法: findExFriendsOfMemberEntity

public abstract class Refs extends EntityRefQuery {
/**
* 返回前任男(女)朋友列表
*/
public abstract List findExFriendsOfMemberEntity(MemberEntity entity);
}

在动手实现代码前,我们先分析一下混乱的男女朋友关系
在member表上,我们使用了一个性别字段 is_girl来区别是男的还是女的, 在恋爱关系表上,分别有2个外键girl_id, boy_id来标识一对恋人关系。 这样,如果member是女的,要查询所有前任男朋友,那么sql语句就如下:

select * from t_member
where is_deleted=0
and id in (select boy_id from t_memeber_love
where status = ‘前任'
and girl_id = ? – 女孩id
and is_deleted = 0
)

如果member是男的,要查询所有前任女朋友,那么sql语句条件就要倒过来:

select * from t_member
where is_deleted=0
and id in (select girl_id from t_memeber_love
where status = ‘前任'
and boy_id= ? – 男孩id
and is_deleted = 0
)

实现查询前男(女)朋友列表功能
一般来说,为了实现上面的分支查询,在mybatis的xml文件中需要配置 这样的标签代码分支, 或者在java代码中实现 if(…){}else{}的代码逻辑分支。 那我们来看看fluent mybatis时如何实现上述查询的呢?我们就可以在刚才定义的Refs子类上实现findExFriendsOfMemberEntity自己的逻辑。

@Service
public class AllRelationQuery extends Refs {
@Override
public List findExFriendsOfMemberEntity(MemberEntity entity) {
MemberQuery query = new MemberQuery()
.where.isDeleted().isFalse()
.and.id().in(MemberLoveQuery.class, q -> q
.select(entity.getIsGirl() ? boyId.column : girlId.column)
.where.status().eq(“前任”)
.and.isDeleted().isFalse()
.and.girlId().eq(entity.getId(), o -> entity.getIsGirl())
.and.boyId().eq(entity.getId(), o -> !entity.getIsGirl())
.end())
.end();
return memberMapper.listEntity(query);
}
}

写测试看log

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class FindExFriendsTest {
@Autowired
private MemberMapper memberMapper;

@Test
public void findExBoyFriends() {
    MemberEntity member = memberMapper.findById(1L);
    System.out.println("是否女孩:" + member.getIsGirl());
    List<MemberEntity> boyFriends = member.findExFriends();
    System.out.println(boyFriends);
}

}

控制台日志

DEBUG - ==> Preparing: SELECT id, …, user_name FROM t_member WHERE id = ?
DEBUG - > Parameters: 1(Long)
DEBUG - < Total: 1
是否女孩:true
DEBUG - ==> Preparing: SELECT id, …, user_name FROM t_member
WHERE is_deleted = ?
AND id IN (SELECT boy_id
FROM t_member_love
WHERE status = ?
AND is_deleted = ?
AND girl_id = ?)
DEBUG - > Parameters: false(Boolean), 前任(String), false(Boolean), 1(Long)
DEBUG - < Total: 1
[MemberEntity(id=2, gmtModified=Sun Nov 08 12:31:57 CST 2020, isDeleted=false, age=null, gmtCreated=null, isGirl=false, school=null, userName=mike)]

如日志所示,在查询前男友列表是,条件会根据Member的是否是女孩进行分支切换,这也是fluent mybatis动态条件强大的地方。

到此这篇关于FluentMybatis快速入门详细教程的文章就介绍到这了,更多相关Fluent Mybatis入门内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot 整合fluent mybatis的过程,看这篇够了

    1.导入pom依赖 <!-- mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <!--mysql依赖--> <de

  • Java Fluent Mybatis实战之构建项目与代码生成篇下

    目录 前言 依赖补充 数据库文件配置 测试代码 增加扫描mapper注解 执行测试代码 总结 前言 上一篇文章已经介绍了fluent-mybatis项目的构建,文章地址:Java Fluent Mybatis实战之构建项目与代码生成篇上 这篇文章继续之前的项目,对代码进行基本调试.验证代码操作数据库情况. 依赖补充 按照官方给的代码依赖是不够的,这里需要对maven的pom文件进行补充. <dependency> <groupId>org.mybatis.spring.boot&l

  • Java Fluent Mybatis实战之构建项目与代码生成篇上

    目录 简述 特性 项目搭建 maven依赖引入-fluent-mybatis 表构建 代码生成工具类 解决类找不到问题 总结 简述 偶然看到一篇关于阿里新orm框架的文章,好奇的点了进去.开发后端多年,看到这个还是有点兴奋的.常用mysql的orm框架mybatis.jpa,到后来的优化框架mybatis-plus都是用过,他们或多或少都有优缺点吧.程序员本就是日常革新技术的职业,所以了解更多的框架绝对不会有错误.所以我尝试着把自己学习该框架的过程,记录下来,尽可能去掉一些项目工程中用不到的功能

  • Fluent Mybatis实现环境隔离和租户隔离

    目录 什么是环境隔离和多租户隔离 环境隔离和多租户隔离需要做的事情 环境隔离和租户隔离工具类 隔离前准备工作 增删改查环境和租户隔离演示 新增数据 查询数据 更新数据 总结 什么是环境隔离和多租户隔离 我们在实际的业务开发中,经常会碰到环境逻辑隔离和租户数据逻辑隔离的问题. 环境隔离 我们的开发系统过程中,经常会涉及到日常开发环境,测试环境,预发环境和线上环境,如何区隔这些环境,有些方案是采用独立的数据库,有些是采用同一套数据库(比如线下多个测试环境使用同一个数据库,预发环境和线上环境使用同一个

  • Fluent Mybatis 批量更新的使用

    目录 批量更新同一张表的数据 更新多条数据,每条数据都不一样 java中for循环实现方式 一条SQL,服务端逐条更新 mybatis实现方式 使用FluentMybatis实现方式 使用mysql的Case When then方式更新 mybatis原生实现方式 批量更新不同的表数据 参考 批量更新同一张表的数据 更新多条数据,每条数据都不一样 背景描述 通常需要一次更新多条数据有两个方式 在业务代码中循环遍历,逐条更新 一次性更新所有数据, 采用批量sql方式,一次执行. 更准确的说是一条s

  • Fluent Mybatis如何做到代码逻辑和sql逻辑的合一

    使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一.不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数.那对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢? 场景需求设置 我们通过一个比较典型的业务需求来具体实现和对比下,假如有学生成绩表结构如下: create table `student_score` ( id big

  • Fluent Mybatis零xml配置实现复杂嵌套查询

    目录 嵌套查询 in (select 子查询) exists (select子查询) 嵌套查询 使用Fluent Mybatis, 不用手写一行xml文件或者Mapper文件,在dao类中即可使用java api构造中比较复杂的嵌套查询. 让dao的代码逻辑和sql逻辑合二为一. 前置准备,maven工程设置 参考文章 使用FluentMybatis实现mybatis动态sql拼装和fluent api语法 in (select 子查询) 嵌套查询表和主查询表一样的场景 .column().in

  • Fluent MyBatis实现动态SQL

    目录 数据准备 代码生成 在 WHERE 条件中使用动态条件 在 UPDATE 使用动态更新 choose 标签 参考 MyBatis 令人喜欢的一大特性就是动态 SQL.在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的, MyBatis虽然提供了动态拼装的能力,但这些写xml文件,也确实折磨开发.Fluent MyBatis提供了更贴合Java语言特质的,对程序员友好的Fluent拼装能力. Fluent MyBatis动态SQL,写SQL更爽 数据准备 为了后

  • Java Fluent Mybatis 聚合查询与apply方法详解流程篇

    前言 接着上一篇文章:Java Fluent Mybatis 分页查询与sql日志输出详解流程篇 我把分页已经调整好了,现在实验一下官方给出的聚合查询方法. GitHub代码仓库:GitHub仓库 数据准备 为了聚合查询的条件,添加了几条数据. MIN 我们试着获取最小的年龄. 方法实现 @Override public Integer getAgeMin() { Map<String, Object> result = testFluentMybatisMapper .findOneMap(

  • Fluent Mybatis快速入门详细教程

    使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一. 不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数.喜欢的朋友可以阅读这篇文章   http://www.jb51.net/article/218884.htm 对底层数据表关联关系的处理,我们总是绕不开什么一对一,一对多,多对多这里比较烦人的关系. 业界优秀的ORM框架也都给出了自己的答案,简单来说就以下几种方式: hibe

  • FluentMybatis快速入门详细教程

    使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一. 不再需要在Dao中组装查询或更新操作,在xml或mapper中再组装参数. 对底层数据表关联关系的处理,我们总是绕不开什么一对一,一对多,多对多这里比较烦人的关系. 业界优秀的ORM框架也都给出了自己的答案,简单来说就以下几种方式: hibernate和JPA对开发基本屏蔽了底层数据的处理,只需要在model层设置数据级联关系即可.但这种设置也往往

  • NodeJS中的MongoDB快速入门详细教程

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 一.MongoDB必须理解的概念 1.数据库:每个数据库都有自己的权限和集合. 2.文档:一个键值对. 3.集合:一组文档,即一组键值对.当第一个文档插入时,集合就会被创建. 二.Mac下的MongoDB安装和启动 1.使用brew进行安装:brew ins

  • mybatis快速入门学习教程新手注意问题小结

    什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个共同点: 1. 从配置文件(通常是XML配置文件中)得到 ses

  • MyBatis入门学习教程-MyBatis快速入门

    目录 Mybatis 一.快速开始 1.创建 Maven 项目 2.导入 Maven 依赖 3.配置 Maven 插件 4.新建数据库,导入表格 5.编写 Mybatis 配置文件 6.编写实体类 7.编写 mapper 接口 8.编写 mapper 实现 9.Mybatis 配置文件中,添加 mapper 映射 10.编写 Mybatis 工具类 11.测试 二.日志添加 1.添加 Maven 依赖 2.添加 log4j 配置 3.Mybatis 中配置 LOG 4.执行测试 三.Mybati

  • MyBatis入门学习教程(一)-MyBatis快速入门

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) 首先给大家介绍MyBatis的含义

  • MyBatis Plus工具快速入门使用教程

    MyBatis-plus有什么特色 1.代码生成 2.条件构造器 对我而言,主要的目的是使用它强大的条件构建器. 快速使用步骤: 1.添加pom文件依赖 <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> <dep

  • Java持久层框架Mybatis入门详细教程

    mybatis介绍 mybatis它是轻量级持久层框架,由ibatis演化而来.它自动连接数据库,将数据库的结果集封装到对象中POJO. POJO: 一个简单的Java类,这个类没有实现/继承任何特殊的java接口或者类,不遵循任何主要java模型,约定或者框架的java对象.在理想情况下,POJO不应该有注解. JavaBean: JavaBean是可序列化的,实现了serializable接口 具有一个无参构造器 有按照命名规范的set和gett,is(可以用于访问布尔类型的属性)方法 My

  • MyBatis快速入门之环境搭建和单表映射

    一.MyBatis简介 一说起对象关系映射框架,大家第一时间想到的肯定是Hibernate.Hibernate作为一个著名的框架,功能十分强大.我们只需要配置好实体类和数据表之间的关系,Hibernate就会自动帮我们完成生成并执行SQL语句,映射结果集这样的工作.但是也正是由于Hibernate如此强大的功能,导致了它的缺点:一是非常笨重,启动Hibernate的SessionFactory非常耗时,开销巨大:二是配置复杂,学习成本较高,系统调优也不容易:三是自定义查询功能较弱,查询结果如果不

  • Java Mybatis框架入门基础教程

    一.Mybatis介绍 MyBatis是一款一流的支持自定义SQL.存储过程和高级映射的持久化框架.MyBatis几乎消除了所有的JDBC代码,也基本不需要手工去 设置参数和获取检索结果.MyBatis能够使用简单的XML格式或者注解进行来配置,能够映射基本数据元素.Map接口和POJOs(普通java对象)到数据库中的记录. 二.MyBatis工作流程 (1)加载配置并初始化 触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个

随机推荐