前言:
在现代应用开发中,数据库操作是核心环节。MyBatis 作为一款灵活的持久层框架,提供了直接编写 SQL 语句的能力,避免了其他 ORM 框架可能带来的性能和功能限制。MyBatis 的查询、修改和删除操作是开发者必须掌握的基本技能。这些操作不仅影响数据的获取、更新和删除,还直接关系到应用的性能与安全性。接下来,我们将简要介绍 MyBatis 中如何高效执行这三种操作,并通过代码示例展示最佳实践
MyBatis搭建与配置
- 创建一个maven对象
- 导入MyBatis.jar包
- 创建一个全局的MyBatis配置文件
- 创建数据库
- 定义Dao接口,定义方法
- 创建sql映射文件,编写sql
- 测试MyBatis
MyBatis搭建与配置https://blog.csdn.net/Dreamkidya/article/details/141524923?spm=1001.2014.3001.5501
Sql配置代码解读
<insert id="insertAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id"> insert into admin (account,password,gender) values (#{account},#{password},#{gender}) </insert> <select id="findAdminById" parameterType="int" resultType="Admin"> select * from admin where id = #{id} </select>
id —>唯一标识(接口中方法名)
parameterType=“参数类型"
useGeneratedKeys ="true" 返回自增主键
keyProperty="id" 定义接收属性
keyColumn="id" 定义主键列
以上三个设置,数据库添加数据等,会向后端返回该数据行的主键值
resultType="返回结果集类型"
参数传递
单参数传递
Admin selectAdmins(int id);
多参数传递
多个参数使用@Param(“id”)绑定
//多个参数的传递
Admin login(@Param("acc") String account, @Param("pass") String password);
复杂参数传递
如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,例如: void insertAdmin(Admin admin)
Admin login1(Admin admin);
单表增删改查
<!-- 修改-->
<update id="updateAdmin" parameterType="admin">
update admin set account = #{account},password = #{password},gender = #{gender} where id = #{id}
</update>
<!-- 添加-->
<insert id="insertAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
insert into admin (account,password,gender) values (#{account},#{password},#{gender})
</insert>
<!-- 查询-->
<select id="findAdminById" parameterType="int" resultType="Admin">
select * from admin where id = #{id}
</select>
<!-- 删除-->
<delete id="deleteAdmin" parameterType="int">
delete from admin where id = #{id}
</delete>
#{}和${}的区别
#{} 占位符,采用预编译的方式向sql中传值,可以防止sql注入,如果我们往SQL传值,使用#{}
${} 是将内容直接拼接到sql语句中,一般不用与向sql中传值,一般用于向SQL中动态的传递列名
区别:
- 底层实现不同
- #{} 采用预编译方式,防止sql注入更加的安全
- ${} 采用字符串拼接,直接将值拼接在sql中
- 使用场景不同
- #{} 一般用于向sql中的列传值
- ${} 一般用于向sql中动态的传递列明 例如:排序时 order by 后面的列名是可以改变的.select后面的列名也可以自由选择
resultMap
定义 resutlMap
<resultMap id="majorMap" type="major">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
</resultMap>
- resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为 “majorMap”
- resutlMap 的 type 属性是映射的 POJO 类型
- id 标签映射主键,result 标签映射非主键
- property 设置对象属性名称,column 映射查询结果的列名称
驼峰命名与下划线映射关系
为什么要解决驼峰命名与下划线映射关系?
因为数据库中命名一般为Student_Id Java中命名一般为StudentId所以为了我们方便操作,我们通过设置来解决问题
解决:在mybatis配置文件中设置如下代码
<!-- MyBatis配置文件-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 打印日志 -->
<setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 解决驼峰问题 -->
</settings>
多表操作
association 关联数据表
关联查询
方法一:在数据库中一次查出所有数据
<!--对关联查询到的学生信息进行自定义映射关系-->
<resultMap id="studentMap" type="student">
<id column="id" property="id"></id>
<result column="num" property="num"></result>
<result column="name" property="name"></result>
<result column="gender" property="gender"></result>
<!--映射关联数据 专业名称-->
<association property="major" javaType="major">
<result column="mname" property="name"></result>
</association>
</resultMap>
<!--关联查询第一种-->
<select id="findStudent" resultMap="studentMap">
select s.id,
s.num,
s.name,
s.gender,
m.name mname
from student s inner join major m on s.majorid = m.id where s.id = #{id}
</select>
注:association 关联数据表
property="major" ---->student对象中的major成员变量
javaType="major"----->major对象
解释:我们在Student类中创建Major变量,从而将Major类和Student类连接.我们从后端查询出来的Major类中数据,我们可直接封装在Major对象中(简单理解:其实也就是给Major变量赋值)
嵌套查询
方法二:数据库分次查询
<!-- 关联查询第二种-->
<resultMap id="studentMap1" type="student">
<id column="id" property="id"></id>
<result column="num" property="num"></result>
<result column="name" property="name"></result>
<result column="gender" property="gender"></result>
<!-- 封装关联查询-->
<association property="major" javaType="major" select="findMajor" column="majorid">
</association>
</resultMap>
<select id="findStudentById" resultMap="studentMap1">
select id,num,name,gender,majorid from student where id = #{id}
</select>
<!-- 嵌套查询学生关联的专业-->
<select id="findMajor" resultType="major">
select name from major where id = #{majorid}
</select>
collection关联数据表
collection用来查询一个集合
关联查询
<resultMap id="majorMap" type="major">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<collection property="students" javaType="list" ofType="student">
<result column="num" property="num"></result>
<result column="sname" property="name"></result>
</collection>
</resultMap>
<select id="findMajorById" parameterType="int" resultMap="majorMap">
select
m.id,
m.name,
s.num,
s.name sname
from major m inner join student s on m.id = s.majorid where m.id = #{id}
</select>
嵌套查询
<resultMap id="majorMap1" type="major">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<collection property="students" javaType="list" ofType="student" select="findStudents" column="id"></collection>
</resultMap>
<select id="findMajors1" resultMap="majorMap1">
select id,name from major
</select>
<select id="findStudents" resultType="student">
select num,name from student where majorid = #{id}
</select>
代码解读
Collection和Association区别
Collection(集合)
- 定义: Collection 是一个数据结构或容器,用于存储一组对象。它通常用于管理和操作多个相同类型的对象。例如,列表(List)、数组(Array)、集合(Set)等都是典型的 Collection。
- 特点:
- 包含多个对象,可以对其进行添加、删除、迭代等操作。
- Collection 通常与某种特定的数据结构关联,负责对这些对象进行管理(如排序、查找等)。
- 对象的生存周期通常由 Collection 管理,特别是在集合被销毁时,里面的对象可能也会被销毁。
- 用途: 用于聚合和管理一组对象,通常用于处理大量相同类型的对象集合。
Association(关联关系)
- 定义: Association 是一种类与类之间的关系,描述一个类的对象与另一个类的对象之间的链接。例如,一个学校类和一个学生类之间可能会有一个 Association,表示学校包含许多学生。
- 特点:
- 表示类之间的连接或关系,而不是数据结构本身。
- Association 可以是单向或双向的。单向 Association 表示一个类知道另一个类的存在,但反之不然;双向 Association 则表示两个类彼此都知道对方。
- 关联关系不负责对象的生存周期管理。对象的创建和销毁由其他机制负责。
- 用途: 用于表示类与类之间的关系,帮助定义对象间的交互和连接。
总结
- Collection 主要用于管理一组对象的集合,关注的是数据结构和对象的管理。
- Association 主要用于描述类之间的关系,关注的是对象之间的连接和相互作用
注解方式
- @Insert : 插入 sql , 和 xml insert sql 语法完全一样
- @Select : 查询 sql, 和 xml select sql 语法完全一样
- @Update :更新 sql, 和 xml update sql 语法完全一样
- @Delete :删除 sql, 和 xml delete sql 语法完全一样
使用场景:简单的sql一般适合使用注解查询 例如:用户信息查询,添加用户,删除单个用户等
代码演示:
@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);
动态sql
出现原因:因为业务需求出现用户存数据可能只存 姓名 不存 性别 或者不存任何数据,sql语句就需要判断书写.
第一:where 与 if 标签
if test 属性条件成立 执行if标签体,不成立就不执行
where标签 当where标签 if语句有条件成立时,就会动态添加where关键字,还可以删除where后面紧跟的关键字(例如:and,or)
<select id="teachers1" resultType="teacher">
SELECT * FROM teacher
<where>
<if test="num!=0">
and num = #{num}
</if>
<if test="name!=null">
and name = #{name}
</if>
</where>
</select>
第二:trim标签
参数:
-
prefix:
- 作用: 在生成的 SQL 语句前添加的内容。
- 示例: 如果你想在 SQL 语句的条件部分加上
WHERE
,可以使用prefix="WHERE"
。
-
prefixOverrides:
- 作用: 如果生成的 SQL 语句以指定的内容开头,则移除这些内容。通常用于去掉多余的
AND
或OR
。 - 示例:
prefixOverrides="AND"
会去掉生成 SQL 语句中以AND
开头的部分。
- 作用: 如果生成的 SQL 语句以指定的内容开头,则移除这些内容。通常用于去掉多余的
-
suffix:
- 作用: 在生成的 SQL 语句末尾添加的内容。
- 示例: 如果你想在 SQL 语句的最后加上
ORDER BY
,可以使用suffix="ORDER BY"
。
-
suffixOverrides:
- 作用: 如果生成的 SQL 语句以指定的内容结尾,则移除这些内容。通常用于去掉多余的逗号、AND 或 OR。
- 示例:
suffixOverrides=","
会去掉生成 SQL 语句末尾多余的逗号
第三:choose标签
注:choose标签选择标签,标签中必须有选择对象,也就是必须有<when>标签
<select id="teachers" resultType="teacher">
SELECT * FROM teacher
<trim prefix="where" prefixOverrides="and|or">
<choose>
<when test="name!=null">
name = #{name}
</when>
<otherwise>
name = '苏老师'
</otherwise>
</choose>
</trim>
</select>
<when> --->当test中条件满足这执行,不满足执行<otherwise>标签中 和 if else差不多
第四:set标签
<set>标签可以在变量之间添加 逗号(,)
<update id="updateTeacher" parameterType="teacher">
update teacher
<set>
<if test="num!=0">
num = #{num},
</if>
<if test="name!=null">
name = #{name}
</if>
<if test="gender!=null">
gender = #{gender}
</if>
where id = #{id}
</set>
</update>
第五:foreach标签
1. collection
- 作用: 指定要迭代的集合。这个集合可以是列表、数组或其他 Java 集合类型。
- 示例:
collection="list"
表示要迭代名为list
的集合。
2. item
- 作用: 指定每次迭代时集合中元素的变量名。
- 示例:
item="item"
表示每次迭代时,当前集合项会被引用为item
。
3. index
- 作用: 可选参数,指定每次迭代时当前项的索引(从 0 开始)。通常用于在 SQL 语句中需要索引的场景。
- 示例:
index="index"
表示每次迭代时,当前项的索引会被引用为index
。
4. open
- 作用: 在生成的 SQL 片段开头添加的内容。通常用于生成集合的开头部分,如括号。
- 示例:
open="("
表示生成的 SQL 片段的开头会加上左括号。
5. close
- 作用: 在生成的 SQL 片段末尾添加的内容。通常用于生成集合的结束部分,如括号。
- 示例:
close=")"
表示生成的 SQL 片段的末尾会加上右括号。
6. separator
- 作用: 指定每个集合项之间的分隔符。用于生成 SQL 片段中的项之间的分隔符,如逗号。
- 示例:
separator=","
表示集合项之间会用逗号分隔
代码演示:
<delete id="deleteTeacher" parameterType="list">
DELETE FROM teacher
WHERE id IN
<foreach collection="list" item="ids" open="(" separator="," close=")">
#{ids}
</foreach>
</delete>
感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!
希望路飞的笑容可以治愈努力路途中的你我!
博主vx:Dreamkid05 --->欢迎大家和博主讨论问题