搜档网
当前位置:搜档网 › 利用Mybatis的动态SQL实现物理分页

利用Mybatis的动态SQL实现物理分页

利用Mybatis的动态SQL实现物理分页
利用Mybatis的动态SQL实现物理分页

利用Mybatis的动态SQL实现物理分页

摘要:实际项目中,经常会遇到分页的问题,mybatis 自带的分页使用的是内存分页,如果数据量较大,那么必定

会发生内存溢出。本文提出一种方法,利用mybatis 强大的动态 sql,为查询语句加上物理分页功能。

关键词:mybatis 动态sql 分页物理分页

the use of dynamicsql implementation mybatis physical page chen-ling xia-xun

luzhou vocational andtechnical

college,sichuan,luzhou,646005,china

abstracts:actual projects, the problems oftenencountered pages, mybatis own page using paging, if the data is large, thenthere must be a memory overflow occurs. this paper presents a method, usingmybatis powerful, dynamic sql, the query with the physical paging.

keywords:mybatis dynamic sql paging physicalpage

1、mybaits 简介

mybatis,前称ibatis,后改名为mybatis,截止本文成文,最新版本是3.0.6。它和hibernate 是java世界使用最多的两种orm 框架。hibernate 理念最为先进,完全实现面向对象的数据库编程,不需要掌握sql 语句,即可实现数据库操作,能够节省开发人员编写大量

sql语句的时间。但是,hibernate 在处理多表关联时,可能会出现n+1 问题,性能会有较大影响,要解决性能问题,需要较深的hibernate 知识和项目经验。mybatis 需要自己写sql 语句,开发效率不如hibernate,很难做到底层多数据库的通用。但对程序员来说有更高的可控性,可以更容易的对sql 语句进行优化,提高效率。

在开发中直接使用jdbc 一个非常普遍的问题就是动态sql。如果参数值、参数本身和数据列都是动态sql,通常的解决方法就是写很多if-else 条件语句和字符串连接。而mybatis 通过ognl 提供了一套非常清晰的方法来解决动态sql 的问题。

2、实现mysql 的物理分页

mysql 使用limit 子句来实现数据库的物理分页,limit 子句接受一个或两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数量。在mybatis 中,只需要在相应的查询语句后,加上limit 子句,即可实现物理分页。如下,以一个只有字段id,name,age 的表为例。该配置会根据传入的 hashmap,如果含有键start 和键end,那么即通过mybatis 强大的动态sql,生成含有mysql 分页的sql语句。

select * from users

limit #{start},#{end}

3、实现oracle 的物理分页

oracle 数据库的物理分页,相对mysql没有那么方便,使用rownum 嵌套查询来实现分页,为简化配置,在mybatis 中定义一个oracle 的分页配置xml 文件,其它实体映射文件引入该文件即可。分页配置xml 文件主要代码如下:

