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

简介: 📋📋 精彩摘要: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; 

}

  1. 编写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;
    }
}
  1. 测试代码

    @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 * 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 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
分隔符

    <include refid="selectUser"></include>
    <where>
        <foreach collection="list" open="id IN(" close=")" item="id" separator=",">
            #{id}
        </foreach>
    </where>
</select>

✨MyBatis常用动态SQL语句小结:

:where条件
:if判断
< set >< /set >:修改操作
:循环
📝3️⃣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条件
:if判断
< set >< /set >:修改操作
:循环
Mybatis SQL片段抽取

<!--sql语句抽取-->
<sql id="selectUser">select * from user</sql>
相关文章
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
207 3
|
SQL NoSQL 数据库
开发效率与灵活性:SQL vs NoSQL
【8月更文第24天】随着大数据和实时应用的兴起,数据库技术也在不断发展以适应新的需求。传统的SQL(结构化查询语言)数据库因其成熟的数据管理机制而被广泛使用,而NoSQL(Not Only SQL)数据库则以其灵活性和扩展性赢得了众多开发者的青睐。本文将从开发者的视角出发,探讨这两种数据库类型的优缺点,并通过具体的代码示例来说明它们在实际开发中的应用。
241 1
|
JSON 数据格式 SQL
SQL开发问题之直接使用join方法在处理字符串类型属性时可能会遇到性能问题如何解决
SQL开发问题之直接使用join方法在处理字符串类型属性时可能会遇到性能问题如何解决
122 8
SQL开发问题之使用distmapjoin的问题如何解决
SQL开发问题之使用distmapjoin的问题如何解决
117 7
|
分布式计算 MaxCompute SQL
SQL开发问题之如何判断mapjoin是否生效
SQL开发问题之如何判断mapjoin是否生效
263 5
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
【7月更文挑战第26天】在 Web 开发中, SQL 注入与 XSS 攻击常令人担忧, 但掌握正确防御策略可化解风险. 对抗 SQL 注入的核心是避免直接拼接用户输入至 SQL 语句. 使用 Python 的参数化查询 (如 sqlite3 库) 和 ORM 框架 (如 Django, SQLAlchemy) 可有效防范. 防范 XSS 攻击需严格过滤及转义用户输入. 利用 Django 模板引擎自动转义功能, 或手动转义及设置内容安全策略 (CSP) 来增强防护. 掌握这些技巧, 让你在 Python Web 开发中更加安心. 安全是个持续学习的过程, 不断提升才能有效保护应用.
152 1
|
SQL 分布式计算 大数据
大数据开发SQL代码编码原则和规范
这段SQL编码原则强调代码的功能完整性、清晰度、执行效率及可读性,通过统一关键词大小写、缩进量以及禁止使用模糊操作如select *等手段提升代码质量。此外,SQL编码规范还详细规定了代码头部信息、字段与子句排列、运算符前后间隔、CASE语句编写、查询嵌套、表别名定义以及SQL注释的具体要求,确保代码的一致性和维护性。
394 0
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
1387 0