Mybatis的初级使用小结

mybatis的尚硅谷笔记

https://blog.csdn.net/u011863024/article/details/107854866

Mybatis的insert

MyBatis的批量insert

Mapper接口:

int insertBatch(List<TcxqBranchPool> records);

xml文件:

oracle写法对应的SQL:

INSERT ALL 
INTO my_table(field_1,field_2) VALUES (value_1,value_2) 
INTO my_table(field_1,field_2) VALUES (value_3,value_4) 
INTO my_table(field_1,field_2) VALUES (value_5,value_6)
SELECT 1 FROM DUAL;

mysql写法对应的SQL:

insert into my_table(field_1,field_2)
values
(value_1,value_2),
(value_1,value_2),
(value_1,value_2);
<insert id="insertBatch"  parameterType="cn.org.nafmii.bean.pool.TcxqBranchPool">
	insert all
    <foreach item="item" index="index" collection="list">
    	into t_cxq_branch_pool 
        	(DCM_ID,STATUS,CRE_USER_ID)
        values 
            (#{item.dcmId,jdbcType=VARCHAR},
            #{item.status,jdbcType=VARCHAR},
            #{item.creUserId,jdbcType=VARCHAR})
    </foreach>
    select 1 from dual
</insert>

MyBatis的动态insert

Mapper接口

int insertSelective(TCxqPool record);

xml文件

<insert id="insertSelective" keyColum="DCM_ID" keyProperty="DCM_ID" parameterType="cn.org.nafmii.bean.pool.TcxqBranchPool" useGeneratedKeys="true">
	insert into T_CXQ_POOL
    <trim prefix="(" suffix=")" suffixOverrides=",">
    	<if test="BASIC_STATUS!=null">
            BASIC_STATUS,
        </if>
        <if test="POOL_STATUS!=null">
            POOL_STATUS,
        </if>
        <if test="STATUS!=null">
            STATUS,
        </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
    	<if test="BASIC_STATUS!=null">
            #{BASIC_STATUS,jdbcType=VARCHAR},
        </if>
        <if test="POOL_STATUS!=null">
            #{POOL_STATUS,jdbcType=VARCHAR},
        </if>
        <if test="STATUS!=null">
            #{STATUS,jdbcType=VARCHAR},
        </if>
    </trim>
</insert>

Mybatis的普通insert方法

Mapper接口

int insert(TCxqPool record);

xml文件

<insert id="insert" keyColum="DCM_ID" keyProperty="DCM_ID" parameterType="cn.org.nafmii.bean.pool.TcxqBranchPool" useGeneratedKeys="true">
    insert into T_CXQ_POOL 
    	(BASIC_STATUS,POOL_STATUS,STATUS)
    values
        (#{BASIC_STATUS,jdbcType=VARCHAR},
        #{POOL_STATUS,jdbcType=VARCHAR},
        #{STATUS,jdbcType=VARCHAR})
</insert>

Mybatis的select

MyBatis的select 动态条件

Mapper接口

List<TCxqBasicGreen> selectAllByWhere(TCxqBasicGreen tCxqBasicGreen);

xml文件

 <select id="findAllForExport" resultType="cn.org.nafmii.bean.basicgreen.TCxqBasicGreen">
    select
      BOND_CODE, BOND_NAME,ORGANIZATION_NAME, ISSUER_AMOUNT, REMAINDER, INTEREST_DAY
    from T_CXQ_BASIC_GREEN
    <where>
      <if test="bondCode != null and bondCode != ''">
        and BOND_CODE like '%' || #{bondCode,jdbcType=VARCHAR} || '%'
      </if>
      <if test="bondName != null and bondName != ''">
        and BOND_NAME like '%' ||  #{bondName,jdbcType=VARCHAR} || '%'
      </if>
    </where>
    order by CRE_TIME desc , BOND_CODE desc
  </select>

MyBatis的动态select service拼接条件

entity实体类

额外定义一个字段,不需要入库:

/**
 * 查询条件
 */
private String others;

service方法

@Override
    public List<TCxqBranchPool> selectByAdd(TCxqBranchPool vo) {
        User user = UserInfoUtil.get();
        if ("2".equals(user.getInstitution())  ) {
            //查询的时候按照省和单列市分类
            String others;
            if(org.springframework.util.StringUtils.isEmpty(user.getCity())) {
                others = " (b.PROVINCES = '" + user.getDistrict()
                        + "' and ( not EXISTS (SELECT DICT_CODE FROM T_CXQ_DATA_DICT WHERE DICT_ITEM='CITY' and DICT_CODE=b.CITY)))";
            } else { // 单列市
                others = " ( b.CITY='" + user.getCity() + "' )";
            }
            vo.setOthers(others);
        }
        return tCxqBranchPoolMapper.selectByAdd(vo);
    }

Mapper接口

 List<TCxqBranchPool> selectByAdd(TCxqBranchPool record);

xml文件

<select id="selectByAdd" parameterType="cn.org.nafmii.bean.pool.TCxqBranchPool" resultMap="BaseResultMap">
SELECT
    tci.ORGANIZATION ,
    tci.ORGANIZATION_NAME ,
    tci .DCM_ID,
    (SELECT tcdd.dict_name FROM T_CXQ_DATA_DICT tcdd WHERE tcdd.DICT_ITEM = 'NAFMII_FST_TRADE' AND tcdd.DICT_CODE = tci.NAFMII_FST_TRADE) as NAFMII_FST_TRADE,
    (SELECT tcdd.dict_name FROM T_CXQ_DATA_DICT tcdd WHERE tcdd.DICT_ITEM = 'NAFMII_SCD_TRADE' AND tcdd.DICT_CODE = tci.NAFMII_SCD_TRADE) as NAFMII_SCD_TRADE,
    (SELECT tcdd.dict_name FROM T_CXQ_DATA_DICT tcdd WHERE tcdd.DICT_ITEM = 'ENTERPRISE_NATURE' AND tcdd.DICT_CODE = tci.ENTERPRISE_NATURE) as ENTERPRISE_NATURE,
    (SELECT tcdd.dict_name FROM T_CXQ_DATA_DICT tcdd WHERE tcdd.DICT_ITEM = 'PROVINCE' AND tcdd.DICT_CODE = PROVINCES) as PROVINCES
    FROM
    T_CXQ_ISSUER tci 
    <where>
      <if test="organizationName != null and organizationName != ''">
        AND b.ORGANIZATION_NAME like '%'||#{organizationName,jdbcType=VARCHAR}||'%'
      </if>
      <if test="organization != null and organization != ''">
        AND b.ORGANIZATION = #{organization,jdbcType=VARCHAR}
      </if>
      <if test="others !=null and others !=''">
        and ${others}
      </if>
    </where>
  </select>

注意:

#{}和${}的区别:

#{}是预编译处理,mybatis在处理#{},会将SQL中的#{}替换为?,然后使用PreparedStatement的set方法来赋值,可以有效避免SQL注入问题

是 字 符 串 替 换 , m y b a t i s 处 理 {}是字符串替换,mybatis处理 mybatis{}时,直接把${}替换成变量的值

Mybatis的update

Mybatis的普通update

mapper接口

int updateByPrimaryKey(TCxqBasicGreenFeedback record);

xml文件

<update id="updateByPrimaryKey" parameterType="cn.org.nafmii.bean.basicgreen.TCxqBasicGreenFeedback">
    update T_CXQ_BASIC_GREEN_FEEDBACK
    set ORGANIZATION = #{organization,jdbcType=VARCHAR},
      COMMUNICATE_DIRECTION = #{communicateDirection,jdbcType=VARCHAR},
      PROVINCES = #{provinces,jdbcType=VARCHAR},
      CITY = #{city,jdbcType=VARCHAR},
    where FEEDBACK_ID = #{feedbackId,jdbcType=VARCHAR}
  </update>

Mybatis的动态update

mapper接口

int updateByPrimaryKeySelective(TCxqBasicGreenFeedback record);

xml文件

<update id="updateByPrimaryKeySelective" parameterType="cn.org.nafmii.bean.basicgreen.TCxqBasicGreenFeedback">
    update T_CXQ_BASIC_GREEN_FEEDBACK
    <set>
      <if test="organization != null">
        ORGANIZATION = #{organization,jdbcType=VARCHAR},
      </if>
      <if test="organizationName != null">
        ORGANIZATION_NAME = #{organizationName,jdbcType=VARCHAR},
      </if>
      <if test="communicateDirection != null">
        COMMUNICATE_DIRECTION = #{communicateDirection,jdbcType=VARCHAR},
      </if>
    </set>
    where FEEDBACK_ID = #{feedbackId,jdbcType=VARCHAR}
  </update>

Mybatis的delete

Mybatis的单条删除

mapper接口

int deleteByPrimaryKey(String dcmId);

xml文件

  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
    delete from T_CXQ_BRANCH_POOL
    where DCM_ID = #{dcmId,jdbcType=VARCHAR}
  </delete>

Mybatis的批量删除

对应的sql

delete from tbl_employee where id in (1,2,3);
delete from tbl_employee where id = 1 or id = 2 or id = 3

方式一 通过id所组成的字符串实现批量删除

Mapper接口

//通过id所组成的字符串实现批量删除
public void deleteMoreEmp(String eids);

xml文件

<delete id="deleteMoreEmp">
         delete from tbl_employee where id in (${ids})
</delete>

注意:这里要用${},因为#{}默认会给字符串加上单引号

方式二 使用 foreach 标签来进行删除

Mapper接口

//通过list集合实现批量删除
public void deleteMoreByList(List<Integer> ids);

xml文件

<delete id="deleteMoreByList">
    delete from tbl_employee where id in
    <foreach collection="list" item="id"  separator="," open="(" close=")">
        #{id}
    </foreach>
</delete>

方式三 使用 foreach 标签来批量删除(使用 or)

Mapper接口

//通过list集合实现批量删除
public void deleteMoreByList(List<Integer> ids);

xml文件

 <delete id="deleteMoreByList">
     delete from tbl_employee where
     <foreach collection="list" item="id"  separator="or">
         id = #{id}
     </foreach>
</delete>

Mybatis的标签

<sql> 和< include>

Mybatis中<sql>标签和< include refid=“” >标签的用法

标签1

<sql id="Base_Column_List" >
    BOND_CODE, BOND_NAME,ORGANIZATION_NAME, ISSUER_AMOUNT, REMAINDER, INTEREST_DAY, DUE_DAY, TERM, COUPON_RATE,
    (SELECT tcdd.dict_name FROM T_CXQ_DATA_DICT tcdd WHERE tcdd.DICT_ITEM = 'PROVINCE' AND tcdd.DICT_CODE = PROVINCES) as PROVINCES_NAME,
    (SELECT tcdd.dict_name FROM T_CXQ_DATA_DICT tcdd WHERE tcdd.DICT_ITEM = 'PROVINCE' AND tcdd.DICT_CODE = CITY) as CITY_NAME
  </sql>

标签2

<sql id="Where_Clause">
    <where>
      <if test="bondCode != null and bondCode != ''">
        and BOND_CODE like '%' || #{bondCode,jdbcType=VARCHAR} || '%'
      </if>
      <if test="bondName != null and bondName != ''">
        and BOND_NAME like '%' ||  #{bondName,jdbcType=VARCHAR} || '%'
      </if>
      <if test="organizationName != null and organizationName != ''">
        and ORGANIZATION_NAME like '%' ||  #{organizationName,jdbcType=VARCHAR} || '%'
      </if>
    </where>
  </sql>

用法:

<select id="selectBySelective" 				    parameterType="cn.org.nafmii.bean.basicgreen.BasicGreenSearchVO"  resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from T_CXQ_BASIC_GREEN
    <include refid="Where_Clause"/>
    order by CRE_TIME desc , BOND_CODE desc
</select>

< foreach> 下面的标签

<!--  int insertBatch(List<TCxqPool> recordList); -->
<insert id="insertBatch" parameterType="java.util.List">
    insert ALL
    <foreach item="item" index="index" collection="list">
      into T_CXQ_BRANCH_POOL (DCM_ID,STATUS, CRE_USER_ID)
      values 
        (#{item.dcmId,jdbcType=VARCHAR},#{item.status,jdbcType=VARCHAR},
        #{item.creUserId,jdbcType=VARCHAR})
    </foreach>
    SELECT 1 FROM DUAL
  </insert>

foreach用来在SQL中迭代一个集合。

< item > 表示集合中每个元素进行迭代时的别名

< index> 用来记录每次迭代时的位置,第几次

< open>表示该语句以什么开始

< separator>表示在每次进行迭代之间以什么符号作为分隔符

< close> 表示以什么结束

< collection> 该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

< trim>标签

<insert id="insertSelective" keyColumn="FEEDBACK_ID" keyProperty="feedbackId" parameterType="cn.org.nafmii.bean.basicgreen.TCxqBasicGreenFeedback">
    insert into T_CXQ_BASIC_GREEN_FEEDBACK
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="feedbackId != null">
        FEEDBACK_ID,
      </if>
      <if test="organization != null">
        ORGANIZATION,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="feedbackId != null">
        #{feedbackId,jdbcType=VARCHAR},
      </if>
      <if test="organization != null">
        #{organization,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>

< trim>标签用来拼凑sql

prefix:表示在trim包裹的SQL语句前面添加的指定内容

suffix:表示在trim包裹的SQL末尾添加指定内容

suffixOverrides:表示去掉(覆盖)trim包裹的SQL的指定首部内容

prefixOverrides:表示去掉(覆盖)trim包裹的SQL的指定尾部内容

Mybatis的多表查询实现

Mybatis的工作原理

  1. 根据配置文件(全局,sql映射)初始化出Configuration对象
  2. 创建一个DefaultSqlSession对象,它里面包含Configuration以及Executor(根据全局配置文件中的defaultExecutorType创建出对应的Executor)
  3. DefaultSqlSession.getMapper():拿到Mapper接口对应的MapperProxy;
  4. MapperProxy里面有(DefaultSqlSession);
  5. 执行增删改查方法:
    调用DefaultSqlSession的增删改查(Executor);
    会创建一个StatementHandler对象。同时也会创建出ParameterHandler和ResultSetHandler)
    调用StatementHandler预编译参数以及设置参数值,使用ParameterHandler来给sql设置参数
    调用StatementHandler的增删改查方法;
    ResultSetHandler封装结果

注意:四大对象(Executor、ParameterHandler、ResultSetHandler)每个创建的时候都有一个interceptorChain.pluginAll(parameterHandler);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值