黑马2023JAVAweb(09)|Mybatis基础操作(增删改查),动态SQL

一:Mybatis基础操作--基础&核心

面向注解编程

返回值,参数值,预编译(占位符,解决sql注入不安全的问题)

cf72dfd67ed949dfb812279a833a87f2.png

(一)环境准备

1.需求说明

572dddd021a74673ba2a55d011de1832.png

2.环境准备

28d2cb317fa943e09fc3efc9b2b361b1.png

Emp文件

package com.ithema.jopo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
        private Integer id; //主键自增
        private String usename;  //用户名
        private String password; //密码
        private String name;  //姓名
        private short gender;  //性别
        private String image;  //图片
        private short job; //工作
        private LocalDate entrydata; //入职时间
        private Integer deptId;  //所属部门id
        private LocalDateTime createTime;  //创建时间
        private LocalDateTime dataTime;  //修改时间

}

(二)删除--@Delete()

1.根据主键删除

2b3fd0baf80a44b7a8dc359605cd6175.png

e2e1fd6bda854c39a3fd5d26dff697b1.png

-- mysql语句:

delete from emp where id=17

-- 接口文件
@Mapper
public interface EmpMapper {
    //删除元素
    //主键删除
    @Delete("delete from emp where id=#{id}")
    public void delet( Integer id);
}
-- test文件
class SpringbootMybatisDemoApplicationTests {

    @Autowired
    public EmpMapper empMapper;

    @Test
    //演示操作方法
    public void delet(){
        empMapper.delet(17);
    }

}

2.配置mybatis日志

7614a625ec0d4efd91a7113c66250f84.png

72cab873ab6645df80d5c9a68802316c.png

3.预编译sql--性能更高&安全

9a0475afef4a452cb1e458968bc53a86.png

(1)性能高

18137fdc3e8849ac89f991cffa15d196.png

(2)安全

解决SQL注入问题

29f6a9911aa34d8ea5e7986c1ffd3b70.png

预编译:

ae52f24f0406498d8cf079fbfb32e534.png

4.SQL注入问题(不安全)

347b3adda5ff466eb38bd2e3f4b8d5cf.png

5.占位符

97aab0b860c5462ab82ee7f66d926380.png

(三)插入--@Insert()

1.新增操作+#占位

多个参数封装到对象中,然后传递一个对象

id主键自增,一开始17个数据,删掉两个,再新增一个,新增的数据id为18而不是16

7d8f0f2c6f5a44a884ed58f7982053ee.png

86171b6180794cd2ac9d6891f574d34f.png

37467a1ae26049ad9f2f2b5d4ed5832b.png

2.新增(主键返回)

获取新增数据的自增主键值

0430237f683b463ba6a5b9cd39cb44f4.png

73179edec36c4287bdacd3a9e85023ad.png

(四)更新--@Updata()

1.需求展示

c6d07865a1b244e7895a6a27d4e716a3.png

2.更新操作

cca25060079642d4947cdca2e49d31bc.png

(五)查询--@Select()

1.查询操作

ebc4bf29ab4042bc9daf5aa386968dc3.png

2.数据封装

2f22035f663649b0ab87a2f60924c57e.png

(1)给字段起别名

cb1108d0afda496a9d2e5eae90aa235c.png

(2)@result注解,手动映射封装--不推荐

6161b99dc19f4dd1ad7a7733c8ed4c86.png

(3)在配置文件里开启mybatis的 驼峰命名自动映射开关--推荐

bdbdbc7d127a44aaa1730cde83f8b0f3.png

# 开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true

3.条件查询

(1)案例操作

模糊匹配时不能用#占位符,只能用$占位符(拼接占位符)

---问题$占位符(拼接占位符)生成的不是预编译sql,导致性能低,不安全,存在sql注入问题

---解决方法--concat 字符串拼接函数

不能用#占位符:因为:模糊匹配中like ('%张%'),用#占位符,变成了like ('%?%'),?在’‘里无法匹配

691b8a3bdad24370b4079e96b397a3e3.png

b8166d7dc58e4252b744e5ce36f82b42.png

1f26fd2819ef443a972e07b1ac288f49.png

(2)参数名说明

c3e064f294854a2792ae53d3b0cc720f.png

二.XML映射文件

java下运行文件

resourse下各类配置文件

基于注解的SQL语句---@Select

基于XML映射文件的SQL语句---本节内容

72ddc34407f34a2795de5836abd537d5.png

