Mybatis的知识点总结

mybatis中实现多表查询

 

使用内连接+级联属性

PersonMapper.xml

<resultMap type="PersonResult" id="PersonMap">
        <id property="id" column="id" />
        <result property="name" column="name" />
        <!-- 一对一关联:单向。使用级联属性 -->
        <result property="idCard.id" column="cid"/>
        <result property="idCard.number" column="number"/>
        <result property="idCard.expiredTime" column="expired_time"/>
    </resultMap>
    <select id="selectById" parameterType="Integer"
        resultMap="PersonMap">
        select p.id id, p.name name,c.id cid,c.number
        number,c.expired_time expired_time from t_person p
        inner join t_idcard
        c on p.idcard_id=c.id and p.id=#{id}
    </select>

 

PersonResult.Class

 @Data
 public class PersonResult extends Person{
    private Idcard idcard ;
}

使用内连接 + 扩展类

PersonMapper.xml

<select id="selectById" parameterType="Integer" resultType="PersonResult">
        select p.id id, p.name name,
        c.id cardId,c.number cardNumber,c.expired_time cardExpiredTime
        from t_person p inner join t_idcard  c on p.idcard_id=c.id and p.id=#{id}
    </select>

 

扩展类 PersonResult 继承 Person 类 同时扩展需要查询的属性

@Data
 public class PersonResult extends Person{
     //添加需要扩展的属性
    private Integer cardId;
    private String cardNumber;
    private Date cardExpiredTime;
}

 

内连接 + association内联result设置

PersonMapper.xml

<resultMap type="PersonResult" id="PersonMap">
        <id property="id" column="id" />
        <result property="name" column="name" />

        <!-- 一对一关联:单向。使用内联方式直接列出。 -->
        <association property="idCard" column="idcard_id" javaType="IdCard">
            <id column="cid" property="id" />
            <result column="number" property="number" />
            <result column="expired_time" property="expiredTime" />
        </association>
    </resultMap>
    <select id="selectById" parameterType="Integer" resultMap="PersonMap">
        select p.id id, p.name name,c.id cid,c.number
        number,c.expired_time expired_time from t_person p
        inner join t_idcard c on p.idcard_id=c.id and p.id=#{id}
    </select>

PersonResult.Class

 @Data
 public class PersonResult extends Person{
    private Idcard idcard ;
}

 

使用内连接 + association引用resultMap

