ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java框架--MyBatis

2022-07-17 17:45:24  阅读:178  来源: 互联网

标签:xml 语句 Java 映射 -- mybatis https MyBatis id


Java框架--MyBatis

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

中文手册:

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

https://mybatis.net.cn/

Maven仓库:

https://mvnrepository.com/

工作示意图

快速入门

代码参考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>

缓存

标签:xml,语句,Java,映射,--,mybatis,https,MyBatis,id
来源: https://www.cnblogs.com/shaozelong/p/16487807.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有