MyBatis【MyBatis的增删改查操作与单元测试】(下)

简介: MyBatis【MyBatis的增删改查操作与单元测试】(下)

🍎五.MyBatis查询操作


UserMapper接口查询用户信息方法:


// 查询方法{根据用户id查询用户}
    // @Param("username")是mybatis中设置xml文件的SQL中查询username
    public UserInfo getUserByUsername(@Param("username") String username);


UserMapper.xml 进行SQL查询用户信息语句传输:

这里我们要添加resultType="com.example.demo.model.UserInfo来选择要查询对象目录地址


 <!-- 根据用户username 查询用户信息 -->
    <select id="getUserByUsername" resultType="com.example.demo.model.UserInfo">
           select * from userinfo where username=#{username}
    </select>


单元测试:

@Test
    void getUserByUsername() {
        UserInfo userInfo = userMapper.getUserByUsername("admin");
        //日志打印
        log.info("用户信息:" + userInfo);
    }

单元测试解结果:


image.png


🍒5.1 参数占位符 #{} 和 ${}


🍉5.1.1 #{} 和 ${}代码区别


● #{}:预编译处理
● ${}:字符直接替换


预编译处理是指:
MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使⽤ PreparedStatement的 set ⽅法来赋值

直接替换:
是MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值

#{}查询代码:


8306f92ecb4f467c867a4fbdef988250.png


42ca4c8e12704879a1d5c44f1090bb35.png

${}查询代码:


1e639d95e16846d5ae71d16ad1755d4d.png

bdd77c6a2e6d4c36855b69a837145818.png

🍉5.1.2 #{} 和 ${} 区别小结


定义不同: #{}是预处理; ${}是直接处理

使用数据类型不同:#{}适用于所有数据类型; ${}只适用于数值类型

安全性问题:#{}性能高,不会引起数据库安全问题; ${}会引起数据库SQL注入问题


🍒5.2 SQL注入问题(${})


UserMapper接口查询用户信息方法:

 // 登陆功能
    public UserInfo login(@Param("username") String usernaem,@Param("password")String password);

UserMapper.xml 进行SQL查询用户信息语句传输:

 <!-- 根据用户输入username 和 password 信息实现登陆用户 -->
    <select id="login" resultType="com.example.demo.model.UserInfo">
           select * from userinfo where username='${username}' and password='${password}'
    </select>

单元测试:

当我我们输入正常的用户名和密码时

 @Test
    void login() {
        String username = "XXX";
        String password = "XXX";
        // "' or 1 =' 1" SQL注入问题(使用$ 严重危险问题)
        UserInfo userInfo = userMapper.login(username,password);
        log.info("用户信息"+userInfo);
    }

单元测试结果:

image.png


单元测试:

当我我们输入带有SQL语句注入的密码时

@Test
    void login() {
        String username = "admin";
        String password = "' or 1 =' 1";
        // "' or 1 =' 1" SQL注入问题(使用$ 严重危险问题)
        UserInfo userInfo = userMapper.login(username,password);
        log.info("用户信息"+userInfo);
    }

单元测试结果:

这个时候就会查询到这个表里所有的用户信息了,这就是${}的SQL注入安全问题


8fbbc34ce3c74717aa11e90d5fd7b454.png


🍒5.3 排序查询 order by(asc丶desc)


我们发现这 个 占 位 符 缺 陷 这 么 大 , 拿 我 们 为 什 么 还 有 设 置 这 个 占 位 符 呢 , 因 为 存 在 并 合 理 , {}这个占位符缺陷这么大,拿我们为什么还有设置这个占位符呢,因为存在并合理,这个占位符缺陷这么大,拿我们为什么还有设置这个占位符呢,因为存在并合理,{}是可以使用SQL语句中的关键字这一功能的


UserMapper接口查询用户信息方法:

// 获取列表,根据创建时间进行正序或倒序
    public List<UserInfo> getOrderList(@Param("order") String order);


UserMapper.xml 进行SQL查询用户信息语句传输:

