Java 阶段三 Day10 MyBatis框架-xml管理及数据操作

MyBatis框架-xml管理

一、xml与注解比较

1.1 xml定义

XML是一种可扩展性语言,用户可以自己定义标签,用来描述特定类型的数据;
XML的语法严格,每个标签都必须有一个结束标签,标签的嵌套关系也必须合法;
XML(Extensible Markup Language)是一种标记语言,用于存储和传输数据。它是一种文本格式,被设计用来在不同系统之间共享数据。XML 的定义包括以下关键点:

  1. 可扩展性(Extensible):XML 允许用户自定义标签和数据结构,以适应特定的应用需求。这意味着你可以创建自己的标记,定义自己的数据格式。

  2. 标记语言(Markup Language):XML 使用标签来标识数据的结构和含义。标签通常由尖括号包围,如 <tagname>。标签可以用来表示元素、属性、注释等。

  3. 层次结构(Hierarchical Structure):XML 数据以层次结构的方式组织,类似于树形结构。有一个根元素,根元素下可以包含子元素,子元素可以有子元素,依此类推。

  4. 自我描述性(Self-Descriptive):XML 文件包含了元素的标签和数据,同时也可以包含元素的属性。这使得XML文件本身可以解释其数据的含义。

  5. 通用性(Platform-Independent):XML 不依赖于任何特定的编程语言或操作系统,因此可以在各种不同的平台和系统之间轻松传递和解释。

  6. 纯文本(Plain Text):XML 文件是纯文本文件,可以使用文本编辑器进行创建和编辑。这也使得它易于理解和处理。

  7. 严格的语法(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 注解

三、使用流程

  1. 在resources目录下创建 mappers目录,用来存放xml配置文件

  2. 将映射文件写入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>
    
  3. 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);
}

猜你喜欢

转载自blog.csdn.net/weixin_44693429/article/details/132893020