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

相关文章
|
3月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
4月前
|
SQL Java 数据库
2、Mybatis-Plus 测试增、删、改、查
这篇文章是关于使用Mybatis-Plus进行数据库的增删改查操作的本地测试,包括创建数据库表、添加数据、创建使用lombok的实体类、添加mapper接口以及编写测试代码进行基本的数据库操作验证。
2、Mybatis-Plus 测试增、删、改、查
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
58 1
|
5月前
|
Java 数据库连接 数据库
mybatis plus 中增删改查及Wrapper的使用
mybatis plus 中增删改查及Wrapper的使用
234 3
|
6月前
|
缓存 Java 数据库连接
我们后端程序员不是操作MyBatis的CRUD Boy
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天我们接着新的一篇Java进阶指南。为啥都戏称后端是CRUD Boy?难道就因为天天怼着数据库CRUD吗?要我说,是这个岗位的位置要的就是你CRUD,你不得不CRUD。哪有公司天天能给你搭建高并发、高可用、大数据框架的活呢,一条业务线总要成长吧,慢慢成熟了就要装修工来缝缝补补、美化美化,也就是CRUD的活。不能妄自菲薄CRUD Boy,我们是后端工程师。今天来指南下操作数据库之MyBatis框架。
130 3
我们后端程序员不是操作MyBatis的CRUD Boy
|
4月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
377 0
|
5月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
6月前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
81 2
|
5月前
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法
MybatisPlus介绍新增用户,根据id查询,引入MybatisPlus的起步依赖,增删改查最简单的写法