当我们使用#{}占位符进行查询时

 <!-- 根据用户createtime信息进行排序 查询用户信息 -->
    <select id="getOrderList" resultType="com.example.demo.model.UserInfo">
           select * from userinfo order by createtime #{order}
    </select>

单元测试:


@Test
    void getOrderList() {
        List<UserInfo> list = userMapper.getOrderList("desc");
        log.info("列表"+list);
    }


单元测试结果:


c64b2b3c028448dfa8ddc6a12e56271d.png

这时候我们就想到被我们抛弃的${}



256e33ea9e7a472a8aa71b65a4ec9608.png

5f8bb4ce1cdf4d8988473738d2ab4e26.png


🍒5.4 like查询


UserMapper接口查询用户信息方法:


// 模糊查询(like)用户名信息
    public List<UserInfo> getListName(@Param("username") String username);


UserMapper.xml 进行SQL查询用户信息语句传输:


 <select id="findUserByName2" resultType="com.example.demo.model.UserInFo">
       select * from userinfo where username like '%#{username}%'
 </select>


单元测试:

@Test
    void login() {
        String username = "admin";
        String password = "admin";
        // "' or 1 =' 1" SQL注入问题(使用$ 严重危险问题)
        UserInfo userInfo = userMapper.login(username,password);
        log.info("用户信息"+userInfo);
    }

单元测试结果:


我们会因为不能直接用’%#{username}%'进行模糊查询


e3263097167e450e9a2fba3678761297.png

🍉5.4.1 解决方法


select * from userinfo where username like '%#{username}%'相当于:

SQL查询select * from userinfo where username like '%'username'%';

这个是不能直接使⽤ ${},可以考虑使⽤ mysql 的内


  <!-- 根据用户输入username 模糊信息实现查询用户们信息 -->
    <select id="getListName" resultType="com.example.demo.model.UserInfo">
          select * from userinfo where username like concat ('%',#{username},'%')
    </select>


3a2a5ab345fb4c339ec8a815156d519a.png

🍎六.返回类型:resultType VS 返回字典映射:resultMap


resultMap 使⽤场景:


● 字段名称和程序中的属性名不同的情况,可使⽤ resultMap 配置映射

● ⼀对⼀和⼀对多关系可以使⽤ resultMap 映射并查询数据。


字段名和属性名不同的情况

例如 MySQL表中的 用户名属性叫 username ,而我我们在对象使用的属性名是user

而这时我们就需要在UserMapper.xml中使用resultMap进行修改了

2431d02ef2d349788843f04077660804.png

resultType VS resultMap 具体使用:


da29957c99394fce8dc373ad61cdd2ad.png

相关文章
|
XML Java 数据库连接
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
381 21
|
12月前
|
人工智能 Java 数据库连接
MyBatis Plus 使用 Service 接口进行增删改查
本文介绍了基于 MyBatis-Plus 的数据库操作流程,包括配置、实体类、Service 层及 Mapper 层的创建。通过在 `application.yml` 中配置 SQL 日志打印,确保调试便利。示例中新建了 `UserTableEntity` 实体类映射 `sys_user` 表,并构建了 `UserService` 和 `UserServiceImpl` 处理业务逻辑,同时定义了 `UserTableMapper` 进行数据交互。测试部分展示了查询、插入、删除和更新的操作方法及输出结果,帮助开发者快速上手 MyBatis-Plus 数据持久化框架。
886 0
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
SQL Java 数据库
2、Mybatis-Plus 测试增、删、改、查
这篇文章是关于使用Mybatis-Plus进行数据库的增删改查操作的本地测试,包括创建数据库表、添加数据、创建使用lombok的实体类、添加mapper接口以及编写测试代码进行基本的数据库操作验证。
2、Mybatis-Plus 测试增、删、改、查
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
320 1
|
Java 数据库连接 数据库
mybatis plus 中增删改查及Wrapper的使用
mybatis plus 中增删改查及Wrapper的使用
840 3
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
1808 0
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
9月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1463 1
Spring boot 使用mybatis generator 自动生成代码插件
|
12月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
903 0