Mybatis02

本文深入探讨了MyBatis的动态SQL特性,包括where、if、choose、set、trim、bind和foreach标签的使用,以及如何在SQL中实现条件判断和操作。此外,还详细介绍了MyBatis的一级缓存和二级缓存机制,分析了它们的工作原理和应用场景。同时,文章提到了CRUD注解在简化操作上的作用,并简要提及了逆向工程配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 测试字段名与属性名不一致情况

如果查询时使用resultType属性, 表示采用MyBatis的Auto-Mapping(自动映射)机制, 即相同的列名(结果集中的字段名)和属性名会自动匹配.
    1.通过resultMap标签自定义表与javabean类型的映射情况:
        1.不同名的字段必须手动设置映射关系。
        2.同名的字段可以不设置,默认会根据自动映射机制找同名。
    2.为字段起别名
        要求字段的别名与类型对应的属性名保持一致。
  • resultMap标签中的标签:

     id: 定义主键字段与属性的映射关系。
          <id column="deptno" property="id"/>
     result: 定义非主键字段与属性的映射关系。
          <result column="dname" property="name" />
    
  • resultMap的关联方式实现多表查询(一对多)

    class定义属性:  
       //属性: List<Emp>
       private List<Emp> empList;
    映射文件resultMap标签:
       collection:属性为List集合,使用collection标签定义,ofType:集合中数据的类型。
           <collection property="empList" javaType="List" ofType="Emp"/>
    
  • resultMap的关联方式实现多表查询(一对一|多对一)

    class定义属性:  
       //属性: javabean
       private Dept pddDept;
    映射文件resultMap标签:
       association: 定义javabean类型属性与字段的映射关系。
          <association property="pddDept" javaType="Dept"/>
    

2. 动态SQL

  • where

     1.where:标签代替恒等式 where 1=1。
     2.在有条件的时候,会自动在当前select语句中拼接where关键字。
     3.如果没有条件,不会拼接where关键字。
     4.会自动帮助把第一个满足条件的if标签的and关键字去掉。
    
  • if

     if:标签用于条件判断。
     test: 用于设置判断条件,类似java中的()中的内容。
    
  • choose…when…otherwise

     choose:相当于java中的switch。
     when:相当于java中的case,条件写在test属性中。
     otherwise:相当于java中的default。
    
  • set

     1.用户维护update的set子句,与where标签类似 。
     2.,必须添加,set标签不会自动添加。
     3.如果满足条件,自动添加set关键字,会去除最后一个子句的多余的,。
     4.如果没有满足条件,不添加set关键字 。
    
  • trim

     trim:用于在前后添加或者删除一些内容。
     prefix: 在前面添加内容。
     prefixOverrides: 在前面删除内容。
     suffix: 在后面添加内容。
     suffixOverrides: 在后面删除内容。
    
  • bind

     对参数username使用前进行再加工,先拼接前后%
     <bind name="username" value="'%'+username+'%'"/>
    
  • foreach

     用于在 SQL 语句中遍历集合参数, 在 in 查询中使用
     	1.collection: 待遍历的集合。
     	2.open: 设置开始符号。
     	3.item: 迭代变量。
     	4.separator: 项目分隔符。
     	5.close: 设置结束符。
     <select id="selIn" parameterType="list" resultType="user"> 
     	select * from t_user where id in 
     	<foreach collection="list" open="(" separator="," close=")" item="item"> #{item} 
     	</foreach> 
     </select>
    
  • sql…include

     sql用于提取SQL语句, include用于引用SQL语句。
     <sql id="mySql"> id, username, password </sql> 
     <select id="selIn" parameterType="list" resultType="user"> 
     	select 
     	<include refid="mySql" /> 
     	from t_user where id in 
     	<foreach collection="list" open="(" separator="," close=")" item="item"> 
     		#{item} 
     	</foreach> 
     </select>
    
  • 测试动态SQL

     1.查询用户数据:
     	@param username 根据用户名查询。
     	@param password 根据用户密码查询。
     	@return 返回查询到的用户数据。
     	条件是否存在: 字符串类型的用户名|密码 !=null 同时 !=''。
     	1.如果没有条件,查询所有数据。
     	2.如果存在任意一个条件,根据这个条件进行查询。
     	3.如果两个条件都存在,同时根据这两个条件进行查询。
     2.查询用户信息:
     	@param username 根据用户名查询。
     	@param password 根据用户密码查询。
     	@return 返回查询到的用户信息。
     	如果存在用户名则只根据用户名查询,如果没有用户名,存在用户密码,根据用户密码查询,如果都不存在查询所有。
     3.根据用户id修改用户信息:
     	@param user 根据用户修改。
     	@return 返回修改后的用户信息。
     	如果存在用户名修改用户名,如果存在用户密码修改用户密码,如果都存在就都修改。
     4.根据用户名做模糊查询:
     	@param name 根据用户名模糊查询。
     	@return 返回模糊查询后的用户名。
    

