Java框架–MyBatis
简化数据库操作的持久层框架
中文手册:
https://mybatis.org/mybatis-3/zh/index.html
Maven仓库:
工作示意图
快速入门
代码参考gitee仓库,其中使用maven两个功能:继承父工程环境、创建配置资源拷贝
日志输出
日志文档:
https://mybatis.org/mybatis-3/zh/logging.html
配置日志:
https://mybatis.org/mybatis-3/zh/configuration.html#settings
框架核心原理图
- mybatis的核心配置文件
- mybatis-config.xml:进行全局配置,全局只能有一个这样的配置文件
- XxxMapper.xml配置多个SQL,可以有多个XxxMappe.xml配置文件
- 通过mybatis-config.xml配置文件得到SqlSessionFactory
- 通过SqlSessionFactory得到SqlSession,用SqlSession就可以操作数据了
- SqlSession底层是Executor(执行器),有2重要的实现类,有很多方法
- MappedStatement是通过XxxMapper.xml中定义,生成的statement对象
- 参数输入执行并输出结果集,无需手动判断参数类型和参数下标位置,且自动将结果集映射为Java对象
原生的API&注解的方式
原生API,直接使用API来操作数据(其实就是把底层的api直接使用,该配置的xml、接口也还是需要配置)
//=============add==================
sqlSession.insert("com.hspedu.mapper.MonsterMapper.addMonster",monster);
//=============del==================
sqlSession.delete("com.hspedu.mapper.MonsterMapper.delMonster",3);
//=============update==================
sqlSession.update("com.hspedu.mapper.MonsterMapper.updateMonster",monster);
注解的方式,可不再使用MonsterMapper.xml(但是仍需要在mybatis-config.xml注册含注解的类),但其实不推荐此方式,没有解耦
// 注册xml(原来)
<mapper resource="com.hspedu.mapper.MonsterMapper.xml"/>
// 注册注解类
<mapper class="com.hspedu.mapper.MonsterAnnotation"/>
注解类代码参考gitee仓库
配置文件
mybatis的核心配置文件(mybatis-config.xml),实现配置jdbc连接信息,注册mapper
文档地址:
https://mybatis.org/mybatis-3/zh/configuration.html
- settings全局参数定义
- typeAliases别名处理器
- typeHandlers类型处理器(Mybatis的映射基本已经满足,不太需要重新定义)
- environments环境
- 注册mapper: xml文件、注解类、url:外部路径(使用很少,不推荐)、package方式注册(当一个包下有很多的Mapper.xml文件和基于注解实现的接口时为了方便,我们可以以包方式进行注册)
映射文件
XxxxMapper.xml-SQL映射文件
文档地址:
https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
常用的顶级元素:
按照应被定义的顺序列出
-
cache–该命名空间的缓存配置。
-
cache-ref–引用其它命名空间的缓存配置。
-
resultMap–描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
-
parameterType-将会传入这条语句的参数的类全限定名或别名
-
sql–可被其它语句引用的可重用语句块。
-
insert–映射插入语句。
-
update–映射更新语句。
-
delete–映射删除语句。
-
select–映射查询语句。
动态SQL语句
处理更复杂的查询业务需求
文档地址:
https://mybatis.org/mybatis-3/zh/dynamic-sql.html
常用标签
1.if[判断]
2.where[拼接where子句]
3.choose/when/otherwise[类似java的switch语句,注意是单分支]
4.foreach[类似in]
5.trim[替换关键字/定制元素的功能
6.set[在update的set中,可以保证进入set标签的属性被修改,而没有进入set的,保持原来的值]
使用案例代码请参考gitee仓库
映射关系1对1
关键代码(相互引用时注意sout输出代码会造成栈溢出)
//不推荐,使用联合查询
<resultMap id="PersonResultMap" type="Person">
<!--<result property="id" column="id"/>-->
<!--id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
1.property="id" 表示person 属性 id ,通常是主键
2.column="id" 表示对应表的字段
-->
<id property="id" column="id"/>
<result property="name" column="name"/>
<!--association – 一个复杂类型的关联
1. property="card" 表示 Person对象的 card 属性
2. javaType="IdenCard" 表示card 属性 的类型
3. column="id" 是从我们的 下面这个语句查询后返回的字段
SELECT * FROM `person`,`idencard` WHERE `person`.id=1
AND `person`.card_id = `idencard`.id
-->
<association property="card" javaType="IdenCard">
<result property="id" column="id"/>
<result property="card_sn" column="card_sn"/>
</association>
</resultMap>
<select id="getPersonById" parameterType="Integer"
resultMap="PersonResultMap">
SELECT * FROM `person`,`idencard` WHERE `person`.id = #{id}
AND `person`.card_id = `idencard`.id
</select>
================================================================================
//推荐方式,使用嵌套其他select方法
<resultMap id="PersonResultMap2" type="Person">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!--
1. mybatis第二种方式核心思想: 将这个多表联查,分解成单表操作 , 这样简洁,而且易于维护 ,推荐
2. 而且可以复用你已经写好的方法 -组合
3. property="card": 表示 Person对象的 card 属性
4. column="card_id" 这个是
SELECT * FROM `person` WHERE `id` = #{id} 返回的 字段 card_id 信息/数据
5. 返回的 字段 card_id 信息/数据 作为getIdenCardById入参, 来执行
-->
<association property="card" column="card_id"
select="com.hspedu.mapper.IdenCardMapper.getIdenCardById" />
</resultMap>
<select id="getPersonById2" parameterType="Integer" resultMap="PersonResultMap2">
SELECT * FROM `person` WHERE `id` = #{id}
</select>
映射关系1对多
关键代码(相互引用时注意sout输出代码会造成栈溢出)
<resultMap id="UserResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!--解读:因为pets属性是集合,因此这里需要是collection标签来处理
1. ofType="Pet" 指定返回的集合中存放的数据类型Pet
2. collection 表示 pets 是一个集合
3. property="pets" 是返回的user对象的属性 pets
4. column="id" SELECT * FROM `mybatis_user` WHERE `id` = #{id} 返回的id字段对应的值
-->
<collection property="pets" column="id" ofType="Pet"
select="com.hspedu.mapper.PetMapper.getPetByUserId"/>
</resultMap>
<select id="getUserById" parameterType="Integer" resultMap="UserResultMap">
SELECT * FROM `mybatis_user` WHERE `id` = #{id}
</select>
缓存
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/275007.html