select * from ( select row_.*, rownum rownum_from (

) row_ where rownum #{start}

在需要做分页的查询语句中,最开始的位置引入head部分,最后的位置引入tail 部分,如果在传入的hashmap,有键start 和键 end,即会动态生成含有oracle 物理分页的sql 语句。

select * from users

4、结语

分页查询是系统开发中常用的功能,mybatis3 和ibatis 2 自带的分页,使用的是内存分页,即将所有数据读取到内存,然后判断要显示哪些条目。如果数据量比较大,毫无疑问会发生内存溢出,客户端获取数据很慢甚至无法获取到数据,因此,实际开发中,使用较多的是利用数据库自带的分页语句来实现物理分页。本文讲述了如何为mybatis 3 添加mysql 和oracle的物理分页功能。

参考文献

[1]李辉,王瑞波.多条件分页查询优化的设计方法[j].计算机工程,2010,2.

[2]李刚.轻量级java ee 企业应用实战[m].电子工业出版社,2011.

传智播客mybatis课堂笔记

mybatis 第一天mybatis的基础知识 课程安排: mybatis和springmvc通过订单商品案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 mybatis框架原理(掌握) mybatis入门程序 用户的增、删、改、查 mybatis开发dao两种方法: 原始dao开发方法(程序需要编写dao接口和dao实现类)(掌握) mybaits的mapper接口(相当于dao接口)代理开发方法(掌握)mybatis配置文件SqlMapConfig.xml mybatis核心: mybatis输入映射(掌握) mybatis输出映射(掌握) mybatis的动态sql(掌握) 第二天:高级知识 订单商品数据模型分析 高级结果集映射(一对一、一对多、多对多) mybatis延迟加载 mybatis查询缓存(一级缓存、二级缓存) mybaits和spring进行整合(掌握) mybatis逆向工程 1对原生态jdbc程序中问题总结 1.1环境 java环境:jdk1.7.0_72 eclipse:indigo mysql:5.1

1.2创建mysql数据 导入下边的脚本: sql_table.sql:记录表结构 sql_data.sql:记录测试数据,在实际企业开发中,最后提供一个初始化数据脚本 1.3jdbc程序 使用jdbc查询mysql数据库中用户表的记录。 创建java工程,加入jar包: 数据库驱动包(mysql5.1) 上边的是mysql驱动。 下边的是oracle的驱动。 程序代码: 1.4问题总结 1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。 设想:使用数据库连接池管理数据库连接。 2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于

MyBatis学习 之三动态SQL语句

MyBatis学习之三动态SQL语句 三、动态SQL语句 MyBatis学习之一、MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习之二、SQL语句映射文件(1)resultMap MyBatis学习之二、SQL语句映射文件(2)增删改查、参数、缓存 MyBatis学习之三、动态SQL语句 MyBatis学习之四、MyBatis配置文件 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用Oracle的序列、mysql的函数生成Id。这时我们可以使用动态sql。 下文均采用mysql语法和函数(例如字符串链接函数CONCAT)。 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。 下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。所以在执行完此方法后,边可以通过这个实体类获取生成的key。 select nextval('student') INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, STUDENT_PHOTO, CLASS_ID, PLACE_ID) V ALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday}, #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{classId}, #{placeId}) 调用接口方法,和获取自动生成key StudentEntity entity = new StudentEntity(); entity.setStudentName("黎明你好"); entity.setStudentSex(1); entity.setStudentBirthday(DateUtil.parse("1985-05-28")); entity.setClassId("20000001"); entity.setPlaceId("70000001"); this.dynamicSqlMapper.createStudentAutoKey(entity); System.out.println("新增学生ID: " + entity.getStudentId()); selectKey语句属性配置细节: 属性描述取值keyProper ty selectKey 语句生成结果需要设置的属性。 resultTyp e 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int 类型。 order 1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert 语句; 2:AFTER,就先运行insert 语句再运行selectKey 语句。 BEFORE AFTER

mybatis 对 #{ } 和 ${ }的不同处理方式

mybatis 中使用sqlMap 进行sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = "ruhua"; 上述sql 中,我们希望name 后的参数"ruhua" 是动态可变的,即不同的时刻根据不同的姓名来查询用户。在sqlMap 的xml 文件中使用如下的sql 可以实现动态传递参数name: select* from user where name = #{name}; 或者 select* from user where name = '${name}'; 对于上述这种查询情况来说,使用#{ } 和${ } 的结果是相同的,但是在某些情况下,我们只能使用二者其一。 '#' 与'$' 区别 动态SQL是mybatis 的强大特性之一,也是它优于其他ORM 框架的一个重要原因。mybatis 在对sql 语句进行预编译之前,会对sql 进行动态解析,解析为一个BoundSql 对象,也是在此处对动态SQL 进行处理的。 在动态SQL 解析阶段,#{ } 和${ } 会有不同的表现:

