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


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
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社区 版权所有