文章目录
- 一、Mybatis是什么?它和hibernate的区别有哪些?
- 二、Mybatis的工作原理
- 三、Mybatis的核心组件:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession
- 四、Mybatis SqlSessionFactory及其常见创建方式
- 五、Mybatis SqlSession简介
- 六、Mybatis实现映射器的两种方式:XML文件形式和注解形式
- 七、MyBatis执行SQL的两种方式:SqlSession和Mapper接口
- 八、SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession的作用域及生命周期
- 九、第一个MyBatis程序
- 十、MyBatis配置文件详解
- 十一、MyBatis核心配置文件properties元素
- 十二、MyBatis中settings属性配置详解
- 十三、MyBatis配置typeAliases(别名)详解
- 十四、MyBatis TypeHandler类型转换器
- 十五、MyBatis系统定义的TypeHandler
- 十六、MyBatis自定义TypeHandler
- 十七、MyBatis自定义TypeHandler处理枚举
- 十八、MyBatis BlobTypeHandler读取Blob类型字段
- 十九、MyBatis ObjectFactory(对象工厂)
- 二十、MyBatis配置文件environments和子元素transactionManager、dataSource解析
- 二十一、MyBatis与Spring的整合步骤
- 二十二、MyBatis与Spring的整合实例详解
- 二十三、MyBatis select标签以及使用Map接口和Java Bean传递多个参数
- 二十四、MyBatis的insert、update、delete和sql标签
- 二十五、MyBatis resultMap元素的结构及使用
- 二十六、MyBatis关联查询(级联查询)
- 二十七、MyBatis一对一关联查询(级联查询)
- 二十八、MyBatis一对多级联查询
- 二十九、MyBatis多对多级联查询
- 三十、MyBatis动态sql之if标签:条件判断
- 三十一、MyBatis动态sql之choose、when、otherwise标签
- 三十二、MyBatis动态sql之trim、where、set标签
- 三十三、MyBatis动态sql之foreach标签
- 三十四、MyBatis动态sql之bind标签
- 引言:MyBatis是一个代替JDBC的支持普通sql查询,存储过程和高级映射的基于Java的优秀持久层框架。MyBatis与JDBC相比减少了一半的代码,并且满足高并发和高相应的要求,所以它成为了最流行的Java互联网持久层框架。
一、Mybatis是什么?它和hibernate的区别有哪些?
- 是什么?MyBatis是一个基于Java的持久层框架,它提供的持久层框架包括SQL MAPS和Data Access Objects(DAO),它消除了几乎所有JDBC代码的参数手工设置以及结果集的检索。
- 怎么做?MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOS映射成数据库的记录。
- Java持久层框架主要有Hibernate和MyBatis,区别如下:
- sql优化方面:
- Hibernate不需要编写大量SQL,就可以完全映射,提供了日志,缓存,级联(级联比MyBatis强大)等待性,此外还提供了HQL对POJO进行操作,但会多消耗性能。单表操作,或者简单的多表级联,更适合使用Hibernate。
- MyBatis手动编写SQL ,支持动态SQL,处理列表,动态生成表名,支持存储过程,工作量较大。
- 开发方面:
- MyBatis是一个半自动映射的框架,因为MyBatis需要手动匹配POJO和SQL的关系
- Hibernate是一个全表映射的框架,只需要提供POJO和映射关系即可
- Hibernate优势
- Hibernate的DAO层开发比MyBatis简单,MyBatis需要维护SQL和结果映射集
- Hibernate对对象的维护和缓存要比Mybatis好,对增删改查的对象维护要方便
- Hibernate数据库移植性好,MyBatis对数据库移植性不好,不同数据库要写不同的SQL
- Hibernate有更好的二级缓存机制,可以使用第三方缓存,MyBatis本身提供的缓存机制不佳
- MyBatis优势
- MyBatis可以进行更为细致的sql优化,可以减少查询字段
- MyBatis容易掌握,而Hibernate的门槛较高
- sql优化方面:
- 总的来说MyBatis是一个小巧,简单,半自动化的持久层框架, Hibernate是一个强大,复杂,全自动化的持久层框架。所以对性能要求不苛刻的系统,比如erp,管理系统推荐使用Hibernate。而需要高性能,相应快,灵活的系统推荐使用MyBatis。
二、Mybatis的工作原理
- 读取MyBatis配置文件。mybatis-config.xml文件为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接信息
- 加载映射文件。映射文件即SQL映射文件Mapper.xml,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。可以加载多个SQL映射文件,每个文件对应数据库中的一张表
- 构造会话工厂。通过MyBatis的环境等配置信息构造会话工厂SqlSessionFactory
- 创建会话对象。由会话工厂创建SqlSession对象,该对象包含了执行SQL语句的所以方法
- Executor执行器。MyBatis底层定义了Executor接口来操作数据库,它根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存的维护
- MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装。用于存储要映射的SQL语句的id和参数等信息
- 输入参数映射。输入参数类型可以是Map,List等集合类型,也可以是基本数据类型和POJO类型,输入参数类型映射过程类似于JDBC对preparedStatement对象设置参数的过程
- 输出结果映射。输出结果可以是Map,List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程
三、Mybatis的核心组件:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession
- MyBatis的核心组件:四个部分
- SqlSessionFactoryBuilder(构造器) :它会根据配置或者代码来生成SqlSessionFactory,采用的是分步构建的Builder的模式
- SqlSessionFactory(工厂接口):依靠它来生成SqlSessionFactory,使用的是工厂模式
- SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。在现有的技术中,一般会让其在业务逻辑代码中消失,而使用的是MyBatis提供的SQL Mapper接口编程技术,它能提高代码可读性和可维护性
- SQL Mapper(映射器):MyBatis新设计存在的组件,它由一个Java接口和XML文件构成,需要给出对应的SQL和映射规则。负责发送SQL去执行,并返回结果。
四、Mybatis SqlSessionFactory及其常见创建方式
- 使用MyBatis首先是使用配置和代码,利用构造器SqlSessionFactoryBulider构造SqlSessionFactory
- 提供了一个Configuration作为指导,采用的是Builder模式,具体的分步则是在Configuration类里完成的
- 在MyBatis中可以通过读取配置的XML文件生成SqlSessionFactory,也可以通过Java代码生成SqlSessionFactory。建议使用XML文件形式,以为代码方式修改时更加麻烦。MyBatis会读取配置文件,通过Configuration类对象构建整个MyBatis的上下文。
- SqlSessionFactory是一个接口,存在两个实现类,SqlSessionManager和DefaultSqlSeesionFactory
- 一般而言,具体是由DefaultSqlSeesionFactory实现,SqlSessionManager用于多线程,它的实现也依靠于SqlSessionManager
- SqlSessionFactory唯一的作用是产生MyBatis的核心接口对象SqlSession,它的责任唯一,所以常采用单例模式处理。
- 两种生成SqlSessionFactory的方法:
- XML方式:
- 基础配置:mybatis-config.xml,配置数据库环境和基本的上下文运行参数。使用标签如下
- configuration
- typeAlias:给类定义别名,定义后在MyBatis的上下文中就可以使用别名去代替全限定名
- environment:这里描述的是数据库,里面的transactionManager元素是配置事务管理器
- dataSource:配置数据库,其中属性type=“POOLED”代表采用MyBatis内部提供的连接池方式,定义了JDBC的属性信息
- mapper:代表引入的映射器
- 映射文件:
- 创建:InputStream is = Resources.getResourceAsStream(resource); factory = new SqlSessionFactoryBuilder().build(is);
- 以XML文件形式可以避免在修改时代码的重新编译,有利于日后的维护和修改
- 基础配置:mybatis-config.xml,配置数据库环境和基本的上下文运行参数。使用标签如下
- 代码方式
- 效果一样,但是代码冗余,不易修改,且修改后需要重新编译代码。除非需要配置加密过的数据库用户名和密码,需要我们在生成 SqlSessionFactory 前解密为明文的时候,才会考虑使用这样的方式。
- XML方式:
五、Mybatis SqlSession简介
- SqlSession是核心接口,有两个实现类。类似于JDBC的conection
- DefaultSqlSession: 多线程使用
- SqlSessionManager:单线程使用
- 作用:
- 获取Mapper接口
- 发送SQL给数据库
- 控制数据库事务
- 创建方式:SqlSessionFactory.openSession()
- sqlSession.commit(),sqlSession.rollback(),sqlSession.close()
六、Mybatis实现映射器的两种方式:XML文件形式和注解形式
- 映射器是MyBatis中最重要的组件,它由接口和对应的XML文件(或注解)组成,它可以配置以下内容
- 描述映射规则
- 提供SQL语句,并可以配置SQL参数类型,返回类型,缓存刷新等信息
- 配置缓存
- 提供动态SQL
- 映射器的主要作用是将SQL查询到的结果映射到一个POJO,或者将POJO的数据插入数据库,并定义一些关于缓存等的重要内容
- MyBatis使用动态代理技术使得接口可以运行,MyBatis会为接口生成代理对象,代理对象会去处理相关逻辑
- XML方式创建映射器;
- namespace:接口的全限定名
- select:表示是查询语句,id标识这条sql,parameterType表示传递给SQL的是一个long型的参数,resultType表示返回值类型,可以直接设置别名。#{id}表示传递进的参数
- 没有提供SQL执行返回的数据和POJO的映射关系,MyBatis会进行自动映射,只要返回的列名能与POJO对应起来。可以在写sql时将列名改写与POJO对应起来
- 注解实现映射器:在接口的方法上写@Select(sql)。XML会覆盖注解方式。看起来简单,但SQL过长时会降低可读性,建议使用XML形式。
- 注解形式的接口可以在XML中定义。使用XML形式或代码形式
- configuration.addMapper(RoleMapper2.class);
七、MyBatis执行SQL的两种方式:SqlSession和Mapper接口
- SqlSession发送SQL
- 有了映射器就可以发送SQL了,Role role = (Role)sqlSession.select(“com.mybatis.mapper.RoleMapper.getRole”,1L);
- 如果MyBatis中只有一个id为getRole的SQL,可以简写为 (Role)sqlSession.selectOne(“getRole”,1L);
- Mapper接口发送SQL
- RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class); Role role = roleMapper.getRole(1L);通过getMapper()方法获取接口,调用它的方法。Mapper会启动对应的SQL运行,并返回结果。
- 两种方式的对比:一种用SqlSession直接发送,另一种用SqlSession获取Mapper接口在发送。建议采用获取Mapper的方式发送。
- 提高可读性。 使用Mapper接口编程可以消除SqlSession带来的功能性代码,使用SqlSession发送sql id匹配sql比较难懂,使用mapper接口方式,更能体现面向对象
- 错误校验:使用mapper方式IDE会在编译期就会进行错误校验。使用直接select方式,只有运行时才能知道是否错误
- MyBatis成为主流,在Spring中使用MyBatis时,接口方式更加简单。
八、SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession的作用域及生命周期
- 生命周期重要性:生命周期是组件的重要问题,尤其是多线程环境,比如互联网应用,Socket请求等,而MyBatis也常用多线程的环境,错误使用会造成严重的并发性问题,为了正确使用MyBatis,必须掌握MyBatis组件的生命周期
- 概念:生命周期就是每个对象应该存活的时间,如一些对象一次用完后就需要关闭,使其被JVM虚拟就销毁,以避免继续占用资源,所以需要根据每一个组件的作用去确定生命周期。
- SqlSessionFactoryBuilder:它的作用在于创建SqlSessionFactory,创建成功后,就失去作用,所以它的作用域最好是方法作用域,作为创建SqlSessionFactory的方法中的局部变量存在。
- SqlSessionFactory可以被认为是数据库连接池,作用是创建SqlSession接口对象,所以它的生命周期应该存在于整个MyBatis应用之中,它的生命周期等同于MyBatis的应用周期。SqlSessionFactory是一个数据库连接池,占用数据库连接资源,存在多个数据库连接池不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现宕机。因此在一般的应用中需要将SqlSessionFactory作为一个单例,使其被应用共享。它的最佳作用域是应用作用域
- SqlSession:它是一个数据库连接,可以在一个事务中执行多条sql,然后通过它的commit和rollback方法,提交或回滚事务。它应该存活于一个业务请求中,处理完这个业务请求,就关闭连接,否则连接池资源会被很快消耗光。必须使用finally将连接关闭。所以SqlSession的最佳作用域就是请求或方法作用域。
- Mapper:它是一个接口,由SqlSession创建,生命周期应该小于等于SqlSession,一个mapper代表一个请求的业务处理,在请求中处理完了相应的业务就必须关闭它。
九、第一个MyBatis程序
- 步骤:
- 导包
- 创建日志文件
- 创建持久化类
- 创建映射文件
- 创建MyBatis的配置文件
十、MyBatis配置文件详解
- configuration:配置
- properties:属性
- settings:设置
- typeAliases:类型别名
- typeHandlers:类型处理器
- objectFactory:对象工厂
- plugins:插件
- environments:配置环境
- environment:环境变量
- transactionManager:事务管理器
- dataSource:数据源
- mappers:映射器
- databaseIdprovider:数据库厂商标识
- MyBatis配置文件配置项顺序不能乱,否则启动阶段会异常
十一、MyBatis核心配置文件properties元素
- properties属性可以给系统配置运行参数,放在properties文件或xml文件,可以方便修改,且不会引起代码重新编译。MyBatis提供了三种方式使用properties,它们是:
- property子元素 使用${}
- properties文件 在properties中,放入键值对。然后在MyBatis中通过引入文件,使用${}取值
- 程序传递代码 :在真实生产环境中,运维需要对用户名和密码进行保密,所以经常加密后配置到properties中。
String resource = "mybatis-config.xml";
InputStream inputStream;
Inputstream in = Resources.getResourceAsStream("jdbc.properties");
Properties props = new Properties();
props.load(in);
String username = props.getProperty("database.username");
String password = props.getProperty("database.password");
//解密用户和密码,并在属性中重置
props.put("database.username", CodeUtils.decode(username));
props.put ("database.password", CodeUtils.decode(password));
inputstream = Resources.getResourceAsStream(resource);
//使用程序传递的方式覆盖原有的properties属性参数
SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream, props);
十二、MyBatis中settings属性配置详解
- settings配置项很多,但真正用到的有:
- 关于缓存的:cacheEnabled
- 关于级联的:lazyLoadingEnabled和aggressiveLazy Loading
- 关于自动映射的:autoMappingBehavior和mapUnderscoreToCamelCase
- 关于执行器类型的:defaultExecutorType
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
十三、MyBatis配置typeAliases(别名)详解
- 类的全限定名很长,所以需要起别名。注意在MyBatis中别名不区分大小写
- 两种方式:
<typeAliases><!--别名-->
<typeAlias alias="role" type="com.mybatis.po.Role"/>
<typeAlias alias="role" type="com.mybatis.po.User"/>
</typeAliases>
<typeAliases><!--别名-->
<package name="com.mybatis.po"/>
</typeAliases>
使用包扫描时,会将类名小写作为别名。如果别名重复可以在类上加注解@Alias(“user3”)
十四、MyBatis TypeHandler类型转换器
- 在JDBC中,需要在PreparedStatement对象中设置那些已经预编译过的SQL语句的参数。执行SQL后,通过ResultSet对象获取得到的数据库的数据,而这些MyBatis是根据数据的类型通过typeHandler来实现的。
- 在typeHandler中,分为jdbcType和javaType
- jdbcType:用于定义数据库类型
- javaType:用于定义java类型
- typeHandler的作用是承担jdbcType和javaType的转换。多数情况不需要配置TypeHandler,MyBatis会自动探测处理 。
- 和别名一样,在MyBatis中存在系统定义和自定义typeHandler。MyBatis会根据jdbcType和javaType决定采用哪个typeHandler处理这些转换规则。系统提供的TypeHandler可以处理大多数情况,但是无法处理枚举类的场景。
十五、MyBatis系统定义的TypeHandler
十六、MyBatis自定义TypeHandler
- 为什么要自定义?大部分情况MyBatis的TypeHandler就能应付一般场景,但是使用枚举的时候,就需要自定义了。
- 如何自定义?实现TypeHandler接口。接口有四个抽象方法。
- setParameter(PreparedStatement ps, int i, T parameter, jdbcType jdbcType)。这是通过Statement对象设置sql参数时使用的具体方法。i是下标,parameter是参数,jdbcType是数据库类型。
- 三个getResult方法,作用是从jdbc结果集获取数据进行转换,结果集+列名获取,结果集+下标获取,存储过程+下标获取。
- 启用自定义的typeHandler
- 两种启用typeHandler的方式
- 使用与自定义的typeHandler一致的jdbcType和javaType,或直接使用typeHandler的实现类
- 当数据库返回为空时,无法知道相应的jdbcType和javaType。就可以使用指定TypeHandler的方式使用。
- 如果typeHandler很多,可以使用包扫描的方式。
十七、MyBatis自定义TypeHandler处理枚举
- 绝大多数情况下,自定义typeHandler是为了枚举的使用。Mybatis自定义了两个类作为枚举类的使用,分别是:
- EnumOrdinalTypeHandler:是按照MyBatis根据枚举数组下标索引的方式匹配,也是枚举类型的默认转换类,要求数据库返回整数作为下标,根据下标找到对应的枚举类型
- EnumTypeHandler:会把名称转换为对应的枚举类型
十八、MyBatis BlobTypeHandler读取Blob类型字段
十九、MyBatis ObjectFactory(对象工厂)
- 创建结果集时,MyBatis会使用一个对象工厂来完成创建这个结果集实例,默认情况,MyBatis会使用DefaultObjectFactory来完成对应工作。如果自定义需要实现ObjectFactory接口。
二十、MyBatis配置文件environments和子元素transactionManager、dataSource解析
- 运行环境的主要作用是配置数据库信息,可以配置多个或一个
- 两个可配置的元素
- 事务管理器 type=jdbc 。提供了两个实现类,需要实现Transaction接口。接口方法有commit,rollback,close,getTimeout。两个实现类,JdbcTransaction,ManagedTransaction。于是对应着自己相应的工厂类。所以事务管理器可以配置为type=managed或type=jdbc。
- type=jdbc。以JDBC的方式对数据库的提交和回滚进行操作
- type=managed。使用ManagedTransaction对象实现,它的提交和回滚不需要操作,是把事务交给容器处理。默认情况下关闭连接,需要将closeConnection属性设置为false来阻止这个关闭行为。不想采用时,可以自定义事务管理器规则
- 数据源(3种)
- UNPOOLED:非数据库池方式,需要打开和关闭连接,速度慢。属性driver,url,username,password,defaultTransactionlsolationLevel
- POOLED:数据库池方式。除了非数据库池的属性外,还多了一些关于链接池的属性。
- JNDI:为了能在EJB会应用服务器这类容器中使用,容器可以集中或在外部配置数据源。
- 事务管理器 type=jdbc 。提供了两个实现类,需要实现Transaction接口。接口方法有commit,rollback,close,getTimeout。两个实现类,JdbcTransaction,ManagedTransaction。于是对应着自己相应的工厂类。所以事务管理器可以配置为type=managed或type=jdbc。
二十一、MyBatis与Spring的整合步骤
- 步骤:
- 导入MyBatis的jar包,spring的jar包,两者整合的中间jar包, 数据库驱动jar包,数据源所需jar包。
- 在Spring中配置MyBatis工厂
- 使用spring管理MyBatis数据操作接口。最常用的是包扫描
二十二、MyBatis与Spring的整合实例详解
二十三、MyBatis select标签以及使用Map接口和Java Bean传递多个参数
- 在sql映射文件中,元素用于映射SQL的select元素。属性有以下几种
- id 唯一标识
- parameterType
- resultType
- flushCache:默认false,设为true,则任何时候只要SQL被调用就会清空本地缓存
- useCache:默认为true,表示将查询结果存入二级缓存
- timeout
- fetchSize
- statementType
- resultSetType
- 使用Map接口传递多个参数:实际开发中,查询SQL语句常需要多个参数,例如多条件查询。传递多个参数时parameterType属性值是什么?将查询按kv放入map中,传入map,参数为#{k}。使用这种方式业务性不强,sql参数复杂不便于阅读。
- 使用Java Bean传递多个参数。创建参数的POJO,传入pojo进行查询。
二十四、MyBatis的insert、update、delete和sql标签
- :用于映射插入语句,执行完插入后会返回一个整数表示其影响的行数,属性与select的大部分相同。有几个特有的元素。
- keyProperty:作用是将插入或更新的操作时的返回值赋给PO类的某个属性,通常会设置为主键对应的属性。联合主键可以将多个值用逗号隔开
- keyColumn:用于设置第几列是主键
- useGeneratedKeys:该属性将使MyBatis使用JDBC的getGeneratedKeys()方法获取数据库内部主键。如自增主键。默认为false。
- 主键(自动递增)回填 。有时可能需要这个刚产生的主键用于关联其他业务。
- 自定义主键。实际工程数据库不支持自动递增,如Oracle,或者取消主键自动递增,可使用MyBatis的元素来自定义生成主键。
- update与delete元素。与insert和delete的属性差不多。执行后也返回一个整数,表示影响了数据库的记录行数。
- sql元素。可以定义sql语句代码片段,之后引用。
二十五、MyBatis resultMap元素的结构及使用
- 元素表示结果映射集,是MyBatis中最重要的元素,主要用于定义映射规则,级联的更新以及定义类型转换器。
- 属性:id,唯一标识;type,需要的POJO
- 子元素:constructor,用于配置构造方法,当POJO未定义无参构造方法时使用
- 子元素:id,表示哪个列是主键
- 子元素:result,表示POJO和数据表普通列的映射关系
- 子元素:association,collection,discriminator。用在级联的情况。
- 一条查询sql语句执行后将返回结果,而结果可以使用Map存储,也可以使用POJO存储。
- 任何select语句的返回值都可以用map存储,取值时key必须与数据库中字段值一样,很好用但是可读性差
- 使用POJO存储结果集,一方面可以自动映射,当级联时就要使用resultMap属性配置映射集合。步骤
- 创建相关属性的POJO类
- 配置resultMap元素
- 配置select元素
- 添加接口方法
- 调用接口方法
二十六、MyBatis关联查询(级联查询)
- 三种级联:
- 一对一
- 一对多
- 多对多
- 优点:获取关联数据更简单。缺点:降低系统性能
- 更新和删除的级联数据库内在机制即可完成。
二十七、MyBatis一对一关联查询(级联查询)
- 有很多一对一的关系,按道理说一对一的数据可以放一张表,但是不利于维护,且会有数据冗余,所以分表存放。那么MyBatis中通过resultMap元素的子元素association处理这个关系。
- association使用属性
- property:指定映射到实体类的对象属性
- column:指定查询返回的列名
- javaType:指定映射到实体对象属性的类型
- select :指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询。
- 使用MyBatis的嵌套查询方式进行关联查询时,使用MyBatis的懒加载可以提高查询效率,在mybatis-config.xml中打开懒加载
二十八、MyBatis一对多级联查询
二十九、MyBatis多对多级联查询
三十、MyBatis动态sql之if标签:条件判断
- 常需要根据需求手动拼接SQL语句,MyBatis提供了对SQL语句的动态组装功能。
- 动态sql通常做的事是有条件的包含where子句的一部分,所以MyBatis中元素是最常用的元素,类似于Java中的if语句。
三十一、MyBatis动态sql之choose、when、otherwise标签
- choose使用场景:有时不想用到所有的条件语句,使用choose,when,otherwise
三十二、MyBatis动态sql之trim、where、set标签
- tirm元素主要功能是可以在自己包含的内容前加某些前缀或后缀。可以把包含的内容覆盖掉,对应的属性是 prefixOverrides 和 suffixOverrides。可以非常简单地利用 来代替 元素的功能。
- where元素。会在写入where元素的地方输出一个where。where中的条件不满足的话会忽略条件,输出后以and开头,会把第一个and忽略掉。
- set元素。使用set元素可以动态更新列。
三十三、MyBatis动态sql之foreach标签
- foreach主要用在构建in条件中。可以在sql中迭代一个集合。主要属性有 :item、index、collection、open、separator、close。
- item表示迭代的别名
- index表示迭代在集合中的位置
- collection表示迭代的集合
- list
- arry
- map map中值为list对象或arry对象
- open表示该语句以什么开始
- close表示在每次进行迭代之间以什么符号作为分隔符
- separator表示迭代分隔符
三十四、MyBatis动态sql之bind标签
- 进行模糊查询时,使用${}拼接字符串,无法防止sql注入问题。如果使用字符串拼接函数或连接符号,但不同数据库的连接函数或连接符号不同。不利于代码移植,使用bind元素可以解决这个问题。