Mybatis31实战.docx
- 文档编号:5514628
- 上传时间:2022-12-18
- 格式:DOCX
- 页数:48
- 大小:112.67KB
Mybatis31实战.docx
《Mybatis31实战.docx》由会员分享,可在线阅读,更多相关《Mybatis31实战.docx(48页珍藏版)》请在冰豆网上搜索。
Mybatis31实战
Mybatis3.1实战
1、前言2
2、什么是mybatis2
3、Mybatis入门实例2
4、Mybatis中的增、删、改、查8
5、Mybatis新特性介绍10
6、mybatis-config.xml中的元素介绍11
7、Mapper配置文件中的用法18
8、Mybatis参数传递20
9、基于注解的sql语句21
10、动态sql语句22
11、mybatis中的一对多、一对一、多对多24
12、自定义类型处理器28
13、Mybatis缓存的一点说明31
14、Spring3.1+springmvc+mybatis3.1集成31
备注40
Like模糊查询40
排序40
if元素中的条件语句41
1、前言
随着开发团队转投GoogleCode旗下,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(PlanOldJavaObjects,普通的Java对象)映射成数据库中的记录。
3、Mybatis入门实例
Ø在maven中加入mybatis、mysql、junit的依赖包:
Ø创建数据库
Createtablestudent(idintprimarykeyautoincrement,ageint,namevarchar(23));
在mysql数据中创建student表。
Ø配置SqlmapConfiguration.xml,在src目录下面的resources目录下面创建此文件,内容如下:
--引入外部数据库配置文件-->
--
类型别名是为Java类型命名一个短的名字。
它只和XML配置有关,只用来减少类完全限定名的多余部分。
例如:
使用这个配置,“Student”可以任意用来替代“com.marcle.domain.Student”所使用的地方。
对于普通的Java类型,有许多内建的类型别名。
它们都是大小写不敏感的,由于重载的名字,要注意原生类型的特殊处理。
-->
alias="Student"/> alias="Status"/> -- environments下用于配置不同数据库环境 --> -- 在MyBatis中有两种事务管理器类型(也就是type=”[JDBC|MANAGED]”): JDBC–这个配置直接简单使用了JDBC的提交和回滚设置。 它依赖于从数据源得到的连接来管理事务范围。 MANAGED–这个配置几乎没做什么。 它从来不提交或回滚一个连接。 而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。 默认情况下它会关闭连接。 然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false --> --数据源的配置 dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源。 许多MyBatis的应用程序将会按示例中的例子来配置数据源。 然而它并不是必须的。 要知道为了方便使用延迟加载,数据源才是必须的 有三种内建的数据源类型 UNPOOLED–这个数据源的实现是每次被请求时简单打开和关闭连接。 它有一点慢,这是对简单应用程序的一个很好的选择,因为它不需要及时的可用连接。 不同的数据库对这个的表现也是不一样的,所以对某些数据库来说配置数据源并不重要,这个配置也是闲置的 POOLED–这是JDB法C连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。 这是一种当前Web应用程序用来快速响应请求很流行的方 JNDI–这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用 --> --指定要用到的mapper文件。 以下的resource属性告诉 MyBatis要在类路径下的resources目录下找student.xml文件。 我们将把mapper文件存放在src目录下的resources目录中。 --> 其中外部引入的jdbc.properties内容如下: database.driver=com.mysql.jdbc.Driver database.url=jdbc: mysql: //localhost: 3306/mybatis_01 database.user=root database.password=marcle Ø创建mapper文件,在resources目录下面的case文件夹下面创建student.xml文件 insertintostudent(age,name)values(#{age},#{name}) select*fromstudentwhereid=#{id} Ø创建实体类及接口 Student类 publicclassStudentimplementsSerializable{ privateLongid; privateintage; privateStringname; publicLonggetId(){ returnid; } publicvoidsetId(Longid){ this.id=id; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } } StudentDao接口 publicinterfaceStudentDao{ publicStudentselect(intid); publicvoidinsert(Studentstudent); } ØSqlMapUtil工具类及数据调用 publicclassSqlMapUtils{ privatestaticfinalLoggerlogger=LogManager.getLogger(SqlMapUtils.class); privatestaticfinalStringCONFIG_FILE_PATH="mybatis-config.xml"; privateSqlSessionFactorysessionFactory=null; privateSqlSessionsession=null; privatestaticSqlMapUtilsinstance=null; publicSqlMapUtils(){ Readerreader=null; try{ reader=Resources.getResourceAsReader(CONFIG_FILE_PATH); sessionFactory=newSqlSessionFactoryBuilder().build(reader); session=sessionFactory.openSession(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock logger.fatal("IOExceptionoccuredwhilereadingtheConfigurationFile\n"+e); e.printStackTrace(); }finally{ if(reader! =null){ try{ reader.close(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } } } publicstaticsynchronizedSqlMapUtilsgetInstance(){ if(instance==null){ synchronized(SqlMapUtils.class){ instance=newSqlMapUtils(); } } returninstance; } publicSqlSessiongetSession(){ if(session==null){ thrownewRuntimeException("CreateSqlSessionfailed."); } returnsession; } } 完成上面的步骤后,我们写一个测试类,测试上面所写的内容: publicclassStudentDaoTest{ privateStudentDaostudentMapper; privateSqlSessionsession; @Before publicvoidinit(){ session=SqlMapUtils.getInstance().getSession(); studentMapper=session.getMapper(StudentDao.class); } @Test publicvoidtestInsert(){ Studentstudent=newStudent(); student.setAge(34); student.setName("luce"); studentMapper.insert(student); mit(); } @Test publicvoidtestFind(){ Studentstudent=studentMapper.select(3); System.out.println(student.getName()); } @After publicvoidend(){ session.close(); } } 通过上面的几个步骤,我们就创建了一个完整的mybatis实例,通过这个实例,想必大家对mybatis有个初步的了解了。 4、Mybatis中的增、删、改、查 这部分将向大家介绍对数据库得基本操作: 增、删、改、查,在下面的实例中我们仍然以上面讲到的入门列子中的数据库、实体类、SqlmapConfiguration.xml配置文件及sqlMapUtil类,所以在本节中,只写明本节涉及到的内容,对于重复的内容大家可以参考上面的入门列子。 1、student.xml配置文件 xmlversion="1.0"encoding="UTF-8"? > DOCTYPEmapper PUBLIC"-//ibatis.apache.org//DTDMapper3.0//EN""http: //ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> --命名空间--> --结果集映射从实体对象到关系数据库--> --向数据库插入一条数据parameterType表示参数的类型--> -- 注意参数注释: #{id} 这就告诉MyBatis创建一个预处理语句参数。 使用JDBC,这样的一个参数在SQL中会由一个“? ”来标识,并被传递到一个新的预处理语句中,就像这样: //SimilarJDBCcode,NOTMyBatis… StringselectPerson=“SELECT*FROMPERSONWHEREID=? ”; PreparedStatementps=conn.prepareStatement(selectPerson); ps.setInt(1,id); 当然,这需要很多单独的JDBC的代码来提取结果并将它们映射到对象实例中,这就是MyBatis节省你时间的地方。 我们需要深入了解参数和结果映射。 那些细节部分我们下面来了解。 --> insertintostudent(age,name)values(#{age},#{name}) --根据特定id查找数据,其中resultType为指定的返回类型parameterType为传入参数类型--> select*fromstudentwhereid=#{id} --更新学生数据--> updatestudentsetage=#{age},name=#{name}whereid=#{id} --删除学生数据--> deletefromstudentwhereid=#{id} 上面配置文件中的insert、delete、update、select元素,就是我们所说的增、删、改、查。 对上面涉及的属性做简要说明: ØId即这个元素唯一编号,必须唯一,不然mybatis找不到要操作的语句 ØResultType结果类型,即我们要返回的数据要转换为什么类型 ØParameterType传入参数类型 ØResultMap结果集map,对于我们实体类中的属性于数据库中的字段设置不一样,我们可以在这里进行配置。 Ø接口 publicinterfaceStudentDao{ publicvoidupdate(Studentstudent); publicvoiddelete(intid); publicStudentselect(intid); publicvoidinsert(Studentstudent); } 接口定义很简单,但是接口中的名字必须与student中的id对应起来,如果接口定义的操作在student.xml中找不到对应id的sql语句,将会报错。 5、Mybatis新特性介绍 1、Mybatis实现了接口绑定,使用更加方便。 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。 这可以说是Mybatis最重要的改进。 注意: 虽然Mybatis支持在接口中直接使用annotation的配置方式来简化配置, 不过强烈建议仍然使用xml配置的方式。 毕竟annotation的配置方式功能有限且代码入侵性太强。 使用xml配置方式才能体现出Mybatis的优势所在 2、对象关系映射的改进,效率更高 相信很多在使用ibatis2.x的朋友并没有通过ibatis的xml映射文件来实现对象间的关系映射。 其实也确实没有必要那么做,因为ibatis2.x采用的是“嵌套查询”的方式将对象之间的关系通过查询语句的直接拼装来实现,其效果和在DAO或Service中自行封装是一样的。 不过这种方式存在“N+1查询问题”。 概括地讲,N+1查询问题可以是这样引起的: 你执行了一个单独的SQL语句来获取结果列表(就是+1)。 对返回的每条记录,你执行了一个查询语句来为每个加载细节(就是N)。 这个问题会导致成百上千的SQL语句被执行。 这通常不是期望的。 而在Mybatis中,除了兼容ibatis2.x中的“嵌套查询”方式外,还提供了直接“嵌套结果”的方式,其效果相当于直接通过一句sql将查询出的dto对象自动封装成所需的对象。 具体实现方法请自行参考Mybatis官方使用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mybatis31 实战
![提示](https://static.bdocx.com/images/bang_tan.gif)