Java框架–MyBatis


Java框架–MyBatis

简化数据库操作的持久层框架

中文手册:

https://mybatis.org/mybatis-3/zh/index.html

https://mybatis.net.cn/

Maven仓库:

https://mvnrepository.com/

工作示意图

Java框架--MyBatis

快速入门

代码参考gitee仓库,其中使用maven两个功能:继承父工程环境、创建配置资源拷贝

日志输出

日志文档:

https://mybatis.org/mybatis-3/zh/logging.html

配置日志:

https://mybatis.org/mybatis-3/zh/configuration.html#settings

框架核心原理图

Java框架--MyBatis

  • 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

(0)
上一篇 2022年7月17日
下一篇 2022年7月17日

相关推荐

发表回复

登录后才能评论