文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MyBatis 单表的增删改查

2023-08-17 10:00

关注

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:SSM 框架从入门到精通
✨特色专栏:国学周更-心性养成之路
🥭本文内容:MyBatis 单表的增删改查

在这里插入图片描述

  通过上一篇文章的学习可了解到,MyBatis 可以方便的对数据库进行操作,而数据库表可能是一个相对独立的表(这里谓之单表),也可能两个或多个有密切联系的表(这里谓之多表),本文先来学习单表的增删改查操作,下一篇文章我们再来学习多表关联查询。

  先来认识一下 SqlSession 的若干方法,这些方法被用来执行定义在 mapper 映射文件中的 SELECTINSERTUPDATEDELETE 语句。以下是一些常用的方法。

  上述方法中的第一个参数 statement 通常使用 namespace + id 的字符串,namespace 定位到唯一的 mapper 映射文件,id 定位到这个 mapper 映射文件指定的 SQL 语句。

  第二个参数可以是原生类型(自动装箱或包装类)、JavaBeanPOLOMap,用于限定查询条件等。

  其中 selectOneselectList 的不同之处是 selectOne 必须返回一个对象,如果有多个对象,或者没有返回(或返回了 null),那么就会抛出异常。如果不确定返回了多少对象,就使用 selectList

以上方法可以重载,第二个参数不是必要的,重载方法如下。

结果映射 ResultMap

  所谓结果映射就是让数据表的字段名称(即列名)与 Java 实体类的属性名称一一进行关联匹配的一种机制,以便 MyBatis 查完数据库后能将关系型查询结果正确地封装为 Java 对象。如果数据库的字段名称跟相应的类的属性名称不一样,不作处理的话,mybatis 运行后相应的字段处的查询结果就为空。

  在映射文件 UserMapper.xml 中,如果 SQL 查询语句使用别名了,则 select * from user

  然后运行 UserMapperTest.java 测试类中的 testList 方法:

    @Test    public void testList() {        SqlSession sqlSession = factory.openSession(true);        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        List list = mapper.list();        for (User user : list) {            System.out.println("user = " + user);        }    }

  运行结果如下:

在这里插入图片描述
  可以发现查出来的数据为 null,这是因为数据表 user 的字段与对象 User 的属性名称不一致造成的。数据库查出来的数据无法封装到对应的对象属性中去。

解决办法有两个:

  • 方法一:在 SQL 语句中使用别名,让查询结果字段与对象属性一致
  • 方法二:利用结果映射 ResultMap

  在 UserMapper.xml 中配置结果映射 ResultMap,代码如下:

                                                select * from user where u_id=#{id}    

  其中,parameterType=“int” 表示参数的类型为整型,也可省略不用,MyBatis 会自动识别传进来的参数类型。此外仍然使用结果映射 resultMap

   select * from user where u_name like '%' #{userName} '%'

  【3】在测试类 UserMapperTest.java 中添加 testFindUserByName 方法,代码如下:

    @Test    public void testFindUserByName(){        SqlSession sqlSession = factory.openSession(true);        List list = sqlSession.selectList("cn.kgc.mybatis.mapper.UserMapper.findUserByName", "张");        for (User user : list) {            System.out.println("user = " + user);        }    }

  运行效果如下:

在这里插入图片描述

动态查询

  在大家熟悉的网购中,筛选商品是一个非常重要的功能。筛选条件有很多,每个人选的条件都不一样,这里就用到了动态查询。前台页面把某个用户的筛选条件传到后台服务器,后台服务器根据筛选条件动态生成 SQL 语句,再从数据库中查找到合适商品。

  动态 SQL 多用于解决查询条件不确定的情况,在程序运行期间,根据运行期间,根据用户提交的多种可能的查询条件进行查询,提交的查询条件不同,动态生成和执行的 SQL 语句也不同。动态 SQL 通过 MyBatis 提供的各种标签对条件做出判断以实现动态拼接 SQL 语句。

  常用的动态 SQL 标签有 等。

  映射文件 UserMapper.xml 中定义映射规则,代码如下:

                                            

 if 标签

  对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片段拼接到其所在的 SQL 语句中。

实现步骤:

  【1】在接口 UserMapper.java 中 添加方法 selectUserIf 如下:

List selectUserIf(@Param("userName") String userName, @Param("state") int state);

  【2】在映射文件 UserMapper.xml 中添加一条 select 语句,代码如下:

            select * from user                                    and u_name like '%' #{userName} '%'                                        and u_state=#{state}                        

  【3】在测试类 UserMapperTest.java 中添加 testSelectUserIf 方法,代码如下:

    @Test    public void testSelectUserWhere() {        SqlSession sqlSession = factory.openSession(true);        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        List users = mapper.selectUserIf("张", 1);        for (User user : users) {            System.out.println("user = " + user);        }    }

  查询姓名中含有“张”字,并且 state 状态为1的记录,结果如下:

在这里插入图片描述

 set 标签

  标签用于更新操作的 update 语句中

实现步骤:

  【1】在接口 UserMapper.java 中 添加方法 updateUserSet 如下:

Integer updateUserSet(User user);

  【2】在映射文件 UserMapper.xml 中添加一条 **update ** 语句,代码如下:

            update user                                    u_name = #{userName}                                        ,u_password=#{password}                                        ,u_state = #{state}                            where u_id = #{id}    

  【3】在测试类 UserMapperTest.java 中添加 testUpdateUserSet 方法,代码如下:

    @Test    public void testUpdateUserSet() {        SqlSession sqlSession = factory.openSession(true);        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        User user = new User();        user.setPassword("888888");        user.setState(1);        user.setUserName("李清照");        user.setId(2);        Integer integer = mapper.updateUserSet(user);        System.out.println("line = " + integer);    }

  运行效果:

在这里插入图片描述
在这里插入图片描述

 trim 标签

  trim标记是一个格式化的标记,可以完成set或者是where标记的功能

  用 trim 改写上面的 if+where 语句

            select * from user                                    and u_name like '%' #{userName} '%'                                        and u_state=#{state}                        

  【3】在测试类 UserMapperTest.java 中添加 testUpdateUserSet 方法,代码如下:

    @Test    public void testSearchUsersMap() {        SqlSession sqlSession = factory.openSession(true);        UserMapper mapper = sqlSession.getMapper(UserMapper.class);        HashMap map = new HashMap<>();        map.put("userName", "张");        map.put("state", 1);        List users = mapper.searchUsersMap(map);        for (User user : users) {            System.out.println("user = " + user);        }    }

  运行效果:

在这里插入图片描述

 choose 标签

  该标签里面包含 <when/> <otherwise/> 两个子标签,可以包含多个 <when/> 与一个 <otherwise/>。它们联合使用,完成类似 Java 中的开关语句 switch…case 功能。

实现步骤:

  【1】在接口 UserMapper.java 中 添加方法 searchUsersMap 如下:

List searchUsersChoose(User user);

  【2】在映射文件 UserMapper.xml 中添加一条 select 语句,代码如下:

        select * from user                                

  注意:

  • ①、最好基于 单表来定义 sql 片段,提高片段的可重用性
  • ②、在 sql 片段中最好不要包括 where

mybatis分页插件

    com.github.pagehelper    pagehelper    5.2.1

实例

 // 测试分页插件的使用    @Test    public void  test06(){        SqlSession session = factory.openSession(true);        StudentDao mapper = session.getMapper(StudentDao.class);        PageHelper.startPage(5, 3);        List all = mapper.findAll();        PageInfo pageInfo = new PageInfo<>(all);        //获取分页的相关数据        System.out.println(pageInfo);        //获取总条数        long total = pageInfo.getTotal();        System.out.println(total);        //获取当前页的显示数据        List list = pageInfo.getList();        list.forEach(student-> System.out.println(student));    }

getMapper 面向接口编程

  之前我们自定义 Dao 层接口实现类时发现一个问题:Dao 层的实现类其实并没有干什么实质性的工作,它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper 中相应 idSQL 语句,真正对数据进行操作的工作其实是由框架通过映射文件 mapper 中的 SQL 完成的。

  那么,MyBatis 框架可以抛开 Dao 的实现类,直接定位到映射文件 mapper 中的相应 SQL 语句,对数据库进行操作吗?答案是肯定的。可以通过Mapper的动态代理方式实现

实现步骤如下图目录结构所示:

在这里插入图片描述

  • 注意:
    • 确保映射文件 UserMapper.xmlnamespace 与接口类的全路径名称一致;
    • resources 中创建目录时,注意目录间用 / 分割,如创建 cn.kgc.mybatis04.mapper ,创建 Directory 时,写法为:cn/kgc/mybatis04/mapper,这样就可以准确创建目录结构。

多参数查询

  上面的案例中要传多个参数,把这些参数都巧妙的封装成一个对象或一个 Map,表面上还是一个参数。有时想直接传递多个参数,而不想封装,如何实现?

实现步骤:

  【1】在接口 UserMapper.java 中 添加方法 selectUserWhere 如下:

List selectUserWhere(@Param("userName") String userName, @Param("state") int state);

  这里用到了 @Param 注解。映射文件的 SQL 语句中的输入参数应与注解里面的参数一致。

  【2】在映射文件 UserMapper.xml 中添加一条 select 语句,代码如下:

    

  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

来源地址:https://blog.csdn.net/hh867308122/article/details/128942275

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