#{ } 解析为一个JDBC 预编译语句(prepared statement)的参数标 记符。 例如,sqlMap 中如下的sql 语句 select * from user where name = #{name}; 解析为: select * from user where name = ?; 一个#{ } 被解析为一个参数占位符?。 而, ${ } 仅仅为一个纯碎的string 替换,在动态SQL 解析阶段将会进行变 量替换 例如,sqlMap 中如下的sql select * from user where name = '${name}'; 当我们传递的参数为"ruhua" 时,上述sql 的解析为: select * from user where name = "ruhua"; 预编译之前的SQL 语句已经不包含变量name 了。 综上所得,${ } 的变量的替换阶段是在动态SQL 解析阶段,而#{ }的变量的替换是在DBMS 中。

MyBatis源码分析-SQL语句执行的完整流程(1)

MyBatis源码分析-SQL语句执行的完整流程 MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map 使用简单的XML 或注解,将接口和Java 的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA 新建MyBatis源码工程。 MyBatis框架主要完成的是以下2件事情: 根据JDBC规范建立与数据库的连接。 通过反射打通Java对象与数据库参数交互之间相互转换的关系。 MyBatis框架是一种典型的交互式框架,先准备好交互的必要条件,然后构建一个交互的环境,在交互环境中划分会话,在会话中与数据库进行交互数据。 1 MyBatis主要的类 Configuration MyBatis所有的配置信息都维持在Configuration对象之中。 SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能 Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护 StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。 ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数, ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合; TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换 MappedStatement MappedStatement维护了一条节点的封装, SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回 BoundSql 表示动态生成的SQL语句以及相应的参数信息 以上几个类在SQL操作中都会涉及,在SQL操作中重点关注下SQL参数什么时候写入和结果集怎么转换为Java对象,这两个过程正好对应的类是PreparedStatementHandler和ResultSetHandler类。 (图片来自《深入理解mybatis原理》MyBatis的架构设计以及实例分析) 2 SQL执行流程 MyBatis主要设计目的还是为了让我们在执行SQL时对输入输出的数据的管理更加方便,所以方便的让我们写出SQL和方便的获取SQL的执行结果是MyBatis的核心竞争力。下面就用一个例子来从源码角度看一下SQL的完整执行流程。 新建配置文件conf.xml: conf.xml 首先建立数据表,这里就以user表为例: 复制代码 DROP TABLE IF EXISTS user; CREATE TABLE user ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) NOT NULL, password VARCHAR(32) NOT NULL,

Mybatis3.1实战

Mybatis3.1实战 1、前言 (2) 2、什么是mybatis (2) 3、Mybatis入门实例 (2) 4、Mybatis中的增、删、改、查 (8) 5、Mybatis新特性介绍 (10) 6、mybatis-config.xml中的元素介绍 (11) 7、xml映射文件及用法 (18) 8、Mybatis参数传递 (20) 9、基于注解的sql语句 (21) 10、动态sql语句 (22) 11、mybatis中的一对多、一对一、多对多 (24) 12、自定义类型处理器 (28) 13、Spring3.1+springmvc+mybatis3.1集成 (31) 备注 (40) Like模糊查询 (40) 排序 (40) if元素中的条件语句 (40)

