Mybatis基础操作

1、使用注解定义增删改查,分别用什么注解实现?


@Insert
@Delete
@Update
@Select


2、被@Select,@Update,@Delete,@Insert 注解的方法,要放在哪里?


被@Select, @Update, @Delete, @Insert注解的方法通常放在Mapper接口中。这些注解用于定义SQL语句的执行方法,通过在Mapper接口中使用这些注解来与数据库进行交互。



3、在新增数据时,如果想要让id回存到对象中怎么办?


含义:在数据添加成功后,需要获取插入数据库数据的主键。

在新增数据时,如果想要让id回存到对象中,可以使用@Options注解来配置自动生成主键,并将生成的主键回写到对象中。

例如,在MyBatis中,可以在插入语句的方法上使用@Options注解,并设置keyProperty属性为要回写的属性名,keyColumn属性为数据库中的主键列名,useGeneratedKeys属性为true,如下所示:

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

其中,table_name为要插入的表名,column1column2为表的列名,property1property2为对象的属性名。

这样,在执行插入操作后,数据库会自动生成主键,并将生成的主键回写到对象的id属性中。



4、如果表中的字段名称和POJO中属性名称不一样,怎么去实现数据的映射?


1). 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。

2). 手动结果映射:通过 @Results及@Result  进行手动结果映射。

3). 开启驼峰命名(推荐):如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。
要使用驼峰命名前提是 实体类的属性 与 数据库表中的字段名严格遵守驼峰命名。



5、#{} 和 ${} 的区别是什么?

在Mybatis中提供的参数占位符有两种:${...}, #{...}。

1). #{...}

执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值。

使用时机:参数传递,都使用#{…}

2). ${...}

拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。

使用时机:如果对表名、列表进行动态设置时使用。

注意事项:

在项目开发中,建议使用#{...},生成预编译SQL,防止SQL注入安全。

1、#{}和${}取值的相同点:
都能够获取传入的命名参数

2、#{}和${}取值的不同点:
#{}: 以预编译的方式将参数设置到sql语句中 防止SQL注入 。可以自动加单引号
${}: 把参数直接拼接到sql语句中 不能够防止sql注入。不能自动加单引号(如果是日期或者是字符串,自己加单引号)。

3、具体应用:
#{}获取sql语句中的条件参数
${}应用于sql语句拼接和读取配置文件

4、 ${}注意事项
如果获取单个值,可以用${value} ,建议使用@Param取参数名字
${参数} 可能获取到properties文件中的值





6、接口中的方法怎么设定参数名,好让SQL语句中能够识别。

在接口中的方法中,可以通过使用@Param注解来设定参数名,以便让SQL语句中能够识别。

例如,假设有一个查询方法,需要根据用户名和年龄进行查询:

java@Select("SELECT * FROM users WHERE username = #{name} AND age = #{age}")
User findUserByNameAndAge(@Param("name") String username, @Param("age") int age);

在上述代码中,@Param注解用于设定参数名。在SQL语句中,使用#{name}和#{age}来引用参数。

这样,在调用该方法时,传入的参数名会被映射到SQL语句中的对应位置,以便正确地执行数据库操作。


mybatis中能够接收2种类型的参数传入:
【1】简单类型数据:
单个参数: (Integer id);
mybatis底层不做处理,使用任意变量都可接收 #{abc} 建议直接写参数名
多个参数: (@Param("username")String username,@Param("sex")String sex);
需要使用Param注解定义参数的名字,@Param("username") 中的名字是给映射xml文件中SQL语句使用的 #{username}
【2】复杂数据类型:
1.pojo类型数据:mybatis底层直接使用pojo封装数据 sql取值: #{pojo的属性名}
JavaBean,Pojo 要根据规范书写,提供正常的getter,setter。
2.map集合数据:mybatis底层直接使用map封装参数
sql取值: #{map键名}
Lombok


7、动态SQL中有哪些标签,各有什么作用


<if>:用于判断条件是否成立,使用test属性进行条件判断,如果条件为true,则拼接SQL。
<where>:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。
<set>:动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
<foreach>:遍历元素/项。
foreach的属性:
collection:集合名称
item:集合遍历出来的元素/项
separator:每一次遍历使用的分隔符
open:遍历开始前拼接的片段
close:遍历结束后拼接的片段
<sql>:对重复的代码片段进行抽取,将其通过  标签封装到一个SQL片段 。定义可重用的 SQL 片段。
<include>:在原来抽取的地方进行引用。通过属性refid,指定包含的sql片段。

在MyBatis中,有以下几个常用的动态SQL标签:

  1. <if>:用于条件判断,根据条件的真假来决定是否包含其中的SQL语句片段。语法如下:

    xml

    <if test="condition"> SQL statement </if>
  2. <choose><when><otherwise>:用于多重条件判断,类似于Java中的switch语句。<choose>标签包含多个<when>标签和一个可选的<otherwise>标签,根据条件的匹配情况执行相应的SQL语句片段。语法如下:

    xml

    <choose> <when test="condition1"> SQL statement </when> <when test="condition2"> SQL statement </when> <otherwise> SQL statement </otherwise> </choose>
  3. <foreach>:用于循环遍历集合或数组,并将集合或数组中的元素作为参数传递给SQL语句。语法如下:

    xml

    <foreach collection="collection" item="item" index="index" open="(" separator="," close=")"> #{item} </foreach>
  4. <set>:用于动态更新语句中的SET子句,根据参数的值动态生成更新的字段。语法如下:

    xml

    <set> <if test="condition1"> column1 = #{value1}, </if> <if test="condition2"> column2 = #{value2}, </if> </set>
  5. <where>:用于动态生成WHERE子句,根据参数的值动态生成查询条件。语法如下:

    xml

    <where> <if test="condition1"> AND column1 = #{value1} </if> <if test="condition2"> AND column2 = #{value2} </if> </where>

这些动态SQL标签可以根据不同的条件动态生成SQL语句片段,使得SQL语句更加灵活和可复用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值