【SSM直击大厂】第十四章:MyBatis 代理开发和动态SQL

举报
求不脱发 发表于 2022/04/27 18:40:25 2022/04/27
【摘要】 MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。

🙊🙊作者主页:🔗求不脱发的博客

📔📔 精选专栏:🔗SSM直击大厂

📋📋 精彩摘要:MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。

💞💞觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论💬支持博主🤞


📚目录

        📖MyBatis 动态SQL

📝1️⃣Mybatis 简化Dao层

        ✨MyBatis原始Dao开发方式:

        ✨MyBatis代理开发:

📝2️⃣MyBatis动态SQL

        ✨揭秘MyBatis动态SQL:

        ✨MyBatis常用动态SQL语句:

📝3️⃣SQL片段抽取

📝4️⃣本章小结


📖MyBatis 动态SQL


📝1️⃣Mybatis 简化Dao层

MyBatis原始Dao开发方式:

1. 编写UserDao接口

public interface UserDao {
    List<User> findAll() throws IOException; 
}

2. 编写UserDaoImpl实现UserDao接口

public class UserDaoImpl implements UserDao {
		public List<User> findAll() throws IOException {
			InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
			SqlSession sqlSession = sqlSessionFactory.openSession();
			List<User> userList = sqlSession.selectList("userMapper.findAll");
			sqlSession.close();
			return userList;
		}
	}

3. 测试代码

    @Test
	public void testTraditionDao() throws IOException {
		UserDao userDao = new UserDaoImpl();
		List<User> all = userDao.findAll();
		System.out.println(all);
	}

MyBatis代理开发:

1.什么是 MyBatis 代理开发?

对于传统dao实现方式,程序员需要自己编写dao实现类daoimpl,并实现对应的方法。这样不仅操作繁琐,在企业级大项目中,代码重复度高,而且开发效率低下。

为了解决此类问题,MyBatis 框架通过Mapper代理模式开发,程序员只需要根据需求编写dao接口,然后由Mybatis 框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。有效解决的传统dao开发所存在的问题。

2.代理开发方式规范

  • mapper接口的全限定名要和mapper映射文件的namespace值一致。
  • mapper接口的方法名称要和mapper映射文件的statement的id一致。
  • mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个。
  • mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致。

3.测试代码

    @Test
	public void testProxyDao() throws IOException {
		InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 获得MyBatis框架生成的UserMapper接口的代理对象
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		User user = userMapper.findById(1);
		System.out.println(user);
		sqlSession.close();
	}

📝2️⃣MyBatis动态SQL

揭秘MyBatis动态SQL:

MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。

尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中使用强大的动态SQL来改进这些状况。动态SQL元素对于任何使用过JSTL或者类似于XML之类的文本处理器的人来说,都是非常熟悉的。在上一版本中,需要了解和学习非常多的元素,但在MyBatis 3 中有了许多的改进,现在只剩下差不多二分之一的元素。MyBatis使用了基于强大的OGNL表达式来消除了大部分元素。

简单来说,MyBatis简化了SQL语句的拼接操作。


MyBatis常用动态SQL语句:

1.< where >< /where >

在执行条件查询时,当无任何查询条件时,对应SQL语句:select * from tablename

有参数时,则需要拼接到where后 :select * from tablename where ....and ...

使用< where >则可以动态的将  where .... 拼接到原SQL语句后面,有参则拼,无参则省。

<select id="findByCondition" parameterType="user" resultType="user">
        select * from user
        <where>
            <if test="id!=0">
                and id = #{id}
            </if>
            <if test="username!=null">
                and username = #{username}
            </if>
            <if test="password!=null">
                and password = #{password}
            </if>
        </where>
    </select>

2.< if test = " ">< /if >

If用于完成简单的判断。如上述代码,当test条件中  id!=0 则将 and id= #{id} 拼接SQL语句。

3.< set >< /set >

set 主要是用于解决修改操作中。

<update id="updateUser" parameterType="user">
        update user
        <set>
            <if test="id != 0">
                id = #{id},
            </if>
            <if test="username!=null">
                username = #{username},
            </if>
            <if test="password!=null">
                password = #{password},
            </if>
        </set>
        where id = #{id}
    </update>

4.< foreach>< /foreach>

foreach可循环执行sql的拼接操作,例如:select * from user where id in(1,2,3)

                                                                        foreach标签的属性
collection 代表要遍历的集合
open SQL开始部分
close SQL结束部分
item 代表遍历集合的每个元素,生成的变量名
sperator
分隔符
<select id="findByIds" parameterType="list" resultType="user">
        <include refid="selectUser"></include>
        <where>
            <foreach collection="list" open="id IN(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </where>
    </select>

MyBatis常用动态SQL语句小结:

  • <where>:where条件
  • <if>:if判断
  • < set >< /set >:修改操作
  • <foreach>:循环

📝3️⃣SQL片段抽取

使用<sql></sql>可将重复的 sql 提取出来,使用时用 include 引用即可。

    <!--sql语句抽取-->
    <sql id="selectUser">select * from user</sql>

    <select id="findByCondition" parameterType="user" resultType="user">
       <include refid="selectUser"></include>
        <where>
            <if test="id!=0">
                and id = #{id}
            </if>
            <if test="username!=null">
                and username = #{username}
            </if>
            <if test="password!=null">
                and password = #{password}
            </if>
        </where>
    </select>

📝4️⃣本章小结

Mybatis Dao实现方式

  • 原始方式
  • 动态代理方式

Mybatis 常用动态SQL语句

  • <where>:where条件
  • <if>:if判断
  • < set >< /set >:修改操作
  • <foreach>:循环

Mybatis SQL片段抽取

    <!--sql语句抽取-->
    <sql id="selectUser">select * from user</sql>

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。