mybatis总结

Posted 顿悟树下你和我

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis总结相关的知识,希望对你有一定的参考价值。

mybatis

注意

namespace需要是我们接口的全限定名(这里的namespace是mapper.xml中的,也是该mapper.xml文件的名字)

接口当中的方法名要与我们xml文件当中的sql的Id保持一致

Xml名字要与我们接口文件的名称保持一致

Xml位置要与我们接口的位置保持一致

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LgZrXUzW-1680447489767)(./pic/java/1585019424458.png)]

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long">
    select
    <include refid="Base_Column_List"/>
    from account_manger
    where id = #Id,jdbcType=INTEGER
</select>

spring与mybatis整合

方法一: 通过 XXXMapper.xml 映射文件整合
方法二:通过 Mapper接口的方式整合
转义字符

可以使用cdata标签

在xml中,”<””>””&”等字符是不能直接存入的,否则xml语法检查时会报错,如果想在xml中使用这些符号,必须将其转义为实体,如”<””>””&”,这样才能保存进xml文档。

在XML中,需要转义的字符有:
字符	转义	描述
<	&lt;	小于
<=	&lt;=	小于等于
>	&gt;	大于
>=	&gt;=	大于等于
<>	&lt;&gt;	不等于
&	&amp;	 
'	&apos;	 
"	&quot;	 
字符转义描述
<<小于
<=<=小于等于
>>大于
>=>=大于等于
<><>不等于
&&
'
""

第一种