1、前言 随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis。相信很多朋友以前看过ibatis2.x,对ibatis2.x也比较熟悉,随着技术的发展,我们必须跟得上技术发展的步伐,不能永远停留在原来的技术上而不做进一步学习。由于在我的一个新项目中采用了mybatis,为此我发了几天来学习了mybatis,相对hibernate来说,本人感觉mybatis相对来说更加简单,特别是熟悉sql 语句的朋友们,你在采用mybatis时,你会觉得跟传统的jdbc方式来操作数据库没什么差别,只是mybatis帮你做了很多原来你在用jdbc来实现时的很多工作。我们来看看mybatis包含了哪些新特性。 Mybatis实现了接口绑定,使用更加方便 对象关系映射的改进,效率更高 MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。 在本学习教程中,全方位介绍了mybatis中的各种特性,里面的实例都是采用比较简单的实例来实现,对于有些没有介绍到的特性,大家可以参考官方文档。本教程采用的是mybatis最新的版本mybatis3.1,并结合了maven来写这个教程,所以大家需要对maven有所了解。 2、什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs (Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。 3、Mybatis入门实例 在maven中加入mybatis、mysql、junit的依赖包: junit junit 4.10 test org.mybatis mybatis 3.1.1

Mybatis-3.3.0官方文档-中文.pdf

来获取。

Copyright ? 2010–2015 https://www.sodocs.net/doc/ea14688969.html,. All rights reserved.

XML 配置文件(configuration XML)中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务范围和控制方式的事务管理器(TransactionManager)。XML 配置文件的详细内容后面再探讨,这里先给出一个简单的示例: 当然,还有很多可以在XML 文件中进行配置,上面的示例指出的则是最关键的部分。要注意 XML 头部的声明,用来验证 XML 文档正确性。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则是包含一组 mapper 映射器(这些 mapper 的XML 文件包含了 SQL 代码和映射定义信息)。 不使用 XML 构建 SqlSessionFactory 如果你更愿意直接从 Java 程序而不是 XML 文件中创建 configuration,或者创建你自己的 configuration 构建器,MyBatis 也提供了完整的配置类,提供所有和 XML 文件相同功能的配置项。

注意该例中,configuration 添加了一个映射器类(mapper class)。映射器类是 Java 类,它们包含 SQL 映射语句的注解从而避免了 XML 文件的依赖。不过,由于 Java 注解的一些限制加之某些 MyBatis 映射的复杂性,XML 映射对于大多数高级映射(比如:嵌套Join 映射)来说仍然是必须的。有鉴于此,如果存在一个对等的 XML 配置文件的话,MyBatis 会自动查找并加载它(这种情况下,BlogMapper.xml 将会基于类路径和 BlogMapper.class 的类名被加载进来)。具体细节稍后讨论。 从 SqlSessionFactory 中获取 SqlSession 既然有了 SqlSessionFactory ,顾名思义,我们就可以从中获得 SqlSession 的实例了。SqlSession 完全包含了面向数据库执行SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如: 诚然这种方式能够正常工作,并且对于使用旧版本 MyBatis 的用户来说也比较熟悉,不过现在有了一种更直白的方式。使用对于给定语句能够合理描述参数和返回值的接口(比如说BlogMapper.class),你现在不但可以执行更清晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换。 例如: 现在我们来探究一下这里到底是怎么执行的。

MyBatis动态SQL,MyBatis批量插入(Oracle数据库)

动态 SQL MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。 动态 SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就能工作了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。 if choose (when, otherwise) trim (where, set) foreach if 在动态 SQL 中所做的最通用的事情是包含部分 where 字句的条件。比如: [html] view plaincopy 这条语句会提供一个可选的文本查找功能。如果你没有传递 title,那么所有激活的博客都会被返回。但是如果你传递了 title,那么就会查找相近的 title(对于敏锐的检索,这中情况下你的参数值需要包含任意的遮掩或通配符)的博客。 假若我们想可选地搜索 title 和 author 呢?首先,要改变语句的名称让它有意义。然后简单加入另外的一个条件。 [html] view plaincopy choose, when, otherwise 有时我们不想应用所有的条件,相反我们想选择很多情况下的一种。 Java 中的 switch和语句相似,MyBatis 提供 choose 元素。

MyBatis动态Sql语句

MyBatis动态Sql语句 MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach 1、if 对属性进行判断,如果不为空则执行判断条件 [html] view plain copy 来看看结果: 这是从web页面输入的参数 这是输出的结果 这是打印出来的Sql语句 从结果可以看出,只有在条件不为空的时候,属性才会赋值。 2、where 当where中的条件使用的if标签较多时,这样的组合可能会导致错误。我们以在1中的查

Mybatis的增删改查

Mybatis的增删改查 相关的接口例子如下 public interface UserOneMapper { UserOne getuserByid(int i); List getuserones(); void insertone(UserOne userone); void deleteonebyid(Integer id); void deleteonebyname(String user_name); void updateone(UserOne userone); } 相关的java代码 public class TestMybatis { private SqlSession sqlsession; public void selectall() { List list=new ArrayList(); try{ sqlsession=UtileMybatis.getsqlsession(); UserOneMapper mapper=sqlsession.getMapper(UserOneMapper.class); list=mapper.getuserones(); for(UserOne user:list){ System.out.println(user); } }finally{ if(sqlsession!=null){ sqlsession.close(); } } } public void selectone() { try{ sqlsession=UtileMybatis.getsqlsession(); UserOneMapper mapper=sqlsession.getMapper(UserOneMapper.class); UserOne userone=mapper.getuserByid(1); System.out.println(userone); }finally{ if(sqlsession!=null){ sqlsession.close(); } }

MyBatis动态SQL之 set 和 trim标记的使用

MyBatis 动态SQL 之 set 和 trim 标记的使用 发表于3个月前(2015-08-24 11:20) 阅读(246) | 评论(0) 2人收藏此文章, 我要收藏 赞0 12月12日北京OSC 源创会 —— 开源技术的年终盛典 ? 摘要 MyBatis 动态SQL 中 set 和 trim 标记的例子 MyBatis set trim 智能标识 和之前的where 一样,set 和trim 也是智能标记 在之前的user.xml 中添加 ? 1 2 3 4 5 6 7 8 update User userName=#{us erName}, password=#{pa ssword}, where id=#{id} 再在测试代码的try 中添加 ? 1 2 3 4 5 6 7 8 //动态SQL 之set User oneUser=new User(); oneUser.setId(10); oneUser.setUserName("kobe10"); oneUser.setPassword("10kobe"); //set 标记 session.update("updateUserSet",oneUser); https://www.sodocs.net/doc/ea14688969.html,mit(); 运行,执行的SQL 语句是 update User SET userName=?, password=? where id=?

Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory

Spring3 整合MyBatis3 配置多数据源动态选择SqlSessionFactory 一、摘要 上两篇文章分别介绍了Spring3.3 整合Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源方法和Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言),这篇文章将介绍Spring整合Mybatis 如何完成SqlSessionFactory的动态切换的。并且会简单的介绍下MyBatis整合Spring中的官方的相关代码。 Spring整合MyBatis切换SqlSessionFactory有两种方法,第一、继承SqlSessionDaoSupport,重写获取SqlSessionFactory的方法。第二、继承SqlSessionTemplate 重写getSqlSessionFactory、getConfiguration和SqlSessionInterceptor这个拦截器。其中最为关键还是继承SqlSessionTemplate 并重写里面的方法。 而Spring整合MyBatis也有两种方式,一种是配置MapperFactoryBean,另一种则是利用MapperScannerConfigurer进行扫描接口或包完成对象的自动创建。相对来说后者更方便些。MapperFactoryBean继承了SqlSessionDaoSupport也就是动态切换SqlSessionFactory的第一种方法,我们需要重写和实现SqlSessionDaoSupport方法,或者是继承MapperFactoryBean 来重写覆盖相关方法。如果利用MapperScannerConfigurer的配置整合来切换SqlSessionFactory,那么我们就需要继承SqlSessionTemplate,重写上面提到的方法。在整合的配置中很多地方都是可以注入SqlSessionTemplate代替SqlSessionFactory的注入的。因为SqlSessionTemplate的创建也是需要注入SqlSessionFactory的。 二、实现代码 1、继承SqlSessionTemplate 重写getSqlSessionFactory、getConfiguration和SqlSessionInterceptor package com.hoo.framework.mybatis.support; import static https://www.sodocs.net/doc/ea14688969.html,ng.reflect.Proxy.newProxyInstance; import static org.apache.ibatis.reflection.ExceptionUtil.unwrapThrowable; import static org.mybatis.spring.SqlSessionUtils.closeSqlSession; import static org.mybatis.spring.SqlSessionUtils.getSqlSession; import static org.mybatis.spring.SqlSessionUtils.isSqlSessionTransactional; import https://www.sodocs.net/doc/ea14688969.html,ng.reflect.InvocationHandler; import https://www.sodocs.net/doc/ea14688969.html,ng.reflect.Method; import java.sql.Connection; import java.util.List; import java.util.Map; import org.apache.ibatis.exceptions.PersistenceException; import org.apache.ibatis.executor.BatchResult; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.ResultHandler;

mybatis动态sql解析

1. MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有: ?if ?choose(when,otherwise) ?trim ?where ?set ?foreach if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择。先来看如下一个例子: Xml代码 1. 这条语句的意思非常简单,如果你提供了title参数,那么就要满足 title=#{title},同样如果你提供了Content和 Owner的时候,它们也需要满足相应的条件,之后就是返回满足这些条件的所有Blog,这是非常有用的一个功能,以往我们使用其他类型框架或者直接使用 JDBC的时候,如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其麻烦的,比起来,上述的动态SQL就要简单多了。 choose元素的作用就相当于JAVA中的switch语句,基本上跟JSTL中的choose 的作用和用法是一样的,通常都是与when和otherwise搭配的。看如下一个例子: Xml代码

mybatis面试题

### 1.讲下MyBatis和Hibernate的区别? MyBatis是JDBC的轻量级封装,把Sql和java代码独立出来,性能相对比较高,写SQL语句相对于比较灵活,并且容易调试,一般用在大型项目中. Hibernate是JDBC的重量级封装,开发速度比较快,但是性能比较低,调试不方便,一般适合对进度要求的比较高的中小型项目 ###2.什么是MyBatis的接口绑定,有什么好处 接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以, 这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置. ###3.接口绑定有几种实现方式,分别是怎么实现的? 接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select @Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,在这种情况下, 要指定xml映射文件里面的namespace必须为接口的全路径名. ###4.什么情况下用注解绑定,什么情况下用xml绑定 当Sql语句比较简单时候,用注解绑定,当SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多 ###5.MyBatis实现一对一有几种方式?具体怎么操作的 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置association节点配置一对一的类就可以完成; 嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置 ###6.如果要查询的表名和返回的实体Bean对象不一致,那你是怎么处理的? 在MyBatis里面最主要最灵活的的一个映射对象的ResultMap,在它里面可以映射键值对, 默认里面有id节点,result节点,它可以映射表里面的列名和对象里面的字段名. 并且在一对一,一对多的情况下结果集也一定要用ResultMap ###7.MyBatis里面的动态Sql是怎么设定的?用什么语法? MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点, where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉 ###8.MyBatis在核心处理类叫什么 MyBatis里面的核心处理类叫做SqlSession ###9.IBatis和MyBatis在细节上的不同有哪些 在sql里面变量命名有原来的#变量# 变成了#{变量} 原来的$变量$变成了${变量}, 原来在sql节点里面的class都换名字交type 原来的queryForObject queryForList 变成了selectOne selectList 原来的别名设置在映射文件里面放在了核心配置文件里 ###10.讲下MyBatis的缓存 MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里, 默认是打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ###11.MyBatis(IBatis)的好处是什么 ibatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便利。

Mybatis 常见面试题总结及答案

Mybatis 常见面试题总结及答案 1、什么是Mybatis? 1、Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。 2、MyBatis 可以使用XML 或注解来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。 3、通过xml 文件或注解的方式将要执行的各种statement 配置起来,并通过java 对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result 的过程)。 2、Mybaits的优点: 1、基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML 标签,支持编写动态SQL语句,并可重用。 2、与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接; 3、很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC 支持的数据库MyBatis都支持)。