1.  3个规范

(1)建XML映射文件

f5f017a53ed24df4a37132932ea3a18d.png

(2)namesapce属性

9ee1bcd318e042369a86636d0dc68ba0.png

上面复制的这个代码会报错---如下解决

2294937222524d1abe5083334829ef35.png

正确的通用XML映射文件代码

<?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">

namesapce属性

5eeccf2fd94b4f1cb40e674edfa417f6.png

(3)mapper中写sql语句, 并定义id

id:接口中的方法名(使用该sql语句的方法)

返回值类型: 单条记录封装的类型,即使返回的是多行多列的list,list为每一条数据,这里返回值为list里的每一条数据的类型。注意同样要同上面namesapce属性值一样,用特殊引用格式

ebcfb65bdac14547b7c947fb11b572c0.png

03d8628515e14292ac96c1bd07670eda.png

897e3a96c85b47aebe77e8e96c77e285.png

2.XML映射文件插件

5575b0ae64604e44b11556425f7eb99b.png

3.如何选择注解与XML映射文件

fe79531e9e054de286b389203cff27f4.png

三:Mybatis--动态SQL

1.<if> & <where>&<set>

97cf4be246874e48890f9928598de3d6.png

(1)基础用法--<if> & <where>

d2151b06ac1f4a81926d8661d19a6fe1.png

4c56977f91104484a362378c019d5abc.png

8773f736799d4d7da82c62c5b4e96fe6.png

<select id="select" resultType="com.ithema.jopo.Emp">  -- XML映射文件
    select username, name, gender, image, job, entrydate, dept_id, create_time, update_time from 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>
</select>
//动态sql <if>--接口文件
public List<Emp> select(String name, short gender, LocalDate begin, LocalDate end );
@Test  // 测试文件
public void selec(){
    // if & where
    List<Emp> empList= empMapper.select(null,(short)2,null,null);
    System.out.println(empList);
}

(2)案例--动态更新--<set>

aa5522d7c3284919a28d63198f0b8d61.png

201215d5081c4ba0b1c116c1a42ba3c9.png

报错:

c01b8bdbd5e14ecaa8157d6395482eb7.png

要改成如下格式,图中还有一个错误,updata 中不用and,将and改为  ,  逗号

c986fdffd8b849729a492ba557992691.png

错误: Mapper method 'com.ithema.mapper.EmpMapper.updataEmp' has an unsupported return type: class com.ithema.jopo.Emp

20f73be959404fadb3f38a8882a060a9.png

8e69ab0303cc401b9de4c54a52fe9ecb.png

<update id="updataEmp">
    update emp
    <set>
        <if test="name!=null">
            name=#{name}
        </if>
        <if test="gender!=null">
            , gender=#{gender}
        </if>
        <if test="usename!=null">
            , usename =#{usename}
        </if>
        <if test="password!=null">
            , password =#{password}
        </if>
        <if test="image!=null">
            , image =#{image}
        </if>
        <if test="job!=null">
            , job =#{job}
        </if>
        <if test="entrydata!=null">
            , entrydata =#{entrydata}
        </if>
        <if test="deptId!=null">
            , dept_id =#{deptId}
        </if>
        <if test="dataTime!=null">
            , data_time =#{dataTime}
        </if>
        <if test="createTime!=null">
            , create_time =#{createTime}
        </if>
    where id=#{id}
    </set>
</update>
动态sql <if> <set>
public void updataEmp(Emp emp );
@Test
public void updat(){
    Emp emp=new Emp();
    emp.setGender((short)2);
    emp.setId(15);
    emp.setName("tom22");
    emp.setDataTime(now());
    empMapper.updataEmp(emp);
}

2.<foreach>

070aa99484a3429a9906fbb12cb305f7.png

举例:

defb4d88b0c04faeb779db4079f15905.png

a596fef1fc3c45809cc14cf4e95e4ede.png

<delete id="dele">
    delete from emp where id in
    <foreach collection="arg" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>

</delete>
@Test
public void delee(){
    ArrayList<Integer> arg=new ArrayList<>();
    Collections.addAll(arg,1,2,3);
    empMapper.dele(arg);
}
//<foreach>
public void dele(ArrayList<Integer> arg);

3.<sql><include>

sql片段的查询与引用

3967e24cc3f1485eb1d776179820d313.png

4.小结

70ac1b24015e4e819ceeb41676299852.png

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值