热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Mybatis深入

1.Mybatis中集合操作1.1业务说明需求查询id号1,2,4,5,7的数据Sql:select*fromdemo_userwhereidin(1,2,4,5,7…)1.

1. Mybatis中集合操作


1.1 业务说明

需求 查询id号 1,2,4,5,7的数据
Sql: select * from demo_user where id in (1,2,4,5,7…)


1.1 array集合操作


1.1.1 编辑测试代码

/*** 业务: 查询id号 1,2,4,5,7的数据*/&#64;Testpublic void testFindIn(){SqlSession sqlSession &#61; sqlSessionFactory.openSession();UserMapper2 userMapper2 &#61; sqlSession.getMapper(UserMapper2.class);//将数据封装为数组int[] ids &#61; {1,2,4,5,7};List<User> userList &#61; userMapper2.findIn(ids);System.out.println(userList);sqlSession.close();}

1.1.2 编辑Mapper接口

在这里插入图片描述


1.1.3 编辑Mapper.xml映射文件

<select id&#61;"findIn" resultType&#61;"User">select * from demo_user where id in<foreach collection&#61;"array" open&#61;"(" close&#61;")"separator&#61;"," item&#61;"id">#{id}foreach>select>

1.2 List集合操作


1.2.1 编辑测试代码

/*** 业务: 查询id号 1,2,4,5,7的数据* 知识点: 数组转化时,需要使用包装类型.* 根源: 基本类型没有get/set方法* 包装类型是对象 对象中有方法*/&#64;Testpublic void testFindInList(){SqlSession sqlSession &#61; sqlSessionFactory.openSession();UserMapper2 userMapper2 &#61; sqlSession.getMapper(UserMapper2.class);//将数组转化为List集合Integer[] ids &#61; {1,2,4,5,7};List list &#61; Arrays.asList(ids);List<User> userList &#61; userMapper2.findInList(list);System.out.println(userList);sqlSession.close();}

1.2.2 编辑接口方法

List<User> findInList(List list);

1.2.3 编辑Mapper映射文件

<select id&#61;"findInList" resultType&#61;"User">select * from demo_user where id in<foreach collection&#61;"list" open&#61;"(" close&#61;")"separator&#61;"," item&#61;"id">#{id}foreach>select>

1.3 Map集合操作


1.3.1 编辑测试类

/*** 需求&#xff1a;* 查询id&#61;1,3,5,6,7 并且sex&#61;"男"的用户* Sql:* select * from demo_user where id in (1,3....)* and sex &#61; "男"*/&#64;Testpublic void testFindInMap(){SqlSession sqlSession &#61; sqlSessionFactory.openSession();UserMapper2 userMapper2 &#61; sqlSession.getMapper(UserMapper2.class);int[] ids &#61; {1,3,5,6,7};String sex &#61; "男";/* Map map &#61; new HashMap();map.put("ids",ids);map.put("sex",sex);*/List<User> userList &#61; userMapper2.findInMap(ids,sex);System.out.println(userList);sqlSession.close();}

1.3.2 编辑Mapper接口

在这里插入图片描述


1.3.3 编辑Mapper xml映射文件

<select id&#61;"findInMap" resultType&#61;"User">select * from demo_user where id in (<foreach collection&#61;"ids" item&#61;"id" separator&#61;",">#{id}foreach>)and sex &#61; #{sex}select>

2. 动态Sql


2.1 动态 sql-where-if


2.1.1 业务需求

说明: 用户传递了一个user对象, 要求根据user中不为null的属性查询数据.
例子1:
User {name:“张三”}
Sql: select * from demo_user where name &#61; “张三”
例子2:
User {name:“张三”, age: 18}
Sql: select * from demo_user where name &#61; “张三” and age&#61;18


2.1.2 编辑测试方法

/*** 动态Sql练习 根据对象中不为null的元素查询数据*/&#64;Testpublic void testSqlWhere(){User user &#61; new User(null,"黑熊精",3000, "男");SqlSession sqlSession &#61; sqlSessionFactory.openSession();UserMapper2 userMapper2 &#61; sqlSession.getMapper(UserMapper2.class);List<User> userList &#61; userMapper2.findSqlWhere(user);System.out.println(userList);sqlSession.close();}

2.1.3 问题说明

