由浅入深视频教程-4mybatis下教案及代码-mrt_第1页
由浅入深视频教程-4mybatis下教案及代码-mrt_第2页
由浅入深视频教程-4mybatis下教案及代码-mrt_第3页
由浅入深视频教程-4mybatis下教案及代码-mrt_第4页
由浅入深视频教程-4mybatis下教案及代码-mrt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Mybatis入jdbcjdbcPublicPublicstaticvoidmain(String[]args){Connectionconnection=PreparedStatementpreparedStatement=null;ResultSetresultSet=null;tryconnection=terEncoding=utf-8","root","mysql");//定义sql?Stringsql="select*fromuserwhereusername=preparedStatement=preparedStatement.setString(1, resultSet=preparedStatement.executeQuery();}}catch(Exceptione){try{}catch(SQLExceptione)////TODOAuto-generatedcatchblock}}try{}catch(SQLExceptione)//TODOAuto-generatedcatchblock}}try{}catch(SQLExceptione)//TODOAuto-generatedcatchblock}}}}上边使用jdbc的原始方法(封装)实现了查询数据库表记录的操作jdbc23jdbcstatement对象4sql语句5sql语句中的参数(preparedStatement)6statementsql并获取结果7sqljdbc2、Sql语句在代码中硬编码,造成代码不易,实际应用sql变化的可能较大,sql变动需要改变java代码。3preparedStatementsqlwhere条件不一定,可能多也可能少,修改sql还要修改代码,系统不易。,sqlpojo对象解析比较方便。MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些只需要关注SQL本身,而不需要花费精力去处理例如驱动、创建connection、创建进行生成最终执行的sql语句,最后由mybatis框架执行sql并将结果成java对象并Mybatis1mybatisSqlMapConfig.mlmapper.xml文件即sql文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。5MappedStatementmybatismybatissql信息等。mapper.xmlsqlMappedStatement对象,sqlid即Mappedstatementid。pojoExecutor通过MappedStatement在执行sql前将输入的java对象至sql中,输入参数就jdbcpreparedStatement设置参数。pojoExecutorjdbc编程中对结果的解析处理过程。mybatismybaits的代码 mysql先导入sql_table.sql,再导入sql_data.sqlMybatisidjavaeclipse创建java工程,jdk1.7.0_72jar加入mybatis包、依赖包、数据驱动包##Globalloggingconfigurationlog4j.rootLogger=DEBUG,stdout#Consoleoutput...log4j.appender.stdout.layout.ConversionPattern=%5p[%t]-%m%nmybatislog4j<?xml<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDConfig3.0//EN"和springenvironments<environments<environment使用jdbc事务管理<transactionManagertype="JDBC"数据库连接池<dataSource<propertyvalue=value="com.mysql.jdbc.Driver"<propertyname="url"tf-8"/><propertyname="username"value="root"<propertyname="password"value="mysql"第五步:poPublicPublicclassUserprivateintprivateStringusername;/privateStringprivateDatebirthday;/privateStringaddress;/查在classpath下的 下创建sql文件<?xml<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDMapper"" <mapper 根据id<selectid="findUserById"parameterType="int" select*fromuserwhereid=<selectid="findUserByUsername"parameterType="java.lang.String" select*fromuserwhereusernamelike加载文mybatis框架需要加载文件,将Users.xml添加在SqlMapConfig.xml,如下<mapperpublicpublicclassMybatis_firstprivateSqlSessionFactorypublicvoidcreateSqlSessionFactory()throwsIOExceptionStringresource=//sqlSessionFactory=new}id查询用户信息publicvoidtestFindUserById()SqlSessionsqlSession=null;try{创建数据库会话实例sqlSession=查询单个记录,根据用户idUseruser=

}catch(Exceptione){}finallyif(sqlSession!=null){}}}publicvoidtestFindUserByUsername()SqlSessionsqlSession=null;try{创建数据库会话实例sqlSession=查询单个记录,根据用户idList<User>list=sqlSession.selectList("test.findUserByUsernameList<User>list=sqlSession.selectList("test.findUserByUsername张");}catch(Exceptione){}finallyif(sqlSession!=null){}}}}#{}和#{}#{}preparedStatementjavajdbc类型转换,#{}sql#{}pojo属性值。parameterType传输单个简单类型值,#{}value或其它名称。${}sql串,通过${}parameterTypesql中且不进行jdbc类resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据为selectOneselectOneselectOne查询多条记录则抛出异常:(ornull)tobereturnedbyselectOne(),butfound:3添<insert<insertid="insertUser"<selectKeykeyProperty="id"order="AFTER"selectinsertintopublicvoidtestInsert()SqlSessionsqlSession=null;try{创建数据库会话实例sqlSession=Useruser=newUser(); }catch(Exceptione)}finallyif(sqlSession!=null){}}}mysql自增主键返<insertid="insertUser" selectKey<insertid="insertUser" selectKey<selectKeykeyProperty="id"order="AFTER"selectinsertintouser(username,birthday,sex,address)insertselectKeyafterMysqluuid实现主selectuuid()uuid <selectKeyresultType="java.lang.String"order="BEFORE"selectinsertintouser(id,username,birthday,sex,address)Oracle <selectKeyresultType="java.lang.Integer"order="BEFORE"SELECT自定义序列.NEXTVALFROMinsertintouser(id,username,birthday,sex,address)删<deleteid="deleteUserById"parameterType="int">deletefromuserwhereid=#{id}根据idpublicvoidtestDelete()SqlSessionsqlSession=null;try{创建数据库会话实例sqlSession=}catch(Exceptione){}finallyif(sqlSession!=null){}}}修文<updateid="updateUser"updateuserwhere测试程publicvoidtestUpdate()SqlSessionsqlSession=null;try{创建数据库会话实例sqlSession=Useruser=newUser(); }catch(Exceptione){}finallyif(sqlSession!=null){}}}Mybatisjdbc2、Sql语句写在代码中造成代码不易,实际应用sql变化的可能较大,sql变动需要改java代码。解决:Sql语句配置在XXXXmapper.xml文件中与java3sqlsqlwhere条件不一定,可能多也可能少,占位符解决:Mybatis自动将java对象至sql语句,通过statement中的parameterType定4sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库pojo对象解析比较方便。解决:Mybatis自动将sql执行结果至java对象,通过statement中的resultType定hibernateMybatishibernateORMMyBatis需要程序员自己编写SqlmybatisXML或注解方式灵活配置要运行的sqljava对象和sql语句生成最终执行的sql,最后将sql执行的结果再生成java对象。的学习门槛高,要精通门槛更高,而且怎么设计O/R,在性能和对象模型之间如何权Hibernate需要具有很强的经验和能力才行。Dao开发方MybatisDaoDaoMapperidSqlSessionSqlSessionFactoryBuilderSqlSessionSqlSessionFactory生产,所以可以SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以SqlSessionFactory。SqlSession是一个面向用户的接口,sqlSession中定义了数据库操作,默认使用2ifif(ExecutorType.BATCH==executorType)executor=newBatchExecutor(this,}elseif(ExecutorType.REUSE==executorType){executor=newReuseExecutor(this,transaction);}elseexecutor=newSimpleExecutor(this,}if(cacheEnabled)executor=new }SqlSession实例。SqlSession的实例不能共享使用,它也是SqlSessionsession=sqlSessionFactory.openSession();try{//SqlSessionsession=sqlSessionFactory.openSession();try{//do}finally}}DaoDaoDaoDao<?xml<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDMapper <mapper根据id<selectid="findUserById"parameterType="int" select*fromuserwhereid=<insertid="insertUser" <selectKeykeyProperty="id"order="AFTER"selectinsertintouser(username,birthday,sex,address)DaoPublicPublicinterfaceUserDaopublicUsergetUserById(intid)throwspublicvoidinsertUser(Useruser)throws}PublicclassUserDaoImplimplementsUserDaopublicUserDaoImpl(SqlSessionFactory}privateSqlSessionFactorysqlSessionFactory;publicUsergetUserById(intid)throwsException{SqlSessionsession=sqlSessionFactory.openSession();Useruser=null;try数user=session.selectOne("test.findUserById",1);}}return}PublicvoidinsertUser(Useruser)throwsException{SqlSessionsqlSession=sqlSessionFactory.openSession();try{sqlSession.insert("insertUser",}}}}Dao Mapper动态方框架根据接口定义创建接口的动态对象,对象的方法体同上边Dao接口实现类方2Mapper接口方法名和Mapper.xmlstatementid3Mappermapper.xmlsqlparameterType的4Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相定义mapper文件UserMapper.xml(内容同Users.xml,需要修改namespace的值为UserMapper接口路径。将UserMapper.xml放在classpath下mapper <?xml<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDMapper <mapper 根据id<selectid="findUserById"parameterType="int" select*fromuserwhereid=<selectid="findUserByUsername"parameterType="java.lang.String" select*fromuserwhereusernamelike<insertid="insertUser" <selectKeykeyProperty="id"order="AFTER"selectinsertintouser(username,birthday,sex,address)*用户管理PublicinterfaceUserMapperpublicUserfindUserById(intid)throwspublicvoidinsertUser(Useruser)throws}1Mapper接口方法名和Mapper.xmlstatementid2Mapper接口方法的输入参数类型和mapper.xml中定义的statementparameterType的3Mapper接口方法的输出参数类型和mapper.xml中定义的statement的resultType的类型<mapperPublicPublicclassUserMapperTestextendsTestCaseprivateSqlSessionFactoryprotectedvoidsetUp()throwsExceptionStringresource=sqlSessionFactory=new}PublicvoidtestFindUserById()throwsExceptionSqlSessionsession= 对UserMapperuserMapper= Useruser=userMapper.findUserById(1);}publicvoidtestFindUserByUsername()throwsException{SqlSessionsqlSession=sqlSessionFactory.openSession();UserMapperuserMappersqlSession.getMapper(UserMapper.class);List<User>list=userMapper.findUserByUsername("张");}PublicvoidtestInsertUser()throwsExceptionSqlSessionsession= 对UserMapperuserMapper=Useruser=newuser.setBirthday(new }}selectOne动态对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返mybatis推荐使用mapper方法开发mapper接口,程序员不用编写mapper接口实现类,使用mapper方法时,输入参数可以使用pojo包装对象或map对象,保证daoSqlMapConfig.xml配置文SqlMapConfig.xml可以java属性文件中的配置信息如下:classpathperties文件,<properties<properties<environments<environment<transactionManager<dataSource<propertyname="driver"<propertyname="url"<propertyname="username"<propertyname="password"MyBatis在properties元素体内定义的属性首先被然后会properties元素中resource或url加载的属性,它会覆盖已的同名属parameterType传递的属性具有最高优先级,resourceurl加载的属性次之,最低优先级的是properties元素体内定义的属性。mybatismybatis的运行行为。mybatis别 的类 <typeAliasalias="user"<!--<package 类型处理器用于java类型和jdbc类型,如下<selectid="findUserById"parameterType="int"resultType="user">select*fromuserwhereid=#{id}Javamappers(器Mapper<mapperresource=""如:<mapperresource="sqlmap/User.xml"<mapperurl=""使用完全限定路如:<mapperurl="file:///D:\workspace_smvc\mybatis_01\config\sqlmap\User.xml"<mapperclass=""mapper如:<mapperclass="cn. 中<packagemapper如:<package 中Mapper.xml文件中定义了操作数据库的sql,每个sql是一个statement,文件是mybatis的。#{}与#{}prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位根据id<selectid="findUserById"parameterType="int"resultType="user">select*fromuserwhereid=#{id}使用占位符#{}sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc#{}可以接收简单类型值或pojoparameterType传输单个简单类型值,#{}value或其它名称。${}和#{}不同,通过${}parameterTypesqljdbc类型转value。使用${}sql注入,但是有时用${}会非常方便,如下的例子:<selectid="selectUserByName"parameterType="string"select*fromuserwhereusernamelike如果采用${}sql中拼接为%mapper接口传递参数就方便很多。List<UserlistuserMapper.selectUserByName("%管理员List<User>listuserMapper.selectUserByName("管理员ORDERBY传递pojoMybatisognl<!—<!—传递pojo<selectid="findUserByUser"parameterType="user"resultType="user">select*fromuserwhereid=#{id}andusernamelike'%${username}%'PublicvoidtestFindUserByUser()throwsPublicvoidtestFindUserByUser()throwsSqlSessionsession=UserMapperuserMapper=UserusernewUser();List<User>list=}Sql中字段名输入错误后测试,username输入dusername报错###Errorqueryingdatabase. Cause:org.apache.ibatis.reflection.ReflectionException:Thereisnogetterforpropertynamed'dusername'in'classcn..mybatis.po.User'###Cause:org.apache.ibatis.reflection.ReflectionException:Thereisnogetterforpropertynamed'dusername'in'classcn. pojo定义包装对publicpublicclassQueryVoprivateUserprivateUserCustom说明:mybatisognlpojo中获取属性值:#{user.username},user即是传入的包装对象的属性。queryVo是别名,即上边定义的包装对象类型。传递传递hashmap<select传递hashmap<selectid="findUserByHashmap"select*fromuserwhereid=#{id}andusernamelikePublicPublicvoidtestFindUserByHashmap()throwsSqlSessionsession=UserMapperuserMapper=HashMap<String,Object>map=newHashMap<String,Object>();map.put("id",1);map.put("username"管理员List<User>list=}mapkeysql中解析的key不一致。没有报错,只是通过key获取值为空。<select<selectid="findUserCount"parameterType="user"resultType="int">selectcount(1)fromuserMapperpublicpublicintfindUserCount(Useruser)throwsPublicPublicvoidtestFindUserCount()throwsSqlSessionsession=UserMapperuserMapper=Useruser=newUser();intcount=}sessionselectOne可查询单条记录。pojofindUserById根据根据id<selectid="findUserById"parameterType="int"resultType="user">select*fromuserwhereid=#{id}MapperpublicUserfindUserById(intid)throws PublicPublicvoidtestFindUserById()throwsExceptionSqlSessionsession=UserMapperuserMapper=Useruser=userMapper.findUserById(1);}sessionselectOnepojo<selectid="findUserByUsername"parameterType="string"select*fromuserwhereusernamelikeMapperpublicpublicList<User>findUserByUsername(Stringusername)throwsPublicvoidtestFindUserByUsername()throwsSqlSessionsession=UserMapperuserMapper=//List<UserlistuserMapper.selectUserByName("%管理员List<UserlistuserMapper.findUserByUsername("管理员}sessionselectListpojoresultTypepojopojosqlresultType,返回单个pojo对象要保证sql查询出来的结果集为单条session.selectOne方法调用,mapperpojo对象作为方法返回值。,,返回pojo列表表示查询出来的结果集可能为多条session.selectList方法,mapper接口使用List<pojo>对象作为方法返回值。,pojohashmapmap的key,value为字resultType可以指定pojo将查询结果为pojo,但需要pojo的属性名和sql查询的列sqlpojoresultMap将字段名和属性名作一个对应关系,resultMap实质上还需要将查询结果到pojo对象中。resultMap可以实现将查询结果为复杂类型的pojo,比如在查询结果对象中包pojolist实现一对一查询和一对多查询。 mapper.xmlsqlUsers.javaresultMap:userListResultMapsqlUsers.java类属性对应起来<id/>:此属性表示查询结果集的唯一标识,非常重要。如果是多个字段为复合唯一约束则定义多个<id/>。 Column和property放在一块儿表示将sql查询出来的字段到指定的pojo类属性上<resultpojoMapperpublicList<User>findUserListResultMap()throws 传递pojo<selectid="findUserList"parameterType="user"resultType="user">select*fromuserwhere<iftest="id!=nullandid!=''">andid=#{id}<iftest="username!=nullandusername!=''">andusernamelike'%${username}%'sql<<selectid="findUserList"parameterType="user"resultType="user">select*fromuser<iftest="id!=nullandid!=''">andid=#{id}<iftest="username!=nullandusername!=''">andusernamelike'%${username}%'/>sqlList,mybatisforeachpojo传递idsqlSELECT*FROMUSERSWHEREusernameLIKE'%张%'AND(id=10ORid=89ORid=16)SELECT*FROMUSERSWHEREusernameLIKE'%张%' idIN(10,89,16)在pojo中定义list属性ids多个用户id,并添加getter/setter方<<iftest="ids!=nullandseparator=",">List<IntegerList<IntegeridsnewArrayList<Integer>();ids.add(10);//查询id为10的用户List<User>list=传递单个<select<selectid="selectUserByList"select*from传递List,List中是pojo<if<foreachcollection="list"item="item"open="andidMapperpublicList<User>selectUserByList(Listuserlist)throws PublicPublicvoidtestselectUserByList()throwsSqlSessionsession=UserMapperuserMapper=List<User>userlist=newArrayList<User>();Useruser=newUser();user=newUser();List<User>list=}传递单个数组(数组中是pojo<selectid="selectUserByArray"parameterType="Object[]"select*from<ifpojosqlpojo中的属性名。MapperpublicpublicList<User>selectUserByArray(Object[]userlist)throwsPublicPublicvoidtestselectUserByArray()throwsSqlSessionsession=UserMapperuserMapper=Object[]userlist=newObject[2];Useruser=newUser();user=newUser();List<User>list=}传递单个数组(数组中是字符串类型<selectid="selectUserByArray"parameterType="Object[]"select*from<if<foreachcollection="array"index="index"item="item"open="andidMapperpublicpublicList<User>selectUserByArray(Object[]userlist)throwsPublicPublicvoidtestselectUserByArray()throwsSqlSessionsession=UserMapperuserMapper=Object[]userlist=newObject[2];List<User>list=}SqlSql中可将重复的sql提取出来,使用时用include即可,最终达到sql重用的目的,如传递pojo<selectid="findUserList"parameterType="user"resultType="user">select*fromuser<iftest="id!=nullandid!=''">andid=#{id}<iftest="username!=nullandusername!=''">andusernamelike'%${username}%'where<<sql<iftest="id!=nullandid!=''">andid=#{id}<iftest="username!=nullandandandusernamelike使用include<<selectid="findUserList"parameterType="user"resultType="user">select*fromuser<include<includerefid="namespace.sql片段关联查一个用户可以创建多个一个用户可以创建多个—个订单只能由一个用—个订单包括多 id:items_id(外键)商 id:id(主键)通过订单明细表订单表和商品表建立关系一个订单对应一个商品对应订单表和商品表是多对多关一个明细对应一个Sql语句WHEREorders.user_id=popublicpublicclassOrdersCustomextendsOrdersprivateStringusername;/privateStringaddress;/OrdersCustomOrdersOrdersCustomOrders<select WHEREorders.user_id=Mapper接口publicpublicList<OrdersCustom>findOrdersList()throws测试PublicPublicvoidtestfindOrdersList()throwsSqlSessionsession=UserMapperuserMapper=List<OrdersCustom>list=userMapper.findOrdersList();}总结posql查询结果集所有的字段。此方法较为Sql语句WHEREorders.user_id=po在Orders类中加入User属性,user属性中用于关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象关联查询的用户信息。<<selectid="findOrdersListResultMap"resultMap="userordermap">WHEREorders.user_id=订单信息resultmap<resultMap.mybatis.po.Orders"id 订单信息resultmap<resultMap.mybatis.po.Orders"id <idproperty="id"<resultproperty="user_id"<resultproperty="number"<associationproperty="user" 这里的id为user的id,如果写上表示给user的id<idproperty="id"<resultproperty="username"<resultproperty="address"<idproperty="idcolumn="user_id"/>user_id/><resultproperty="usernamecolumn="username"/>username列对应username属性。Mapper接口publicpublicList<Orders>findOrdersListResultMap()throws测试PublicPublicvoidtestfindOrdersListResultMap()throwsSqlSessionsession=UserMapperuserMapper=List<Orders>list=}小结resultMapSqlWHEREorders.user_id=ANDorders.id=poOrdersUser<select<selectid="findOrdersDetailList"resultMap="userorderdetailmap">orderdetail.idorderdetail_id,FROMorders,user,orderdetailWHEREorders.user_id=user.idANDorders.id=<id<id<resultproperty="user_id"<resultproperty="number"<associationproperty="user" <idproperty="id"<resultproperty="username"<resultproperty="address"<collectionproperty="orderdetails" <idproperty="id"<resultproperty="items_id"<resultproperty="items_num"订单信息resultmap<resultMap .mybatis.po.Orders"resultMap相同,collection部分定义了查询订单明细信息。property="orderdetails":关联查询的结果集在cn.List中的对象类型。<id及<result/>resultMap使用继resultMapresultMap相同,这里使用继承<<resultMapid="userorderdetailmap"<collectionproperty="orderdetails" <idproperty="id"<resultproperty="items_id"<resultproperty="items_num"MapperpublicList<Orders>findOrdersDetailList()throws PublicPublicvoidtestfindOrdersDetailList()throwsSqlSessionsession=UserMapperuserMapper=List<Orders>List<Orders>list=userMapper.findOrdersDetailList();}查询用户的商品信需USER.username,USER.address,items_name,items.detailitems_detailorders.user_id=USERANDorders.id=orderdetail.orders_idANDorderdetail.items_id=items.idpo定在User中添加List<Orders>orders属性,在Orders类中加入List<Orderdetail>orderdetails属性订单:一个用户对应多个订单,使用collection到用户对象的订单列表属性中订单明细:一个订单对应多个明细,使用collection到订单对象中的明细属性中<resultMap <idcolumn="user_id"<resultcolumn="username"<collectionproperty="orders" <resultMap <idcolumn="user_id"<resultcolumn="username"<collectionproperty="orders" <idcolumn="id"<resultproperty="number"<collectionproperty="orderdetails" <idcolumn="orderdetail_id"<resultproperty="ordersId"<resultproperty="itemsId"<resultproperty="itemsNum"<associationproperty="items" <idcolumn="items_id"<resultcolumn="items_name"<resultcolumn="items_detail" 1:使用resultType将上边查询列到pojo输出使用resultMap将用户的商品明细列表到user对象中。resultMap将查询结果按照sql列名pojo属性名一致性到pojo中。 此时可直接使用resultType将每一条记录到pojo中端页面遍历lit

list使用association和collection完成一对一和一对多高级对结果有特殊的要求将关联查询信息到一个pojo对象中。为了方便查询关联信息可以使用association将关联订单信息为用户对象的pojo属使用resultType无法将查询结果到pojo对象的pojo属性中,根据对结果集查询遍resultTyperesultMap。将关联查询信息到一个list集合中。为了方便查询遍历关联信息可以使用collection将关联信息到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块到模块list中,将菜true|当设置为‘true’true|<settingname="lazyLoadingEnabled"<settingname="aggressiveLazyLoading"需Sql语句poOrdersUser<<selectid="findOrdersList3"resultMap="userordermap2">订单信息resultmap<resultMap .mybatis.po.Orders"<idproperty="id"<resultproperty="user_id"<resultproperty="number"<associationproperty="user" select="findUserById"Mapper接口publicList<Orders>findOrdersList3()throws 测试PublicPublicvoidtestfindOrdersList3()throwsSqlSessionsession=UserMapperuserMapper=List<Orders>list=userMapper.findOrdersList3();for(Ordersorders:list){}}mybatis提供的延迟加载功能是否可以实现延迟加载?1mapper2idmapper一对多延迟加载的方法同一对一延迟加载,在collection中配置select内容。resultMap支持延迟加载设置。sql,以提高数据库性能。可使用resultType或resultMap完成。查询缓mybatissqlSessionMybatisSqlSessionsqlSessionsqlsqlSessionsqlSession中的一级缓存也就不存在了。Mybatis默认开启一级缓存。sqlSessionnamespacesqlsql中传递参数也相同即最终执行sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存,第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。Mybatis默认没有开启二级缓存setting全局参数中配置开启二级缓存。idid1id1Mybatis缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来生成的java对象sqlSessioninsert、update、delete等操作commitSqlSessionsession=UserMapperuserMapper=Useruser1=Useruser2=SqlSessionsession=UserMapperuserMapper=Useruser1=userMapper.findUserById(1);Useruser_update=newUser(); Useruser2=UserMapper执行UserMapper 执行执行mapper划分。Mybatis缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来生成的java对象sqlSessioninsert、update、delete等操作commit在配置文件SqlMapConfig.xml中加<settingname="cacheEnabled"cache要在你的Mapper文件中添加一行:<cache/>,表示此mapper开启二级缓存二级缓存需要查询结果的pojo对象实现java.io.Serializable接口实现序列化和反序pojo都需要实现序列化接口。publicclassOrdersimplementsSerializablepublicclassUserimplementsSerializableSqlSessionsession1=sqlSessionFactory.openSession();UserMapperuserMapper=session1.getMapper(UserMapper.class);Useruser1=userMapper.findUserById(1);SqlSessionsession2=sqlSessionFactory.openSession();UserMapperuserMapper2=session2.getMapper(UserMapper.class);Useruser2=userMapper2.findUserById(1);statementuseCache=falseselect语句的二级缓存,即每次查询都会sqltruesql使用二级缓存。mappernamespaceinsert、update、delete操作数据后需要刷false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。MybatisCache1024。缓存对象的拷贝(通过序列化false。<cacheeviction="FIFO"flushInterval="60000"size="512"这个更高级的配置创建了一个FIFO缓存,60秒刷新,512个引可用的收回策略有,LRU:mybatisEhCacheJavaJava分布式缓存,HibernateCacheProvider。mybatisehcache原mybatis提供二级缓存CacheCachemybatis缓存数据通过其它缓存数据库整合,mybatis的特长ehcache、memcache、redis等。classpath下添加:ehcache.xml<<ehcache <diskStorepath="F:\develop\ehcache" defaultCacheCacheManager.add("demoCache")Cache时,EhCache便maxElementsInMemory-在内存中缓存的elementmaxElementsOnDisk-在磁盘上缓存的element0eternal-设定缓存的elements是否不过期。如果为true,则缓存的数据始终有效,falsetimeToIdleSeconds,timeToLiveSeconds判断overflowToDisk-设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上timeToIdleSeconds-当缓存在EhCache中的数据前后两次的时间超过timeToLiveSeconds-缓存element0.,也就是element存活时间diskSpoolBufferSizeMB这个参数设置DiskStore(磁盘缓存)的缓存区大小默认是30MB.每个Cache都应该有自己的一个缓冲区.diskPersistent-VM重启的时候是否启用磁盘保存EhCachefalse。diskExpiryThreadIntervalSeconds-120memoryStoreEvictionPolicyelementelementLRU(最近最少使用LFU(最不常使用)和第三步:开启ehcache缓<cache <cache<cachetype="org.mybatis.caches.ehcache.EhcacheCache"<propertyname="timeToIdleSeconds"<propertyname="timeToLiveSeconds"同ehcache参数maxElementsInMemory<propertyname="maxEntriesLocalHeap"同ehcache参数maxElementsOnDisk<propertyname="maxEntriesLocalDisk" <propertyname="memoryStoreEvictionPolicy"存技术降低数据库量,提高速度,业务场景比如:耗时较高的统计分析sql、sqlflushInterval30分钟、60分钟、24小时等,mybatis二级缓存对细粒度的数据级别的缓存实现不好,比如如下需求:对商品信息进果使用mybatis的二级缓存就无法实现当一个商品

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论