Java 阶段三 Day10 MyBatis框架-xml管理
MyBatis框架-xml管理
一、xml与注解比较
1.1 xml定义
XML是一种可扩展性语言,用户可以自己定义标签,用来描述特定类型的数据;
XML的语法严格,每个标签都必须有一个结束标签,标签的嵌套关系也必须合法;
XML(Extensible Markup Language)是一种标记语言,用于存储和传输数据。它是一种文本格式,被设计用来在不同系统之间共享数据。XML 的定义包括以下关键点:
-
可扩展性(Extensible):XML 允许用户自定义标签和数据结构,以适应特定的应用需求。这意味着你可以创建自己的标记,定义自己的数据格式。
-
标记语言(Markup Language):XML 使用标签来标识数据的结构和含义。标签通常由尖括号包围,如
<tagname>
。标签可以用来表示元素、属性、注释等。 -
层次结构(Hierarchical Structure):XML 数据以层次结构的方式组织,类似于树形结构。有一个根元素,根元素下可以包含子元素,子元素可以有子元素,依此类推。
-
自我描述性(Self-Descriptive):XML 文件包含了元素的标签和数据,同时也可以包含元素的属性。这使得XML文件本身可以解释其数据的含义。
-
通用性(Platform-Independent):XML 不依赖于任何特定的编程语言或操作系统,因此可以在各种不同的平台和系统之间轻松传递和解释。
-
纯文本(Plain Text):XML 文件是纯文本文件,可以使用文本编辑器进行创建和编辑。这也使得它易于理解和处理。
-
严格的语法(Well-Defined Syntax):XML 有严格的语法规则,包括正确的标签嵌套、属性格式和字符转义等规定。
1.2 和SQL注解比较
- xml 配置SQL,可以将SQL语句和JAVA代码分离开
- xml 配置SQL,支持动态SQL语句
- xml 配置SQL,支持SQL语句的复用
二、环境初始化
依然使用 Mybatis 工程
- SpringBoot版本:2.7.15
- 依赖项
- MyBatis Framework
- MySQL Driver
- 注释掉 UserMapper、WeiboMapper、CommentMapper中的所有 @Insert() @Update() @Select() @Delete 注解
三、使用流程
-
在resources目录下创建 mappers目录,用来存放xml配置文件
-
将映射文件写入resources/mappers目录
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration>
-
application.properties中添加配置:mybatis框架映射配置文件的位置
# 设置MyBatis框架的映射(Mapper)配置文件的位置 mybatis.mapper-locations=classpath:mappers/*.xml
四、xml配置SQL标签
-
说明:在 Mybatis 的 XML 文件中,SQL 语句都是使用 SQL 标签来定义的
-
常用的SQL标签
- select:用于查询操作,包括多表查询、条件查询等。可以使用 resultType 来指定返回结果的类型。
- insert:用于插入操作,并将其自动注入实体类中。
- update:用于更新操作,包括更新一条记录或者批量更新。
- delete:用于删除操作,包括删除一条记录或者批量删除。
- if、foreach、set
用于条件控制,可以根据不同的条件进行查询、插入、更新和删除操作。if 标签用于指定可以为空的查询条件,foreach 标签用于循环查询,set 标签用于指定更新操作的字段值。 - sql:用于定义可重用的 SQL 片段,通常是一些较为复杂的 SQL 片段。可以在其它 SQL 语句中使用 include 标签来引用 SQL 片段。
- include:用于引入外部的 SQL 片段。可以在 include 标签的 refid 属性中指定外部 SQL 片段的名字,然后在当前 SQL 中使用它。
这些 SQL 标签可以随意组合,可以使 SQL 语句变得很灵活和强大。通常需要根据实际业务场景选择合适的标签来实现相应的 SQL 操作。
五、整合MyBatis完成用户数据操作
5.1 知识点设计
基于本业务实现 MyBatis 基本操作,掌握 MyBatis 中 xml 配置 SQL 的应用。
将 xml 映射文件重命名为 UserMapper.xml
5.2 Dao接口设计
UserMapper.java
@Mapper
public interface UserMapper {
/**在User表中插入一条表记录*/
int insert(User user);
}
5.3 定义映射文件
UserMapper.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">
<!-- 1.填写namespace,填写UserMapper的绝对路径 -->
<mapper namespace="com.example.mapper.UserMapper">
<!-- id的属性值要和UserMapper中定义的方法名一致 -->
<insert id="insert">
INSERT INTO user VALUES (NULL,#{username},#{password},#{nickname},#
{created})
</insert>
</mapper>
5.4 Dao接口单元测试
// 自动装配
@Autowired
private UserMapper userMapper;
// 测试插入数据
@Test
void testInsert(){
User user = new User();
user.setUsername("左大凯");
user.setPassword("123456");
user.setNickname("酒┏┛墓┗┓...(((m -__-)m");
user.setCreated(new Date());
// 调用接口方法
System.out.println(userMapper.insert(user));
}
六、整合MyBatis完成标签业务操作
6.1 业务描述
基于SpringBoot脚手架工程对MyBatis框架的整合,实现对微博内容 weibo 表进行操作。
6.2 Dao接口设计
WeiboMapper.java
import weibo;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface WeiboMapper {
/**在微博表中插入数据*/
int insert(Weibo weibo);
/**根据微博id查询数据*/
Weibo selectByWeiboId(int id);
/**查询所有微博信息*/
List<Weibo> selectWeibo();
/**更新微博表数据*/
int updateById(Weibo weibo);
/**删除微博表数据*/
int deleteById(int id);
}
6.3 定义映射文件WeiboMapper.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">
<!-- 1.填写namespace,填写WeiboMapper的绝对路径 -->
<mapper namespace="com.example.mapper.WeiboMapper">
<!--在微博表中插入数据-->
<insert id="insert">
INSERT INTO weibo
VALUES (NULL, #{content}, #{created}, #{userId})
</insert>
<!--根据微博id查询数据-->
<select id="selectByWeiboId" resultType="com.example.pojo.Weibo">
SELECT *
FROM weibo
WHERE id = #{id}
</select>
<!--查询所有微博信息-->
<select id="selectWeibo" resultType="com.example.pojo.Weibo">
SELECT *
FROM weibo
</select>
<!--更新微博表数据-->
<update id="updateById">
UPDATE weibo
SET content=#{content},
created=#{created},
user_id=#{userId}
WHERE id = #{id}
</update>
<!--删除微博表数据-->
<delete id="deleteById">
DELETE
FROM weibo
WHERE id = 2
</delete>
</mapper>
6.4 Dao接口单元测试
/**自动装配*/
@Autowired
private WeiboMapper weiboMapper;
/**在微博表中插入数据-测试方法*/
@Test
void InsertWeibo(){
Weibo weibo = new Weibo();
weibo.setContent("大河之剑天上来");
weibo.setCreated(new Date());
weibo.setUserId(1);
weiboMapper.insert(weibo);
}
/**查询所有微博信息-测试方法*/
@Test
void selectWeiboTest(){
System.out.println(weiboMapper.selectWeibo());
}
/**根据微博id查询数据*/
@Test
void selectByWeiboIdTest(){
System.out.println(weiboMapper.selectByWeiboId(2));
}
/**更新微博表数据-测试*/
@Test
void updateById(){
Weibo weibo = new Weibo();
weibo.setId(2);
weibo.setContent("莫使金樽空对月");
weibo.setCreated(new Date());
weibo.setUserId(2);
System.out.println(weiboMapper.updateById(weibo));
}
/**删除微博表数据-测试*/
@Test
void deleteByIdTest(){
System.out.println(weiboMapper.deleteById(2));
}
七、动态SQL语句
- 什么是动态SQL
动态SQL是指在程序运行时动态生成SQL语句的技术。它允许开发人员在程序运行时根据不同的条件拼接SQL语句,从而灵活地构建各种查询。
DELETE FROM comment WHERE id in(2,3,5) 此处id的值不确定,数量也不确定!
7.1 动态删除数据
演示 <foreache>
标签的使用
7.1.1 Dao接口设计
文件:CommentMapper
/**1.第一种批量删除: 传递Integer的数组*/
int deleteByIds1(Integer[] ids);
/**2.第二种批量删除:传递集合参数*/
int deleteByIds2(List<Integer> ids);
7.1.2 定义映射文件CommentMapper.xml
<!-- 批量删除-数组格式:
collection用来设置遍历对象的类型,
item设置遍历出每一个变量的名称
separator设置分隔符
注意:注释一定要放在delete标签的外面,不能放在里面,放在里面会被当做sql语句执行!
-->
<delete id="deleteByIds1">
DELETE FROM comment WHERE id IN(
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
</delete>
<!-- 集合传参,需要把collection改为 list -->
<delete id="deleteByIds2">
DELETE FROM comment WHERE id IN(
<foreach collection="list" item="id" separator=",">
#{id}
</foreach>
)
</delete>
7.1.3 Dao接口单元测试
/**1.第一种批量删除: 传递Integer的数组-测试*/
@Test
void delete1(){
// 测试数组方式删除
Integer[] ids = {
2, 8};
commentMapper.deleteByIds1(ids);
}
/**2.第二种批量删除:传递集合参数-测试*/
@Test
void delete3(){
// 测试集合方式删除
ArrayList<Integer> ids = new ArrayList<>();
ids.add(18);
ids.add(20);
ids.add(22);
commentMapper.deleteByIds2(ids);
}
7.2 动态修改数据
- 说明
如果表中字段很多,但是只改部分字段数据,比如只修改部分字段的值,不修改其他字段的值,如果使用对象作为参数则会将其他字段的值也修改为null,如果使用传参方式解决,参数过多也会很麻烦,所以可以使用动态修改。 - 实现
使用xml中的 和 标签组合
语法示例:<update id="dynamicUpdate"> UPDATE 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>
7.1.1 Dao接口设计
文件:CommentMapper
/**动态修改数据*/
int dynamicUpdate(Comment comment);
7.1.2 定义映射文件 CommentMapper.xml
<!-- 动态修改-->
<update id="dynamicUpdate">
UPDATE comment
<set>
<if test="content!=null">content=#{content},</if>
<if test="created!=null">created=#{created},</if>
<if test="userId!=null">user_id=#{userId},</if>
<if test="weiboId!=null">weibo_id=#{weiboId}</if>
</set>
WHERE id=#{id};
</update>
7.1.3 Dao接口单元测试
/**动态修改数据-测试*/
@Test
void dynamicUpdateTest(){
Comment comment = new Comment();
comment.setId(27);
comment.setContent("左大凯666");
comment.setUserId(666);
commentMapper.dynamicUpdate(comment);
}