版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
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的原始方法(封裝)實現(xiàn)了查詢數(shù)據(jù)庫表記錄的操作jdbc23jdbcstatement對象4sql語句5sql語句中的參數(shù)(preparedStatement)6statementsql并獲取結(jié)果7sqljdbc2、Sql語句在代碼中硬編碼,造成代碼不易,實際應(yīng)用sql變化的可能較大,sql變動需要改變java代碼。3preparedStatementsqlwhere條件不一定,可能多也可能少,修改sql還要修改代碼,系統(tǒng)不易。,sqlpojo對象解析比較方便。MyBatisMyBatis本是apache的一個開源項目iBatis,2010年這個項目由apachesoftwarefoundation遷移到了code,并且改名為MyBatis,實質(zhì)上Mybatis對ibatis進(jìn)行一些只需要關(guān)注SQL本身,而不需要花費精力去處理例如驅(qū)動、創(chuàng)建connection、創(chuàng)建進(jìn)行生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結(jié)果成java對象并Mybatis1mybatisSqlMapConfig.mlmapper.xml文件即sql文件,文件中配置了操作數(shù)據(jù)庫的sql語句。此文件需要在SqlMapConfig.xml中加載。5MappedStatementmybatismybatissql信息等。mapper.xmlsqlMappedStatement對象,sqlid即Mappedstatementid。pojoExecutor通過MappedStatement在執(zhí)行sql前將輸入的java對象至sql中,輸入?yún)?shù)就jdbcpreparedStatement設(shè)置參數(shù)。pojoExecutorjdbc編程中對結(jié)果的解析處理過程。mybatismybaits的代碼 mysql先導(dǎo)入sql_table.sql,再導(dǎo)入sql_data.sqlMybatisidjavaeclipse創(chuàng)建java工程,jdk1.7.0_72jar加入mybatis包、依賴包、數(shù)據(jù)驅(qū)動包##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事務(wù)管理<transactionManagertype="JDBC"數(shù)據(jù)庫連接池<dataSource<propertyvalue=value="com.mysql.jdbc.Driver"<propertyname="url"tf-8"/><propertyname="username"value="root"<propertyname="password"value="mysql"第五步:poPublicPublicclassUserprivateintprivateStringusername;/privateStringprivateDatebirthday;/privateStringaddress;/查在classpath下的 下創(chuàng)建sql文件<?xml<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDMapper"" <mapper 根據(jù)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{創(chuàng)建數(shù)據(jù)庫會話實例sqlSession=查詢單個記錄,根據(jù)用戶idUseruser=
}catch(Exceptione){}finallyif(sqlSession!=null){}}}publicvoidtestFindUserByUsername()SqlSessionsqlSession=null;try{創(chuàng)建數(shù)據(jù)庫會話實例sqlSession=查詢單個記錄,根據(jù)用戶idList<User>list=sqlSession.selectList("test.findUserByUsernameList<User>list=sqlSession.selectList("test.findUserByUsername張");}catch(Exceptione){}finallyif(sqlSession!=null){}}}}#{}和#{}#{}preparedStatementjavajdbc類型轉(zhuǎn)換,#{}sql#{}pojo屬性值。parameterType傳輸單個簡單類型值,#{}value或其它名稱。${}sql串,通過${}parameterTypesql中且不進(jìn)行jdbc類resultType:指定輸出結(jié)果類型,mybatis將sql查詢結(jié)果的一行記錄數(shù)據(jù)為selectOneselectOneselectOne查詢多條記錄則拋出異常:(ornull)tobereturnedbyselectOne(),butfound:3添<insert<insertid="insertUser"<selectKeykeyProperty="id"order="AFTER"selectinsertintopublicvoidtestInsert()SqlSessionsqlSession=null;try{創(chuàng)建數(shù)據(jù)庫會話實例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實現(xiàn)主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}根據(jù)idpublicvoidtestDelete()SqlSessionsqlSession=null;try{創(chuàng)建數(shù)據(jù)庫會話實例sqlSession=}catch(Exceptione){}finallyif(sqlSession!=null){}}}修文<updateid="updateUser"updateuserwhere測試程publicvoidtestUpdate()SqlSessionsqlSession=null;try{創(chuàng)建數(shù)據(jù)庫會話實例sqlSession=Useruser=newUser(); }catch(Exceptione){}finallyif(sqlSession!=null){}}}Mybatisjdbc2、Sql語句寫在代碼中造成代碼不易,實際應(yīng)用sql變化的可能較大,sql變動需要改java代碼。解決:Sql語句配置在XXXXmapper.xml文件中與java3sqlsqlwhere條件不一定,可能多也可能少,占位符解決:Mybatis自動將java對象至sql語句,通過statement中的parameterType定4sql變化導(dǎo)致解析代碼變化,且解析前需要遍歷,如果能將數(shù)據(jù)庫pojo對象解析比較方便。解決:Mybatis自動將sql執(zhí)行結(jié)果至java對象,通過statement中的resultType定hibernateMybatishibernateORMMyBatis需要程序員自己編寫SqlmybatisXML或注解方式靈活配置要運行的sqljava對象和sql語句生成最終執(zhí)行的sql,最后將sql執(zhí)行的結(jié)果再生成java對象。的學(xué)習(xí)門檻高,要精通門檻更高,而且怎么設(shè)計O/R,在性能和對象模型之間如何權(quán)Hibernate需要具有很強的經(jīng)驗和能力才行。Dao開發(fā)方MybatisDaoDaoMapperidSqlSessionSqlSessionFactoryBuilderSqlSessionSqlSessionFactory生產(chǎn),所以可以SqlSessionFactory是一個接口,接口中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用范圍是整個應(yīng)用運行期間,一旦創(chuàng)建后可以重復(fù)使用,通常以SqlSessionFactory。SqlSession是一個面向用戶的接口,sqlSession中定義了數(shù)據(jù)庫操作,默認(rèn)使用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根據(jù)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數(shù)user=session.selectOne("test.findUserById",1);}}return}PublicvoidinsertUser(Useruser)throwsException{SqlSessionsqlSession=sqlSessionFactory.openSession();try{sqlSession.insert("insertUser",}}}}Dao Mapper動態(tài)方框架根據(jù)接口定義創(chuàng)建接口的動態(tài)對象,對象的方法體同上邊Dao接口實現(xiàn)類方2Mapper接口方法名和Mapper.xmlstatementid3Mappermapper.xmlsqlparameterType的4Mapper接口方法的輸出參數(shù)類型和mapper.xml中定義的每個sql的resultType的類型相定義mapper文件UserMapper.xml(內(nèi)容同Users.xml,需要修改namespace的值為UserMapper接口路徑。將UserMapper.xml放在classpath下mapper <?xml<?xmlversion="1.0"encoding="UTF-8"<!DOCTYPEPUBLIC"-////DTDMapper <mapper 根據(jù)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接口方法的輸入?yún)?shù)類型和mapper.xml中定義的statementparameterType的3Mapper接口方法的輸出參數(shù)類型和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動態(tài)對象調(diào)用sqlSession.selectOne()和sqlSession.selectList()是根據(jù)mapper接口方法的返mybatis推薦使用mapper方法開發(fā)mapper接口,程序員不用編寫mapper接口實現(xiàn)類,使用mapper方法時,輸入?yún)?shù)可以使用pojo包裝對象或map對象,保證daoSqlMapConfig.xml配置文SqlMapConfig.xml可以java屬性文件中的配置信息如下:classpathperties文件,<properties<properties<environments<environment<transactionManager<dataSource<propertyname="driver"<propertyname="url"<propertyname="username"<propertyname="password"MyBatis在properties元素體內(nèi)定義的屬性首先被然后會properties元素中resource或url加載的屬性,它會覆蓋已的同名屬parameterType傳遞的屬性具有最高優(yōu)先級,resourceurl加載的屬性次之,最低優(yōu)先級的是properties元素體內(nèi)定義的屬性。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文件中定義了操作數(shù)據(jù)庫的sql,每個sql是一個statement,文件是mybatis的。#{}與#{}prepareStatement中的預(yù)處理語句中設(shè)置參數(shù)值,sql語句中#{}表示一個占位根據(jù)id<selectid="findUserById"parameterType="int"resultType="user">select*fromuserwhereid=#{id}使用占位符#{}sql注入,在使用時不需要關(guān)心參數(shù)值的類型,mybatis會自動進(jìn)行java類型和jdbc#{}可以接收簡單類型值或pojoparameterType傳輸單個簡單類型值,#{}value或其它名稱。${}和#{}不同,通過${}parameterTypesqljdbc類型轉(zhuǎn)value。使用${}sql注入,但是有時用${}會非常方便,如下的例子:<selectid="selectUserByName"parameterType="string"select*fromuserwhereusernamelike如果采用${}sql中拼接為%mapper接口傳遞參數(shù)就方便很多。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根據(jù)根據(jù)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查詢出來的結(jié)果集為單條session.selectOne方法調(diào)用,mapperpojo對象作為方法返回值。,,返回pojo列表表示查詢出來的結(jié)果集可能為多條session.selectList方法,mapper接口使用List<pojo>對象作為方法返回值。,pojohashmapmap的key,value為字resultType可以指定pojo將查詢結(jié)果為pojo,但需要pojo的屬性名和sql查詢的列sqlpojoresultMap將字段名和屬性名作一個對應(yīng)關(guān)系,resultMap實質(zhì)上還需要將查詢結(jié)果到pojo對象中。resultMap可以實現(xiàn)將查詢結(jié)果為復(fù)雜類型的pojo,比如在查詢結(jié)果對象中包pojolist實現(xiàn)一對一查詢和一對多查詢。 mapper.xmlsqlUsers.javaresultMap:userListResultMapsqlUsers.java類屬性對應(yīng)起來<id/>:此屬性表示查詢結(jié)果集的唯一標(biāo)識,非常重要。如果是多個字段為復(fù)合唯一約束則定義多個<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=}傳遞單個數(shù)組(數(shù)組中是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=}傳遞單個數(shù)組(數(shù)組中是字符串類型<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中可將重復(fù)的sql提取出來,使用時用include即可,最終達(dá)到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片段關(guān)聯(lián)查一個用戶可以創(chuàng)建多個一個用戶可以創(chuàng)建多個—個訂單只能由一個用—個訂單包括多 id:items_id(外鍵)商 id:id(主鍵)通過訂單明細(xì)表訂單表和商品表建立關(guān)系一個訂單對應(yīng)一個商品對應(yīng)訂單表和商品表是多對多關(guān)一個明細(xì)對應(yīng)一個Sql語句WHEREorders.user_id=popublicpublicclassOrdersCustomextendsOrdersprivateStringusername;/privateStringaddress;/OrdersCustomOrdersOrdersCustomOrders<select WHEREorders.user_id=Mapper接口publicpublicList<OrdersCustom>findOrdersList()throws測試PublicPublicvoidtestfindOrdersList()throwsSqlSessionsession=UserMapperuserMapper=List<OrdersCustom>list=userMapper.findOrdersList();}總結(jié)posql查詢結(jié)果集所有的字段。此方法較為Sql語句WHEREorders.user_id=po在Orders類中加入User屬性,user屬性中用于關(guān)聯(lián)查詢的用戶信息,因為訂單關(guān)聯(lián)查詢用戶是一對一關(guān)系,所以這里使用單個User對象關(guān)聯(lián)查詢的用戶信息。<<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列對應(yīng)username屬性。Mapper接口publicpublicList<Orders>findOrdersListResultMap()throws測試PublicPublicvoidtestfindOrdersListResultMap()throwsSqlSessionsession=UserMapperuserMapper=List<Orders>list=}小結(jié)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部分定義了查詢訂單明細(xì)信息。property="orderdetails":關(guān)聯(lián)查詢的結(jié)果集在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屬性訂單:一個用戶對應(yīng)多個訂單,使用collection到用戶對象的訂單列表屬性中訂單明細(xì):一個訂單對應(yīng)多個明細(xì),使用collection到訂單對象中的明細(xì)屬性中<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將用戶的商品明細(xì)列表到user對象中。resultMap將查詢結(jié)果按照sql列名pojo屬性名一致性到pojo中。 此時可直接使用resultType將每一條記錄到pojo中端頁面遍歷lit
list使用association和collection完成一對一和一對多高級對結(jié)果有特殊的要求將關(guān)聯(lián)查詢信息到一個pojo對象中。為了方便查詢關(guān)聯(lián)信息可以使用association將關(guān)聯(lián)訂單信息為用戶對象的pojo屬使用resultType無法將查詢結(jié)果到pojo對象的pojo屬性中,根據(jù)對結(jié)果集查詢遍resultTyperesultMap。將關(guān)聯(lián)查詢信息到一個list集合中。為了方便查詢遍歷關(guān)聯(lián)信息可以使用collection將關(guān)聯(lián)信息到list集合中,比如:查詢用戶權(quán)限范圍模塊及模塊下的菜單,可使用collection將模塊到模塊list中,將菜true|當(dāng)設(shè)置為‘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提供的延遲加載功能是否可以實現(xiàn)延遲加載?1mapper2idmapper一對多延遲加載的方法同一對一延遲加載,在collection中配置select內(nèi)容。resultMap支持延遲加載設(shè)置。sql,以提高數(shù)據(jù)庫性能??墒褂胷esultType或resultMap完成。查詢緩mybatissqlSessionMybatisSqlSessionsqlSessionsqlsqlSessionsqlSession中的一級緩存也就不存在了。Mybatis默認(rèn)開啟一級緩存。sqlSessionnamespacesqlsql中傳遞參數(shù)也相同即最終執(zhí)行sql語句,第一次執(zhí)行完畢會將數(shù)據(jù)庫中查詢的數(shù)據(jù)寫到緩存(內(nèi)存,第二次會從緩存中獲取數(shù)據(jù)將不再從數(shù)據(jù)庫查詢,從而提高查詢效率。Mybatis默認(rèn)沒有開啟二級緩存setting全局參數(shù)中配置開啟二級緩存。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執(zhí)行UserMapper 執(zhí)行執(zhí)行mapper劃分。Mybatis緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來生成的java對象sqlSessioninsert、update、delete等操作commit在配置文件SqlMapConfig.xml中加<settingname="cacheEnabled"cache要在你的Mapper文件中添加一行:<cache/>,表示此mapper開啟二級緩存二級緩存需要查詢結(jié)果的pojo對象實現(xiàn)java.io.Serializable接口實現(xiàn)序列化和反序pojo都需要實現(xiàn)序列化接口。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操作數(shù)據(jù)后需要刷false則不會刷新。使用緩存時如果手動修改數(shù)據(jù)庫表中的查詢數(shù)據(jù)會出現(xiàn)臟讀。MybatisCache1024。緩存對象的拷貝(通過序列化false。<cacheeviction="FIFO"flushInterval="60000"size="512"這個更高級的配置創(chuàng)建了一個FIFO緩存,60秒刷新,512個引可用的收回策略有,LRU:mybatisEhCacheJavaJava分布式緩存,HibernateCacheProvider。mybatisehcache原mybatis提供二級緩存CacheCachemybatis緩存數(shù)據(jù)通過其它緩存數(shù)據(jù)庫整合,mybatis的特長ehcache、memcache、redis等。classpath下添加:ehcache.xml<<ehcache <diskStorepath="F:\develop\ehcache" defaultCacheCacheManager.add("demoCache")Cache時,EhCache便maxElementsInMemory-在內(nèi)存中緩存的elementmaxElementsOnDisk-在磁盤上緩存的element0eternal-設(shè)定緩存的elements是否不過期。如果為true,則緩存的數(shù)據(jù)始終有效,falsetimeToIdleSeconds,timeToLiveSeconds判斷overflowToDisk-設(shè)定當(dāng)內(nèi)存緩存溢出的時候是否將過期的element緩存到磁盤上timeToIdleSeconds-當(dāng)緩存在EhCache中的數(shù)據(jù)前后兩次的時間超過timeToLiveSeconds-緩存element0.,也就是element存活時間diskSpoolBufferSizeMB這個參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小默認(rèn)是30MB.每個Cache都應(yīng)該有自己的一個緩沖區(qū).diskPersistent-VM重啟的時候是否啟用磁盤保存EhCachefalse。diskExpiryThreadIntervalSeconds-120memoryStoreEvictionPolicyelementelementLRU(最近最少使用LFU(最不常使用)和第三步:開啟ehcache緩<cache <cache<cachetype="org.mybatis.caches.ehcache.EhcacheCache"<propertyname="timeToIdleSeconds"<propertyname="timeToLiveSeconds"同ehcache參數(shù)maxElementsInMemory<propertyname="maxEntriesLocalHeap"同ehcache參數(shù)maxElementsOnDisk<propertyname="maxEntriesLocalDisk" <propertyname="memoryStoreEvictionPolicy"存技術(shù)降低數(shù)據(jù)庫量,提高速度,業(yè)務(wù)場景比如:耗時較高的統(tǒng)計分析sql、sqlflushInterval30分鐘、60分鐘、24小時等,mybatis二級緩存對細(xì)粒度的數(shù)據(jù)級別的緩存實現(xiàn)不好,比如如下需求:對商品信息進(jìn)果使用mybatis的二級緩存就無法實現(xiàn)當(dāng)一個商品
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【全程復(fù)習(xí)方略】2021屆高考地理二輪專題突破篇-課時沖關(guān)練(二)-專題一-1.1.2地球的運動規(guī)律
- 天津市濱海新區(qū)2024-2025學(xué)年高二上學(xué)期期末檢測數(shù)學(xué)試題
- 陜西省渭南市尚德中學(xué)2024-2025學(xué)年高一上學(xué)期第二次階段性數(shù)學(xué)試卷(含答案)
- 山東省臨沂華盛實驗學(xué)校2024-2025學(xué)年上學(xué)期九年級物理期末質(zhì)量調(diào)研試題(二)(含答案)
- 《從因特網(wǎng)獲取信息》課件
- 探索六年級語文教學(xué)新路:經(jīng)驗與啟示
- 英語字母音標(biāo)課件
- 安徽省蕪湖市2024-2025學(xué)年第一學(xué)期期末考試七年級語文試卷(含答案)
- 【走向高考】2022屆高三物理人教版一輪復(fù)習(xí)習(xí)題:第8章-第1講磁場對電流的作用
- 三年級數(shù)學(xué)計算題專項練習(xí)匯編及答案
- DB23-T 3840-2024非煤礦山隱蔽致災(zāi)因素普查治理工作指南
- 機關(guān)事業(yè)單位財務(wù)管理制度(六篇)
- 2025禮品定制合同范本
- 醫(yī)院消毒隔離制度范文(2篇)
- 2024年01月11026經(jīng)濟學(xué)(本)期末試題答案
- 烘干煤泥合同范例
- 人教版六年級上冊數(shù)學(xué)第八單元數(shù)學(xué)廣角數(shù)與形單元試題含答案
- 2025年“三基”培訓(xùn)計劃
- 第20課 北洋軍閥統(tǒng)治時期的政治、經(jīng)濟與文化 教案
- 叉車租賃合同模板
- 住房公積金稽核審計工作方案例文(4篇)
評論
0/150
提交評論