[SpringBoot]xml写mapper&设置自动提示

目录

创建工程[SpringBoot框架]如何使用SpringBoot框架_万物更新_的博客-CSDN博客

 实现步骤:

设置自动提示

动态sql

 第一种批量删除 

第二种批量删除 参数为list集合

   第三种批量删除 参数为Integer... 和Array数组一样

批量插入 

动态修改 

sql片段 

 当使用MyBatis框架查询数据,自定义对象的属性名和表字段的名不一致时如何解决?

useGeneratedKeys="true" keyProperty="id"的作用


创建工程
[SpringBoot框架]如何使用SpringBoot框架_万物更新_的博客-CSDN博客

 实现步骤:

 

测试:  

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.tedu.demo529.mapper.ProductMapper"><!--里面写mapper接口的完全限定名-->
    <insert id="insert">
        INSERT INTO cs.product(id,title,price,num) VALUES (NULL,#{title},#{price},#{num})
    </insert>
    <select id="select" resultType="cn.tedu.demo529.entity.Product"># resultType这个里面想把数据封装成什么对象就写什么
        SELECT * FROM cs.product
    </select>
    <delete id="deleteById">
        DELETE FROM cs.product WHERE id=#{id}
    </delete>
    <update id="update">
        UPDATE cs.product SET title=#{title},price=#{price},num=#{num} WHERE id=#{id}
    </update>
</mapper>

设置自动提示

 在xml里面写sql语句它不提示代码是因为他不知道你要使用哪种方言,我们设置它的方言就会自动提示了。

 配置成功后颜色是蓝色

动态sql

 第一种批量删除 

foreach循环遍历标签,collection用来设置遍历对象的类型,#{id}代表的是遍历出来的每一个item里面的id,separator=","是分割符号

  //第一种批量删除
    int deleteByIds1(Integer[] ids);

    <delete id="deleteByIds1">
        DELETE FROM cs.product WHERE id IN(
            <foreach collection="array" item="id" separator=",">#{id}</foreach>
            )
    </delete>
   @Test
    void delete1(){
        Integer[] ids = {10,11,12,13};
        System.out.println(productMapper.deleteByIds1(ids));
    }

第二种批量删除 参数为list集合

    //第二种批量删除
    int deleteByIds2(List<Integer> ids);
    <delete id="deleteByIds2">
        DELETE FROM cs.product WHERE id IN(
        <foreach collection="list" item="id" separator=",">#{id}</foreach>
        )
    </delete>

    @Test
    void delete2(){
        ArrayList<Integer> list = new ArrayList<>();
        list.add(18);
        list.add(19);
        list.add(20);
        System.out.println(productMapper.deleteByIds2(list));
    }

   第三种批量删除 参数为Integer... 和Array数组一样

 //第三种批量删除
    int deleteByIds3(Integer... ids);
    <delete id="deleteByIds3">
        DELETE FROM cs.product WHERE id IN(
        <foreach collection="array" item="id" separator=",">#{id}</foreach>
        )
    </delete>
    @Test
    void delete3(){
        System.out.println(productMapper.deleteByIds3(21,22,23,24));
    }

批量插入 

//批量插入管理员与角色的关联数据
int insertBatch(AdminRole[] adminRoleList);
    <!-- int insertBatch(AdminRole[] adminRoleList); -->
    <insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO ams_admin_role
            (admin_id, role_id, gmt_create, gmt_modified)
        VALUES
            <foreach collection="array" item="adminRole" separator=",">
                (#{adminRole.adminId}, #{adminRole.roleId}, #{adminRole.gmtCreate}, #{adminRole.gmtModified})
            </foreach>
    </insert>

动态修改 

和上面普通修改的区别在于,如果set修改的字段没给值,那么根据实体类的包装类型会把原字段改为null,动态修改则只是给值的才修改,没给值的不会改.


把STE 改为<set>标签会把多余的逗号去掉(因为如果修改的字段是空的话就就会多一个逗号)


if标签用来进行动态的判断,满足条件时才会生成标签体内的

  //动态修改
    int dynamicUpdate(Product product);
   <update id="dynamicUpdate">
        UPDATE cs.product
        <set>
        <if test="title!=null">title=#{title},</if>
        <if test="price!=null">price=#{price},</if>
        <if test="num!=null">num=#{num}</if>
        </set>
        WHERE id=#{id}
    </update>

@Test
    void dynamicUpdate(){
        Product p = new Product();
        p.setId(25);
        p.setTitle("智能语言机器人");
        System.out.println(productMapper.dynamicUpdate(p));
    }

sql片段 

定义sql片段,如果要查询的字段非常多,就可以定义为片段

    <sql id="selectSQL">
        id,title,price,num
    </sql>
    <select id="selectById" resultType="cn.tedu.demo529.entity.Product">
    SELECT <include refid="selectSQL"></include> FROM cs.product WHERE id=#{id}
    </select>

也许会飘红,但不影响效果

 当使用MyBatis框架查询数据,自定义对象的属性名和表字段的名不一致时如何解决?

1.如果仅仅是命名规范不一致 可以通过在application.properties里面添加以下配置解决  

# 配置自动匹配对象属性名和表字段名不一致的问题
mybatis.configuration.map-underscore-to-camel-case=true

2.通过别名的方式解决 可以解决属性名和字段名完全不一致的问题

<select id="select" resultType="cn.tedu.boot10.entity.Class">
    SELECT id,class_name name,teacher_name teacherName,grade_level gradeLevel FROM class
</select>

 3.通过resultMap标签解决,比别名的好处是可以复用

<!--通过ResultMap标签解决属性名和字段名不一致的问题-->
<resultMap id="classRM" type="cn.tedu.boot10.entity.Class">
    <id property="id" column="id"></id>
    <result property="name" column="class_name"></result>
    <result property="teacherName" column="teacher_name"></result>
    <result property="gradeLevel" column="grade_level"></result>
</resultMap>
<select id="select" resultMap="classRM">
    SELECT id,class_name,teacher_name,grade_level FROM class
</select>

useGeneratedKeys="true" keyProperty="id"的作用

 如果插入的这张表主键是自动编号的,就应该配上useGeneratedKeys="true" keyProperty="id"这两个属性,作用是获取自动编号的id值。这是一个规范。

  <insert id="insertBatch" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO ams_admin_role
            (admin_id, role_id, gmt_create, gmt_modified)
        VALUES
            <foreach collection="array" item="adminRole" separator=",">
                (#{adminRole.adminId}, #{adminRole.roleId}, #{adminRole.gmtCreate}, #{adminRole.gmtModified})
            </foreach>
    </insert>

比如:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值