热门标签 | 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


推荐阅读
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
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社区 版权所有