User对象中的数据可能为null.但是如果sql不做处理,则将会把null当做参数.导致程序查询异常.
例子:
在这里插入图片描述


2.1.4 编辑mapper接口

List<User> findSqlWhere(User user);

2.1.5 编辑xml映射文件

<select id&#61;"findSqlWhere" resultType&#61;"User">select * from demo_user<where><if test&#61;"id !&#61; null"> id &#61; #{id}if><if test&#61;"name !&#61; null">and name &#61; #{name}if><if test&#61;"age !&#61; null ">and age &#61; #{age}if><if test&#61;"sex !&#61; null ">and sex &#61; #{sex}if>where>select>

2.2 动态 sql-set-if


2.2.1 编辑测试类

/*** 需求: 实现用户数据修改, 根据对象中不为null的数据完成修改操作*/&#64;Testpublic void testSqlSet(){SqlSession sqlSession &#61;sqlSessionFactory.openSession(true);UserMapper2 userMapper &#61; sqlSession.getMapper(UserMapper2.class);User user &#61; new User(1,"守山使者",3000, null);int rows &#61; userMapper.updateSqlSet(user);System.out.println("影响"&#43;rows&#43;"行");sqlSession.close();}

2.2.2 编辑Mapper接口

int updateSqlSet(User user);

2.2.3 编辑Mapper 映射文件

<update id&#61;"updateSqlSet">update demo_user<set><if test&#61;"name !&#61;null"> name&#61;#{name}, if><if test&#61;"age !&#61;null"> age &#61; #{age}, if><if test&#61;"sex !&#61;null"> sex &#61; #{sex} if>set>where id &#61; #{id}update>

2.3 动态 sql-分支结构语法


2.3.1 业务说明

需求: 根据属性查询数据, 如果name有值 按照name查询,否则按照年龄查询,如果name,age都没有 按照sex查询
需求分析:

if(name !&#61;null ){name &#61; #{name}}else if( age !&#61;null){age &#61; #{age}}else{sex &#61; #{sex}}

2.3.2 编辑测试方法

&#64;Testpublic void testChoose(){SqlSession sqlSession &#61;sqlSessionFactory.openSession();UserMapper2 userMapper &#61; sqlSession.getMapper(UserMapper2.class);User user &#61; new User(null,null,null,"男");List<User> userList &#61; userMapper.findChoose(user);System.out.println(userList);sqlSession.close();}

2.3.3 编辑Mapper接口

List<User> findChoose(User user);

2.3.4 编辑Mapper映射文件

<select id&#61;"findChoose" resultType&#61;"User">select * from demo_user<where><choose><when test&#61;"name !&#61;null">name &#61; #{name}when><when test&#61;"age !&#61;null">age &#61; #{age}when><otherwise>sex &#61; #{sex}otherwise>choose>where>select>

3. resultMap说明


3.1 创建dog表


  1. 表结构
    在这里插入图片描述

  2. 表名
    在这里插入图片描述


3.2 构建POJO对象

&#64;Data
&#64;Accessors(chain &#61; true)
&#64;NoArgsConstructor
&#64;AllArgsConstructor
public class Dog implements Serializable {private Integer dogId;private String dogName;
}

3.3 编辑测试类

public class TestDog {private SqlSessionFactory sqlSessionFactory;&#64;BeforeEachpublic void init() throws IOException {String resource &#61; "mybatis/mybatis-config.xml";InputStream inputStream &#61;Resources.getResourceAsStream(resource);sqlSessionFactory &#61; new SqlSessionFactoryBuilder().build(inputStream);}//查询所有dog表的数据&#64;Testpublic void testResultMap(){SqlSession sqlSession &#61; sqlSessionFactory.openSession();DogMapper dogMapper &#61; sqlSession.getMapper(DogMapper.class);List<Dog> dogList &#61; dogMapper.findAll();System.out.println(dogList);sqlSession.close();}}

3.4 编辑Mapper接口

public interface DogMapper {List<Dog> findAll();
}

3.5 resultType 和resultMap的区别


DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace&#61;"com.jt.mapper.DogMapper"><select id&#61;"findAll" resultMap&#61;"dogRM">select * from dogselect><resultMap id&#61;"dogRM" type&#61;"com.jt.pojo.Dog"><id column&#61;"dog_id" property&#61;"dogId"/><result column&#61;"dog_name" property&#61;"dogName"/>resultMap>
mapper>

4 关于Mybatis 注解开发说明


4.1 编辑测试方法

//测试注解功能&#64;Testpublic void testAnno(){SqlSession sqlSession &#61; sqlSessionFactory.openSession();UserAnnoMapper userAnnoMapper &#61;sqlSession.getMapper(UserAnnoMapper.class);List<User> userList &#61; userAnnoMapper.findAll();System.out.println(userList);sqlSession.close();}

4.2 编辑注解的接口

public interface UserAnnoMapper {/*** 注解使用规则:* 1.注解标识接口方法. 接口方法调用,直接注解的内容.* 2.注解将查询的结果集,根据方法的返回值类型动态映射.*///查询user表的数据记录&#64;Select("select * from demo_user")//新增 &#64;Insert("sql")//修改 &#64;Update("sql")//删除 &#64;Delete("sql")List<User> findAll();}

4.3 Mybatis管理接口

<mappers><mapper resource&#61;"mybatis/mappers/UserMapper.xml"/><mapper resource&#61;"mybatis/mappers/UserMapper2.xml"/><mapper resource&#61;"mybatis/mappers/DogMapper.xml"/><mapper class&#61;"com.jt.mapper.UserAnnoMapper">mapper>mappers>

4.4 关于Mybatis的注解开发说明


  1. 注解开发 只适用于 单表CURD操作. 多表操作一定出问题
  2. 如果设计到复杂标签时 where/set/foreach 等标签时,不可以使用注解.
  3. 所以应该熟练掌握xml映射文件的写法,注解开发只是辅助的作用.

5. 总结


  1. Mybatis 的集合操作
    1.1 数组 foreach collection&#61;“array”
    1.2 list集合 foreach collection&#61;“list”
    1.3 Map集合 foreach collection&#61;“map中的KEY”
  2. foreach 用法
    1.collection 表示遍历的集合类型
        1.1 数组 关键字 array
        1.2 List集合 关键字 list
        1.3 Map集合 关键字 Map中的key
    2.open 循环开始标签,close 循环结束标签 包裹循环体
    3.separator 分割符
    4.item 当前循环遍历的数据的变量
  3. 动态Sql
    1.where if

<select id&#61;"findSqlWhere" resultType&#61;"User">select * from demo_user<where><if test&#61;"id !&#61; null"> id &#61; #{id}if><if test&#61;"name !&#61; null">and name &#61; #{name}if><if test&#61;"age !&#61; null ">and age &#61; #{age}if><if test&#61;"sex !&#61; null ">and sex &#61; #{sex}if>where>select>

2.set-if set标签用法: 去除set条件中多余的,号
3.choose-when-otherwise 标识都是互斥事件,只有一个有效.
4.resultMap 字段与属性名称不一致时,使用resultMap
5.Mybatis的注解开发 &#64;insert &#64;update &#64;delete &#64;select


推荐阅读
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • PHP 实现多级树形结构:构建无限层级分类系统
    在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ... [详细]
  • 使用Nginx反向代理实现多域名端口映射
    本文介绍如何通过配置本地hosts文件和Nginx反向代理,实现多个虚拟域名的端口映射,使用户可以通过标准HTTP端口80访问不同后端服务。 ... [详细]
  • 本文详细介绍了 Java 中 org.geotools.data.shapefile.ShapefileDataStore 类的 getCurrentTypeName() 方法,并提供了多个代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
  • 本文探讨了在 SQL Server 中使用 JDBC 插入数据时遇到的问题。通过详细分析代码和数据库配置,提供了解决方案并解释了潜在的原因。 ... [详细]
  • 本文将详细介绍如何在没有显示器的情况下,使用Raspberry Pi Imager为树莓派4B安装操作系统,并进行基本配置,包括设置SSH、WiFi连接以及更新软件源。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍了如何在Linux系统中创建和管理DB2数据库,包括用户切换、数据库创建、错误处理、连接与断开、表空间和缓冲池的创建,以及用户权限管理和数据导入导出等操作。 ... [详细]
  • 本文详细探讨了在微服务架构中,使用Feign进行远程调用时出现的请求头丢失问题,并提供了具体的解决方案。重点讨论了单线程和异步调用两种场景下的处理方法。 ... [详细]
author-avatar
Mango-家族
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有