3. 缓存

  • 一级缓存

     1.默认开启. 线程级别的缓存, SqlSession 的缓存;
     2.在一个SqlSession 生命周期中有效. SqlSession 关闭,缓存清空;
     3.在同一个SqlSession 中, Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和结果存放在一个 Map 中,如果后续的键值一样,则直接从Map中获取数据;
     4.不同的SqlSession 之间的缓存是相互隔离的;
     5.用一个SqlSession,可以通过配置使得在查询前清空缓存;flushCache="true"
     6.任何的UPDATE, INSERT, DELETE语句都会清空缓存。
    
  • 二级缓存

     <mapper namespace="com.xxxx.mappers.UserMapper">
     //开启本mapper的命名空间的二级缓存
     <cache flushInterval="10000"/>
     flushInterval:刷新间隔时间。
     1.进程级别的缓存,SqlSessionFactory的缓存。
     2.在一个SqlSessionFactory生命周期中有效. 可以在多SqlSession 生命中期中共享.。
     3.默认关闭, 需要使用的时候, 要为某个命名空间开启二级缓存(在 mapper.xml 中配置cache)。
     4.由于在更新时会刷新缓存,因此需要注意使用场合:查询频率很高,更新频率很低时使用,即经常使用 select, 相对较少使用delete, insert, update。
     5.缓存是以 namespace 为单位的,不同namespace下的操作互不影响。但刷新缓存是刷新整个namespace的缓存,也就是update 了一个,则整个缓存都刷新了。
     6.最好在「只有单表操作」的表的namespace使用缓存, 而且对该表的操作都在这个namespace中。否则可能会出现数据不一致的情况。
    

4. CRUD注解

  • CRUD注解

    @Select: 类似于select标签。
    @Insert: 类似于insert标签。
    @Update: 类似于update标签。
    @Delete: 类似于delete标签。
    
  • 其他注解

    @Results: 类似于resultMap标签。
    @Result: 类似<resultMap的子标签。
    @One: 类似于association标签。
    @Many: 类似于collection标签。
    

5. 逆向工程
需添加到资源包下src下,generatorConfig.xml配置:

在这里插入图片描述

org.apache.ibatis.binding.BindingException是MyBatis框架中的一个异常,它表示绑定语句无效或未找到。在你提供的引用中,出现了两个同的错误信息,分别是com.mybatis.mapper.OrdersMapper.finarray和com.cloud.lowcode.mapper.UserMapper.queryByParam。 这些错误信息表明在MyBatis的映射文件中找到对应的绑定语句。绑定语句是指在映射文件中定义的SQL语句,用于执行数据库操作。 要解决这个问题,你可以按照以下步骤进行操作: 1. 确保映射文件中存在对应的绑定语句。检查com.project_mybatis02.mapper.Mkk映射文件中是否定义了名为list的绑定语句。 2. 检查绑定语句的命名是否正确。确保绑定语句的名称与映射文件中定义的名称完全一致,包括大小写。 3. 检查映射文件的路径是否正确。确认映射文件的路径与MyBatis配置文件中的路径一致。 4. 检查映射文件是否正确加载。确保映射文件已经正确加载到MyBatis的配置中。 5. 检查映射文件中的命名空间是否正确。确认映射文件中的命名空间与Mapper接口的包路径一致。 6. 检查Mapper接口的方法名是否与绑定语句的id一致。确保Mapper接口中的方法名与映射文件中绑定语句的id一致。 7. 检查Mapper接口的包路径是否正确。确认Mapper接口的包路径与映射文件中的命名空间一致。 8. 检查MyBatis的配置文件是否正确加载了映射文件。确认MyBatis的配置文件中已经正确加载了映射文件。 9. 检查数据库连接是否正常。确保数据库连接配置正确,并且数据库中存在对应的表和字段。 10. 如果以上步骤都没有解决问题,可以尝试重新编译和部署项目,确保所有的文件都已经正确部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值