Mybatis入门开发问题合集

仅用于个人的学习整理及问题解决。

1. Mybatias常见问题

1.1 Dao - xml 传参

  • 传参基础类型 如id参数
    public String getUserNameByID(@Param("id")Long id)
    
    <select id="getUserNameByID" resultType="java.lang.String">
     Select name from User where id =#{id}
     </select>
    
  • 传参实体类类型 如User实体类参数
    public String getUserInfoByUser(@Param("user")User user)
    
    <select id="getUserInfoByUser" resultType="java.lang.String">
     Select * from User where id =#{user.id}
     </select>
    

1.2 获取返回对象类型问题

  • 返回基础数据类型 如String

    public String getUserNameByID(@Param("id")Long id)
    
    <select id="getUserNameByID" resultType="java.lang.String">
     Select name from User where id =#{id}
     </select>
    
  • 返回实体类User对象

    public User getUserByID(@Param("userId") Long userId)
    
    	<resultMap class="包.User" id="User">
    	  <result property="id" column="ID" />
    	  <result property="name" column="NAME" />
    	 </resultMap>
    	<select id="getUserByID" resultMap="User">
    	 Select ID,NAME from User where id =#{userId}
    	 </select>
    

    备注: xml配置返回类型氛围 resultTyperesultMap
    resultTpe:

    1).可以指定基本的数据类型 如:Integer,String,Long …
    2).可以指定对象类型 如: User,Student,Book…

    resultMap:

    常用于指定对象类型,且对象中包含集合情况,即一对多场景使用

        <resultMap type="com.***.base.rpc.pojo.vo.TaskClassVO" id="MyTaskClassVO">
        <result column="prefix" property="prefix"/>
        <result column="classYear" property="classYear"/>
        <result column="gradeId" property="gradeId"/>
        <!--
            collection定义关联集合类型的属性的封装规则
            ofType:指定集合里面元素的类型
        -->
        <collection property="classInfoList" ofType="com.***.base.rpc.pojo.vo.ClassInfoVO">
            <!-- 定义这个集合中元素的封装规则 -->
            <id column="id" property="id"/>
            <result column="className" property="className"/>
            <result column="isCollectFace" property="isCollectFace"/>
        </collection>
    </resultMap>
    <!--	通过orgId获取人脸班级列表		-->
    <select id="selectClassListByParam" resultMap="MyTaskClassVO">
        SELECT
        c.prefx prefix,
        c.class_year classYear,
        c.grade_id gradeId,
        c.id id,
        c.class_name className,
        ${typeId} as  isCollectFace
        FROM
        tb_class c inner JOIN tb_student s on c.id = s.class_id
        WHERE
        c.org_id =#{orgId}
        and c.is_delete = 0
        <if test="typeId == 0 ">
        and s.is_collect_face = 0
        </if>
        <if test="typeId == 1 ">
            AND
            c.id not in (
            SELECT c.id
            FROM tb_class c
            inner JOIN tb_student s
            ON c.id = s.class_id
            WHERE c.org_id =#{orgId} and c.is_delete = 0 and s.is_collect_face = 0
            )
        </if>
        <if test="classIds != null and classIds.size() > 0 ">
            AND
            c.id in
            <foreach collection="classIds" item="classId" index="index" open="(" close=")" separator=",">
                #{classId}
            </foreach>
        </if>
        GROUP BY
        c.prefx,
        c.class_year,
        c.grade_id
    </select>
    

1.3 idea - Mybatis Log Plugin 使用

  • 使用原因:进行sql问题排查,方便sql调优及控制台查看sql
  • 安装插件:*
  • yml配置:配置安装后可能会出现sql日志无法打印的情况,配置指向dao数据库操作包文件
logging:
      level:
        com.***.**.dao:  debug

1.4 mybatis常见问题及知识点集锦

  • Q1:Expected one result (or null) to be returned by selectOne(), but found: 2?
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

解决

情况1:该查询原本有多条结果集,所以将查询结果集,由单一的实体类接受,改为集合形式接受
情况2:数据库存在相同sql查询条件下的重复数据,可能为脏数据,进行手动数据库记录删除统一即可

  • Q2:xml sql常见性能优化

1).mybatis尽量不要用select * 进行查询 最佳解决: select 数据库字段名 实体属性名(别名),… from table
2).对于分页查询sql,myabtis会自动对执行的sql进行select count(1) from (select *** )
对于执行的sql,可以在xml中配置一个相同id的xml,只需结果集相同即可,简化sql复杂度,减少查询时间损耗

  • Q3: 实体类和mybatis 的关系?

在mybatis中,实体类属性名可以完成与数据库字段名的映射,对于复杂的一对多,多对多则需要用resultMap进行关系映射,通常而言,对于单表的操作指定resultType=实体类相对地址即可,可以创建多个实体类,
而跟数据库进行关联操作的实体类,需要在实体类上注入@Table() 进行标记,未进行标注的实体类,可以进行resultType 返回类型的指定,不影响其它操作。

1.5 mybatis 映射

mybatis xml 文件中配置

<mapper namespace=“Dao包全路径”>

此时 .xml文件的文件夹不需要和dao的包路径名保持一致。
参考:
1.在注册映射文件时使用标签时,需要映射文件名和接口名一样,不然会报错。
2.在注册映射文件时使用mapper标签的class属性时,需要映射文件名和接口名一样,不然会报错。
3.在注册映射文件时使用,不需要映射文件名和接口名一样

1.6 xml中特殊字符的常用处理方式

xml中编写习惯,用实体类引用?
在 XML 中,有 5 个预定义的实体引用:

&lt;	<	less than
&gt;	>	greater than
&amp;	&	ampersand
&apos;	'	apostrophe
&quot;	"	quotation mark

注意:在 XML 中,只有字符 “<” 和 “&” 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

1.7 mybatis排查小技巧?

mybatis 查询sql问题小技巧
在xml的sql语句的最后面加一个 逗号 , 这样会使预编译sql直接报错打印至控制台,然后进行sql问题的排查。

1.8 mybatis动态表名配置?

动态表名 mybatis动态表名配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值