4、能够与Spring很好的集成; 5、提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。 3、MyBatis框架的缺点: 1、SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求。 2、SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。 4、MyBatis框架适用场合: 1、MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。 2、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。 5、MyBatis与Hibernate有哪些不同? 1、Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。 2、Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。

mybatis的简单应用

mybatis的简单应用 一:MyBatis优点 1:半自动化的ORM实现(实体类和SQL语句之间建立映射关系) 2:SQL代码从程序代码中彻底分离,可重用 3:与JDBC相比,减少了50%以上的代码量 4:小巧灵活、简单易学,是最简单的持久化框架 5:提供XML标签,支持编写动态SQL 6:提供映射标签,支持对象与数据库的ORM字段映射 二:MyBatis缺点 1:SQL语句编写工作量大,对开发人员有一定sql技术要求 2:数据库移植性差(不同数据库,sql语句语法有所不同) 三:MyBatis基本要素 1:SqlSessionFactoryBuilder:创建session工厂类 生命周期:用过即丢,只存在于方法体内(局部变量) 2:SqlSessionFactory:session工厂类 生命周期:Application(生命周期与应用的生命周期相同) 采用单例模式:存在于整个应用运行时,并且同时只存在一个对象实例 3:SqlSession:session类(包含了执行SQL所需的所有方法) 生命周期:request 在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建 线程级别,不能共享,线程不安全,对应一次数据库会话,会话结束必须关闭 4:mybatis-config.xml 系统核心配置文件