PersonMapper.xml

 <resultMap type="PersonResult" id="PersonMap">
        <id property="id" column="id" />
        <result property="name" column="name" />

        <!-- 一对一关联:单向。使用resultMap引用。
             注意的是column名称必须与关联表select时的一致
             (需要修改关联表的select,所以更建议使用select引用方式(见下) -->
        <association property="idCard" column="cid"
            resultMap="com.sunwii.mybatis.mapper.IdCardMapper.IdCardMap" />
    </resultMap>
    <select id="selectById" parameterType="Integer" resultMap="PersonMap">
        select p.id id, p.name name,c.id cid,c.number number,
        c.expired_time expired_time from t_person p
        inner join t_idcard c 
        on p.idcard_id=c.id and p.id=#{id}
    </select>

 

 

IdCardMapper.xml
IdCardMapper 为配合方式三需要修改查询到的id属性为cid(即指定column="cid")

  <resultMap type="IdCard" id="IdCardMap">
        <id property="id" column="cid" />
        <result property="number" column="number" />
        <result property="expiredTime" column="expired_time" />
    </resultMap>
    <select id="selectById" parameterType="Integer"
        resultMap="IdCardMap">
        select id as cid ,number,expired_time from t_idcard where id=#{id}
    </select>

 

PersonResult.Class

 @Data
 public class PersonResult extends Person{
    private Idcard idcard ;
}

使用单表查询+association引用select方式

 

PersonMapper.xml

<resultMap type="PersonResult" id="PersonMap">
        <id property="id" column="id" />
        <result property="name" column="name" />

        <!-- 一对一关联:单向。使用select引用,可以设置延迟加载方式 -->
        <association property="idCard" column="idcard_id" javaType="IdCard"
            select="com.sunwii.mybatis.mapper.IdCardMapper.selectById" fetchType="lazy"/>
    </resultMap>
    <select id="selectById" parameterType="Integer"
        resultMap="PersonMap">
        select id, name, idcard_id from t_person p where p.id=#{id}
    </select>

IdCardMapper.xml

  <select id="selectById" parameterType="Integer"
        resultMap="IdCardMap">
        select id ,number,expired_time from t_idcard where id=#{id}
      </select>

 

PersonResult.Class

 @Data
 public class PersonResult extends Person{
    private Idcard idcard ;
}

当然你也可以在逻辑层通过逻辑完成关联  原文:https://www.cnblogs.com/dreamyoung/p/11801950.html

 

mybatis的标签及其属性

格式
标签名: 注释
属性:注释

 

 

 

 

配置java对象属性与查询结果集中列名对应关系标签

resultMap:配置java对象属性与查询结果集中列名对应关系
         type: 返回结果集的地址 例如 com.test.dao.user
         id: 唯一的标识符

id: 结果集的标识属性

result:结果集的普通属性

property: java中对象的属性名称

column: sql语句查询出的列名

javaType: 如果映射到一个JavaBean,那MyBatis 通常会自行检测到。然而,如果映射到一个HashMap, 那您应该明确指定javaType 来确保所需行为。

jdbcType: 这个属性只在insert,update或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果您直接编写JDBC代码,在允许为空值的情况下需要指定这个类型。

typeHandler: 类型处理器 (下面会简单会详细解释一下)

constructor:   –实例化的时候通过构造器将结果集注入到类中

association:  复杂类型联合;能引用自身,或者从其它地方引用resultMap。

collection: 复杂类型集合; 能引用自身,或者从其它地方引用resultMap。
        fetchType: 加载方式 :
                     1. lazy懒加载,加载一个实体时,定义懒加载的属性不会马上从数 据库中加载 。 
                    2.eager 急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

 

定义sql语句标签

select: 查询语句 实例: select * from user

insert :插入语句 实例:Inset into user(id,name) values(default,"张三")

delete: 删除语句 实例: delete from user where id="筛选条件"

update: 修改语句 update user set name="修改内容" where id="筛选条件"
        以上标签的属性
   id 唯一的标识符
   resultType 返回值类型 返回结果集的全路径
   resultMap 返回值类型 内容填写resultMap标签的id
   parameterType 传参类型 返回结果集的全路径
   parameterMap 参数类型 内容填写resultMap标签的id
   databaseId 与ibatis全局配置中的databaseIdProvider标签呼应
   lang:长度,目前还没有使用过。
   keyColumn 目标类的属性,映射结果集的列名;若存在,多个则用逗号分割
   keyProperty 结果集映射目标累的属性 若存在,多个则用逗号分割
   useGeneratedKeys:当值为true表示使用数据库自动增长的主键,keyColumn用于指定数据库table中主键,keyProperty用于指定传入对象
   useCache 二级缓存开关 true表示开启 默认关闭
   flushCache 清除缓存  true表示每次调用清除缓存 默认为false
   statementType  取值范围(STATEMENT|PREPARED|CALLABLE)    
                           1、STATEMENT:直接操作sql,不进行预编译,获取数据:$—Statement  注意:需要把 #{}改成 ${};    
                           2、PREPARED:预处理,参数,进行预编译,获取数据:#—–PreparedStatement:默认 
                           3、CALLABLE:执行存储过程————CallableStatement
                          注意:如果只为STATEMENT,那么sql就是直接进行的字符串拼接,这样为字符串需要加上引号,如果为                                      PREPARED,是使用的参数替换,也就是索引占位符,我们的#会转换为?再设置对应的参数的值。
    timeout   超时时间。

 

控制动态sql拼接的标签

if: 和java中的if语句等效 起判断作用
    test 条件 实例 test="id!=null and id!=' '" 必填属性
     注意:当传参在java中的数据类型为基本数据类型时' '表示的是默认值,例如int id!=''等效于id!=0

foreach: 和java中for循环的作用一样

collection:属性的值有三个分别是 list、array、map 三种,分别对应的参数类型为:List、数组、map 集合。必填属性
item:表示迭代过程中每一个元素的别名
index:表示在迭代过程中每次迭代到的位置(下标)
open:前缀
close:后缀
separator:分隔符,表示迭代是每个元素之间以什么分隔

choose 有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个,类似于 Java 的switch 语句。结合when标签和otherwise标签一起使用。

when 等效于java中switch 语句中的case
          test 条件 必填参数

otherwise 等效于java中switch 语句中的default

where  由之前where 1=1优化过来的  当where标签中有条件时进行插入一个where 并且如果内容以and或or开头的,则会剔除and或or。

set  和where标签大同小异,动态的配置 set关键字,和剔除追加到条件末尾的任何不相关的逗号,但是当set标签中没有可执行的条件时会报sql语法错误 ,可以在条件中添加id=id防止报错

trim 标记是一个格式化的标记,主要用于拼接sql的条件语句(前缀或后缀的添加或忽略),可以完成set或者是where标记的功能
prefix 在trim标签内sql语句添加前缀
suffix 在trim标签内sql语句添加后缀
prefixOverrides 在trim标签内sql语句 去除指定前缀 和where去除 or和and的功能一样
suffixOverrides 在trim标签内sql语句 去除指定后缀 和set去除逗号的功能一样

sql 相当于java中常量。可以将很多重复的常量封装起来通过sql标签调用,例如 select语句的返回参数。
     id 唯一标识符
     lang 长度
    databaseId 根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。 如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。为支持多厂商特性只要像下面这样在 mybatis-config.xml 文件中加入 databaseIdProvider 即可。
 

<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>        
  <property name="Oracle" value="oracle" />
</databaseIdProvider>

 

include  引用sql片段
        refid 引用sql片段的id

bind 等效于java中声明变量经常使用于模糊查询 #{name属性的值}进行应用
   name 参数名称 必填
   value 参数值 必填

typeHandler 是什么?

 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成 Java 类型。Mybatis默认为我们实现了许多TypeHandler, 当我们没有配置指定TypeHandler时,Mybatis会根据参数或者返回结果的不同,默认为我们选择合适的TypeHandler处理 (简单的说就是控制数据库里什么数据类型转成java里什么样的数据类型的东西)

配置TypeHandler

 

<configuration>
    <typeHandlers>
      <!-- 
          当配置package的时候,mybatis会去配置的package扫描TypeHandler
          <package name="com.dy.demo"/>
       -->
      
      <!-- handler属性直接配置我们要指定的TypeHandler -->
      <typeHandler handler=""/>
      
      <!-- javaType 配置java类型,例如String, 如果配上javaType, 那么指定的typeHandler就只作用于指定的类型 -->
      <typeHandler javaType="" handler=""/>
      
      <!-- jdbcType 配置数据库基本数据类型,例如varchar, 如果配上jdbcType, 那么指定的typeHandler就只作用于指定的类型  -->
      <typeHandler jdbcType="" handler=""/>
      
      <!-- 也可两者都配置 -->
      <typeHandler javaType="" jdbcType="" handler=""/>
      
  </typeHandlers>

 

#{} 和 ${}的区别

#{}是占位符 会把传入的值当成一个字符串 会对传入的值加一个双引号将传入的数据直接显示生成在sql中。能够很大程度防止sql注入

${}方式无法防止Sql注入。${}方式一般用于传入数据库对象,例如传入表名. 一般能用#的就别用$.MyBatis排序时使用order by 动态参数时需要注意,用${}而不是#{};

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值