创建工程
[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>
动态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));
}
动态修改
和上面普通修改的区别在于,如果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>