5:mapper.xml SQL映射文件 四:MyBatis两种使用方式操作数据 1:通过SqlSession实例直接运行映射的SQL语句 调用selectList/selectOne方法执行查询操作 直接运行映射的sql语句,参数为:RoleMapper.xml中命名空间名称+sql映射的id "cn.zx.dao.role.RoleMapper.findRoleList":必须是唯一的 2:基于Mapper接口方式操作数据 调用getMapper(接口.class)执行dao接口方法来实现对数据库的查询操作 xml映射文件的namespace属性必须跟相对应的接口全路径同名 xml映射文件中sql语句的id必须与接口中的方法同名 五:使用MyBatis的开发步骤 1:下载mybatis-3.2.2.jar包并导入工程 2:编写MyBatis核心配置文件(configuration.xml) 3:创建实体类-POJO 4:DAO层-SQL映射文件(mapper.xml) 5:创建测试类 读取核心配置文件mybatis-config.xml 创建SqlSessionFactory对象,读取配置文件 创建SqlSession对象 调用mapper文件进行数据操作

利用Mybatis的动态SQL实现物理分页

利用Mybatis的动态SQL实现物理分页 摘要:实际项目中,经常会遇到分页的问题,mybatis 自带的分页使用的是内存分页,如果数据量较大,那么必定 会发生内存溢出。本文提出一种方法,利用mybatis 强大的动态 sql,为查询语句加上物理分页功能。 关键词:mybatis 动态sql 分页物理分页 the use of dynamicsql implementation mybatis physical page chen-ling xia-xun luzhou vocational andtechnical college,sichuan,luzhou,646005,china abstracts:actual projects, the problems oftenencountered pages, mybatis own page using paging, if the data is large, thenthere must be a memory overflow occurs. this paper presents a method, usingmybatis powerful, dynamic sql, the query with the physical paging. keywords:mybatis dynamic sql paging physicalpage 1、mybaits 简介 mybatis,前称ibatis,后改名为mybatis,截止本文成文,最新版本是3.0.6。它和hibernate 是java世界使用最多的两种orm 框架。hibernate 理念最为先进,完全实现面向对象的数据库编程,不需要掌握sql 语句,即可实现数据库操作,能够节省开发人员编写大量

相关主题