<if test="searchTimeEnd != null and searchTimeEnd != ''">
       tcci.consume_time &lt;= CONCAT(#searchTimeEnd,' 23:59:59')
   </if>

第二种

<if test="endTime!=null">
      AND DATE (os.show_start_time) <![CDATA[<=]]> DATE(#endTime)
</if>
parameterType
解析(参考foreach标签)

@Param和parameterType 二者存其一即可。

看名字就能知道ParameterType是按照类型进行匹配

@Param是按照名字进行匹配,xml里的名字必须与参数名一样

基本类型
1.只含parameterType

则只按照类型匹配,而不会考虑名字的匹配

SOACoupon parameterTypeOneParam(Integer id);
<select id="parameterTypeOneParam" parameterType="int"                                                               resultType="org.mallcai.common.model.SOACoupon">
    select * from tbl_coupon where id = #3333333
</select>
2.只含有@Param

这种就会只按照名字匹配,而不是按照类型匹配了,如果名字不同,则会异常

SOACoupon parameterTypeOneParam(@Param("idd") Integer id);
    <select id="parameterTypeOneParam" resultType="org.mallcai.common.model.SOACoupon">
        select * from tbl_coupon where id = #idd
    </select>
list类型
1.xml里含parameterType

只包含parameterType,则当前就是表示只用这个的类型,则在xml中进行循环的时候,要按照类型来识别了

SOACoupon parameterTypeOne1(List<Integer> ids);
    <select id="parameterTypeOne1" parameterType="list" 	                         						 resultType="org.mallcai.common.model.SOACoupon">
        select * from tbl_coupon where id in
        <foreach collection="list" separator="," open="(" close=")" item="item">
            #item
        </foreach>
        limit 1
    </select>
2.方法含@Param

则表示当前是要用名字来进行识别,则就没有必要写parameterType了,也就是两者都存在的时候,其中一个parameterType是会失效的

SOACoupon parameterTypeOne1(@Param("idList") List<Integer> ids);
    <select id="parameterTypeOne1" resultType="org.mallcai.common.model.SOACoupon">
        select * from tbl_coupon where id in
        <foreach collection="idList" separator="," open="(" close=")" item="item">
            #item
        </foreach>
        limit 1
    </select>
Map类型

queryvo 可以用map类型替换参考

1.xml里面含parameterType

(按类型匹配)

mybatis更新sql语句:

<update id="publishT00_notice" parameterType="Map">
update test  
set createdate = #createdate,
creator = #creator
where id in 
<foreach collection="ids" item="ids" separator="," open="(" close=")">
#ids
</foreach>
</update>

传入map参数类型:

HashMap<String,Object> map = new HashMap<String, Object>();
map.put("creator", "creator");
map.put("createdate", "createdate");
 
String[] ids = "1","2";
map.put("ids", ids );
2.方法里含@Param

(按参数匹配)

如果是注解,则是按照名字匹配,那么怎么匹配呢,这样就是需要xml中这么写了

SOACoupon parameterTypeOne2(@Param("map") Map<String, Object> parasms);
 <select id="parameterTypeOne2" resultType="org.mallcai.common.model.SOACoupon">
     <!--key status 都是map的key值 -->  
     select * from tbl_coupon where id=#map.key and status=#map.status limit 1;
 </select>
实体类型
1.xml里含parameterType

只包含parameterType,则跟上面map是一样的,就是按照key进行匹配

SOACoupon parameterTypeOne3(SOACoupon coupon);
<select id="parameterTypeOne3" parameterType="SOACoupon" 	           	                                  resultType="org.mallcai.common.model.SOACoupon">
    select * from tbl_coupon where id=#id;
</select>
2.方法里包含@Param

只包含@Param,则跟上面的map是一样的,也是要通过名字进行访问才行

SOACoupon parameterTypeOne3(@Param("coup")SOACoupon coupon);
    <select id="parameterTypeOne3" resultType="org.mallcai.common.model.SOACoupon">
        select * from tbl_coupon where id=#coup.id;
    </select>
resultType解析
总结

1、基本类型 :resultType=基本类型

2、List类型: resultType=List中元素的类型

3、Map类型 单条记录:resultType =map

​ 多条记录:resultType =Map中value的类型

对象类型
package com.pjf.mybatis.dao;
import com.pjf.mybatis.po.Hotel;

public interface HotelMapper 
    //返回值类型为Hotel
    public Hotel getHotel(Integer i);

<mapper namespace="com.pjf.mybatis.dao.HotelMapper">
    <!--resultType直接写对象的全类名 -->
    <select id="getHotel" resultType="com.pjf.mybatis.po.Hotel">
        select * from hotel
        where
        id=#id
    </select>
</mapper>
list 类型
package com.pjf.mybatis.dao;
import java.util.List;
import com.pjf.mybatis.po.Hotel;
public interface HotelMapper 
    // 返回值为List
    public List<Hotel> getHotel(Integer i);

<!-- 返回值为List,resultType为List中元素的全类名 -->
    <select id="getHotel" resultType="com.pjf.mybatis.po.Hotel">
        select * from hotel
        where
        price>#price
    </select>
Map类型

a、返回单条记录的map,key为属性,值为属性值。

package com.pjf.mybatis.dao;

import java.util.Map;
import com.pjf.mybatis.po.Hotel;

public interface HotelMapper 
    // 返回值为Map,key为属性名,value为属性值
    public Map<String, Object> getHotel(Integer i);

    <!-- 返回值为map,resultType为map -->
    <select id="getHotel" resultType="map">
        select * from hotel
        where
        id=#id
    </select>

b、返回多条

package com.pjf.mybatis.dao;
import java.util.Map;
import org.apache.ibatis.annotations.MapKey;
import com.pjf.mybatis.po.Hotel;

public interface HotelMapper 
    
    //方式一
    // 返回值为Map,key需要通过@MapKey("属性名")来指定javaBean中的一个属性名为key,value为对象
    @MapKey("hotelName")
    public Map<String, Hotel> getHotel(Integer i);
    
    //方式二
    //将返回值类型改为List<Map<String String>>

<mapper namespace="com.pjf.mybatis.dao.HotelMapper">
    <!-- 返回值为map,resultType为对象的全类名 -->
    <select id="getHotel" resultType="com.pjf.mybatis.po.Hotel">
        select * from hotel
        where
        price>#price
    </select>
</mapper>
resultmap解析

通过反射把表的列名称与实体类名称对应,封装到po中,

如果列名称 = 实体类变量名称,可以用resulttype

如果列名称 ≠ 实体类变量名称,必须用resultmap

一对一查询
    <resultMap id="BaseResultMap" type="com.accountmanger.www.entity.AccountManger">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="account" property="account" jdbcType="VARCHAR"/>
        <result column="paswd" property="paswd" jdbcType="VARCHAR"/>
        <result column="phone" property="phone" jdbcType="VARCHAR"/>
        <result column="email" property="email" jdbcType="VARCHAR"/>
        <result column="address" property="address" jdbcType="VARCHAR"/>
        <result column="ischackId" property="ischackId" jdbcType="TINYINT"/>
        <result column="createtime" property="createtime" jdbcType="DATE"/>
        <result column="updatetime" property="updatetime" jdbcType="DATE"/>
        
        <association property="userBaseInfo" 			                                                      javaType="com.accountmanger.www.entity.UserBaseInfo">
            <id  column="userid" property="userid"/>
            <result column="name" property="name_" jdbcType="VARCHAR"/>
            <result column="phonebase" property="phone_" jdbcType="VARCHAR"/>
            <result column="emailbase" property="email_" jdbcType="VARCHAR"/>
            <result column="addressbase"  property="address_"  jdbcType="VARCHAR"/>
            <result column="cardid"  property="cardid"   jdbcType="VARCHAR"/>
        </association>
    </resultMap>


<!--这里必须用resultMap -->
 <select id="selectcardidByphone" resultMap="BaseResultMap">
            SELECT
            a.id, a.account, a.paswd, a.phone, a.email, a.address, a.ischackId, a.createtime,a.updatetime,
            b.userid,b.name,b.phone as phonebase,b.email as emailbase,b.address as addressbase,b.cardid
             from  accountmanger.account_manger a INNER join account_manger_userbaseinfo b ON
            a.id=b.userid and  a.phone= #phone,jdbcType=VARCHAR
    </select>

一对多查询

一个问题对应多个回答

<collection 标签对应的就是多个对象,“一对多” 中的多;

就是这个

 private List<Answer> answers;
public class Question implements Serializable 
   
    private int id;                 //问题Id
    private int accountId;     //用户id
    private String content;    //问题
    private Date createTime;
    private String createBy;
    private Date updateTime;
    private String updateBy;
    private int status;        //问题状态  0:逻辑删除,1:未回答,2:已回答
   private List<Answer> answers;  //注意这个属性



public class Answer implements Serializable
    
    private int id;    //答案Id
    private int questionId;    //问题Id 
    private int managerId;   //回复者Id(默认管理员)
    private String content;   //回复内容
    private Date createTime; //回复时间
    private String createBy;
    private Date updateTime;
    private String updateBy;
    private int status;


<select id="showAnswers" resultMap="linkedResultMap"  parameterType="int">
        SELECT 
            a.id,a.`questionId`,a.`content` AS answer,a.`createTime` as aCreateTime,a.`managerId`,
            q.id,q.`accountId`,q.`content` AS question,q.`status`,q.`createTime` as qCreateTime
        FROM 
            answers AS a 
        LEFT JOIN     
            questions AS q 
        ON     
            q.`id` = a.`questionId` 
        WHERE 
            q.`status` = 2 
        AND 
            q.`accountId`=#acconutId ;
    </select>
    
    <resultMap type="entity.Question" id="linkedResultMap" >  <!-- 注意ID的对应 -->
        <id property="id" column="id"/>
        <result property="accountId" column="accountId"/>
        <result property="content" column="question"/>
        <result property="status" column="status"/>
        <result property="createTime" column="qCreateTime"/>
        <collection property="answers" ofType="entity.Answer">
        <!-- property指 Answer类中的属性, column指数据库中的字段名-->
            MyBatis]MyBatis 使用教程
  • [MyBatis]MyBatis XML配置
  • [MyBatis]MyBatis XML映射文件
  • [MyBatis]MyBatis 动态SQL
  • [MyBatis]MyBatis Java API
  • [MyBatis]MyBatis SQL语句构建器
  • [MyBatis]MyBatis 日志
  • [MyBatis]什么是MyBatis
  • [MyBatis]MyBatis 从XML创建SqlSessionFactory实例
  • [MyBatis]MyBatis不使用XML来创建SqlSessionFactory
  • [MyBatis]MyBatis 从SqlSessionFactory获取SqlSession
  • [MyBatis]MyBatis 映射SQL语句
  • [MyBatis]MyBatis 作用域和生命周期
  • [MyBatis]MyBatis Mapper XML配置
  • [MyBatis]MyBatis properties元素
  • [MyBatis]MyBatis Settings元素
  • [MyBatis]MyBatis typeAliases 元素
  • [MyBatis]Mybatis-Generator自动生成Dao、Model、Mapping文件
  • [MyBatis]MyBatis Generator如何在Eclipse上配置及使用
  • [MyBatis]MyBatis typeHandlers元素
  •  

    以上是关于mybatis总结的主要内容,如果未能解决你的问题,请参考以下文章

    MyBatis总结

    MyBatis学习总结——MyBatis快速入门

    MyBatis学习总结——MyBatis快速入门

    JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

    mybatis学习总结

    MyBatis学习总结——MyBatis快速入门