Mybatis基础操作(核心)

本文详细介绍了在SpringBoot项目中使用Mybatis进行数据操作的方法,包括删除记录、预编译SQL以防止SQL注入、新增、更新数据以及查询功能。还涉及了XML映射文件的配置和动态SQL的使用技巧。
摘要由CSDN通过智能技术生成

一、根据主键删除

eg:

EmpMapper接口

@Mapper
public interface EmpMapper {
    @Delete("delete from tb_emp where id=#{id}")
    public void Delete(Integer id);
}

【注】#{...}里面的属性名可以随便写,但,建议与形参名一致,增强可读性。

test测试:

@SpringBootTest
class SpringbootMybatisQuickstartApplicationTests {
   @Autowired
    private EmpMapper empMapper;
    @Test
    public void testDelete(){
        empMapper.Delete(4);
    }

}

 删除(预编译SQL)

可以再application.properties中,打开mybatis的日志,并指定输出到控制台

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

通过预编译的SQL可以防止SQL注入问题,更加安全

参数占位符

eg:

二、新增

EmpMapper:

@Insert("insert into tb_emp (username, create_time, update_time, name, gender, image, job, entrydate, dept_id) " +
            "values (#{username},#{createTime},#{updateTime},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId});")
    public void insert(Emp emp);

testInsert:

 @Test
    public void testInsert(){
        Emp emp = new Emp();
        emp.setCreateTime(LocalDateTime.now());
        emp.setImage("1.jpg");
        emp.setJob((Integer) 1);
        emp.setGender((Integer) 1);
        emp.setName("汤姆");
        emp.setDeptId(1);
        emp.setUsername("Tom");
        emp.setEntrydate(LocalDate.of(2000,1,1));
        emp.setUpdateTime(LocalDateTime.now());

        empMapper.insert(emp);

新增且 获取返回的主键:

EmpMapper:

三、更新

Mapper:

 //更新
    @Update("update tb_emp set username=#{username},name=#{name},gender=#{gender},image=#{image}," +
            "job=#{job},entrydate=#{entraydate},dept_id=#{deptId},update_time=#{updateTime} where id=#{id}")
    public void update(Emp emp);

四、查询

Mapper:

//查询
    @Select("select * from tb_emp where id=#{id}")
    public Emp getById(Integer id);

【注】      实体类属性名 和 数据库表查询返回的字段名一致,mybatis自动封装。

                如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装

因此,查询的结果中,有null值

数据库表查询返回的字段名一致

解决方案:

(1)给字段起别名,让别名与实体类属性名一致

@Select("select id, username, create_time createTime, update_time updateTime, password, name, gender, image, job, entrydate, dept_id deptId " +
            "from tb_emp where id=#{id}")
    public Emp getById(Integer id);

输出结果:已封装进去!!!!

(2)@Result、@Results注解手动映射封装

Mapper:

@Results({
            @Result(column ="dept_id" ,property = "deptId"),
            @Result(column ="create_time" ,property = "createTime"),
            @Result(column ="update_time" ,property = "updateTime")
    })
    @Select("select * from tb_emp where id=#{id};")
    public Emp getById(Integer id)

(3)开启Mybatis的驼峰命名自动映射开关------a_column---->aColumn(常用)

        在resource的application.properties中加上

        #驼峰命名自动映射开关
        mybatis.configuration.map-underscore-to-camel-case=true

       那么, Mapper就可以写成:(最初的样子) 

@Select("select *from tb_emp where id=#{id}")
    public Emp  getById(Integer id);

五、条件查询

Mapper:【注】模糊查询用${} 。

Mapper:使用concat的另一种写法:

输出结果:

六、通过XML映射文件配置SQL语句(很重要!!!

1、XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)

2、XML映射文件的namespace属性为Mapper接口全限定名一致

3、XML映射文件中sql语句的id与Mapper接口中方法名一致,并保持返回类型一致

eg:

在resources下创建包:

在mybatis中文网中找下面这段,并复制到XML映射文件

完善XML文件:

mapper接口:

七、动态SQL

随着用户的输入或外部条件的变化而变化的sql语句,称之为动态SQL

<if>用于判断条件是否成立,如果条件为true,则拼接SQL。

        形式:<if test="name != null">...<if>

eg:

 <select id="list" resultType="com.example.pojo.Emp">
        select * from tb_emp
        <where>
            <if test="name != null">
                name like concat ('%',#{name},'%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>

<where>where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句开头的AND或OR

<set>动态地在行首插入SET关键字,并会删除额外的逗号。(由于update语句中)

<foreach>用于遍历

                eg:SQL语句:delete from tb_emp where id in (1,2,3);

                        接口方法:public void deleteById(List<Integer> ids);

                        XML映射文件:         

<!--    connection :遍历的集合
        item:遍历出来的元素
        separate:分隔符
        open:遍历开始前拼接的SQL片段
        close:遍历结束后拼接的SQL片段
-->
    <delete id="deleteById">
        delete from tb_emp where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

<include>  and <sql>      :

 <sql id="CommonSelect">
        select id,username,passward,name,gender,image,job,entrydate,dept_id,create_time,update_time
        from tb_emp
    </sql>
    <select id="list" resultType="com.example.pojo.Emp">
        <include refid="CommonSelect"/>
        <where>
            <if test="name != null">
                name like concat ('%',#{name},'%')
            </if>
            <if test="gender != null">
                and gender = #{gender}
            </if>
            <if test="begin != null and end != null">
                and entrydate between #{begin} and #{end}
            </if>
        </where>
        order by update_time desc
    </select>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值