mybatis教程從入門到精通_第1頁(yè)
mybatis教程從入門到精通_第2頁(yè)
mybatis教程從入門到精通_第3頁(yè)
mybatis教程從入門到精通_第4頁(yè)
mybatis教程從入門到精通_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

mybatis教程從入門到精通什么是mybatisMyBatis是支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis使用簡(jiǎn)單的XML或注解用于配置和原始映射,將接口和Java的POJOs(PlanOldJavaObjects,普通的Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄.orm工具的基本思想無(wú)論是用過(guò)的hibernate,mybatis,你都可以法相他們有一個(gè)共同點(diǎn):1.從配置文件(通常是XML配置文件中)得到sessionfactory.2.由sessionfactory產(chǎn)生session3.在session中完成對(duì)數(shù)據(jù)的增刪改查和事務(wù)提交等.4.在用完之后關(guān)閉session。5.在java對(duì)象和數(shù)據(jù)庫(kù)之間有做mapping的配置文件,也通常是xml文件。mybatis實(shí)戰(zhàn)教程(mybatisinaction)之一:開(kāi)發(fā)環(huán)境搭建mybatis的開(kāi)發(fā)環(huán)境搭建,選擇:eclipsej2ee版本,mysql5.1,jdk1.7,mybatis3.2.0.jar包。這些軟件工具均可以到各自的官方網(wǎng)站上下載。首先建立一個(gè)名字為MyBaits的dynamicwebproject1.現(xiàn)階段,你可以直接建立java工程,但一般都是開(kāi)發(fā)web項(xiàng)目,這個(gè)系列教程最后也是web的,所以一開(kāi)始就建立web工程。2.將mybatis-3.2.0-SNAPSHOT.jar,mysql-connector-java-5.1.22-bin.jar拷貝到web工程的lib目錄.3.創(chuàng)建mysql測(cè)試數(shù)據(jù)庫(kù)和用戶表,注意,這里采用的是utf-8編碼創(chuàng)建用戶表,并插入一條測(cè)試數(shù)據(jù)程序代碼程序代碼CreateTABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`userName`varchar(50)DEFAULTNULL,`userAge`int(11)DEFAULTNULL,`userAddress`varchar(200)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;InsertINTO`user`VALUES('1','summer','100','shanghai,pudong');到此為止,前期準(zhǔn)備工作就完成了。下面開(kāi)始真正配置mybatis項(xiàng)目了。1.在MyBatis里面創(chuàng)建兩個(gè)源碼目錄,分別為src_user,test_src,用如下方式建立,鼠標(biāo)右鍵點(diǎn)擊JavaResource.2.設(shè)置mybatis配置文件:Configuration.xml,在src_user目錄下建立此文件,內(nèi)容如下:程序代碼程序代碼<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-////DTDConfig3.0//EN""/dtd/mybatis-3-config.dtd"><configuration><typeAliases><typeAliasalias="User"type="com.yihaomen.mybatis.model.User"/></typeAliases><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"/><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://:3306/mybatis"/><propertyname="username"value="root"/><propertyname="password"value="password"/></dataSource></environment></environments><mappers><mapperresource="com/yihaomen/mybatis/model/User.xml"/></mappers></configuration>3.建立與數(shù)據(jù)庫(kù)對(duì)應(yīng)的javaclass,以及映射文件.在src_user下建立package:com.yihaomen.mybatis.model,并在這個(gè)package下建立User類:程序代碼程序代碼packagecom.yihaomen.mybatis.model;publicclassUser{privateintid;privateStringuserName;privateStringuserAge;privateStringuserAddress;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetUserName(){returnuserName;}publicvoidsetUserName(StringuserName){this.userName=userName;}publicStringgetUserAge(){returnuserAge;}publicvoidsetUserAge(StringuserAge){this.userAge=userAge;}publicStringgetUserAddress(){returnuserAddress;}publicvoidsetUserAddress(StringuserAddress){this.userAddress=userAddress;}}同時(shí)建立這個(gè)User的映射文件User.xml:程序代碼程序代碼<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-////DTDMapper3.0//EN""/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.yihaomen.mybatis.models.UserMapper"><selectid="selectUserByID"parameterType="int"resultType="User">select*from`user`whereid=#{id}</select></mapper>下面對(duì)這幾個(gè)配置文件解釋下:1.Configuration.xml是mybatis用來(lái)建立sessionFactory用的,里面主要包含了數(shù)據(jù)庫(kù)連接相關(guān)東西,還有java類所對(duì)應(yīng)的別名,比如<typeAliasalias="User"type="com.yihaomen.mybatis.model.User"/>這個(gè)別名非常重要,你在具體的類的映射中,比如User.xml中resultType就是對(duì)應(yīng)這里的。要保持一致,當(dāng)然這里的resultType還有另外單獨(dú)的定義方式,后面再說(shuō)。2.Configuration.xml里面的<mapperresource="com/yihaomen/mybatis/model/User.xml"/>是包含要映射的類的xml配置文件。3.在User.xml文件里面主要是定義各種SQL語(yǔ)句,以及這些語(yǔ)句的參數(shù),以及要返回的類型等.開(kāi)始測(cè)試在test_src源碼目錄下建立com.yihaomen.test這個(gè)package,并建立測(cè)試類Test:程序代碼程序代碼packagecom.yihaomen.test;importjava.io.Reader;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importcom.yihaomen.mybatis.model.User;publicclassTest{privatestaticSqlSessionFactorysqlSessionFactory;privatestaticReaderreader;static{try{reader=Resources.getResourceAsReader("Configuration.xml");sqlSessionFactory=newSqlSessionFactoryBuilder().build(reader);}catch(Exceptione){e.printStackTrace();}}publicstaticSqlSessionFactorygetSession(){returnsqlSessionFactory;}publicstaticvoidmain(String[]args){SqlSessionsession=sqlSessionFactory.openSession();try{Useruser=(User)session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID",1);System.out.println(user.getUserAddress());System.out.println(user.getUserName());}finally{session.close();}}}現(xiàn)在運(yùn)行這個(gè)程序,是不是得到查詢結(jié)果了。恭喜你,環(huán)境搭建配置成功,接下來(lái)第二章,將講述基于接口的操作方式,增刪改查。整個(gè)工程目錄結(jié)構(gòu)如下:除非申明,文章均為一號(hào)門原創(chuàng),轉(zhuǎn)載請(qǐng)注明本文地址,謝謝!mybatis實(shí)戰(zhàn)教程(mybatisinaction)之二:以接口的方式編程前面一章,已經(jīng)搭建好了eclipse,mybatis,mysql的環(huán)境,并且實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的查詢。請(qǐng)注意,這種方式是用SqlSession實(shí)例來(lái)直接執(zhí)行已映射的SQL語(yǔ)句:session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID",1)其實(shí)還有更簡(jiǎn)單的方法,而且是更好的方法,使用合理描述參數(shù)和SQL語(yǔ)句返回值的接口(比如IUserOperation.class),這樣現(xiàn)在就可以至此那個(gè)更簡(jiǎn)單,更安全的代碼,沒(méi)有容易發(fā)生的字符串文字和轉(zhuǎn)換的錯(cuò)誤.下面是詳細(xì)過(guò)程:在src_user源碼目錄下建立er這個(gè)包,并建立接口類IUserOperation,內(nèi)容如下:程序代碼程序代碼packageer;importcom.yihaomen.mybatis.model.User;publicinterfaceIUserOperation{publicUserselectUserByID(intid);}請(qǐng)注意,這里面有一個(gè)方法名selectUserByID必須與User.xml里面配置的select的id對(duì)應(yīng)(<selectid="selectUserByID")重寫測(cè)試代碼程序代碼程序代碼publicstaticvoidmain(String[]args){SqlSessionsession=sqlSessionFactory.openSession();try{IUserOperationuserOperation=session.getMapper(IUserOperation.class);Useruser=userOperation.selectUserByID(1);System.out.println(user.getUserAddress());System.out.println(user.getUserName());}finally{session.close();}}整個(gè)工程結(jié)構(gòu)圖現(xiàn)在如下:運(yùn)行這個(gè)測(cè)試程序,就可以看到結(jié)果了。除非申明,文章均為一號(hào)門原創(chuàng),轉(zhuǎn)載請(qǐng)注明本文地址,謝謝!mybatis實(shí)戰(zhàn)教程(mybatisinaction)之三:實(shí)現(xiàn)數(shù)據(jù)的增刪改查前面已經(jīng)講到用接口的方式編程。這種方式,要注意的一個(gè)地方就是。在User.xml的配置文件中,mappernamespace="er.IUserOperation",命名空間非常重要,不能有錯(cuò),必須與我們定義的package和接口一致。如果不一致就會(huì)出錯(cuò),這一章主要在上一講基于接口編程的基礎(chǔ)上完成如下事情:1.用mybatis查詢數(shù)據(jù),包括列表2.用mybatis增加數(shù)據(jù)3.用mybatis更新數(shù)據(jù).4.用mybatis刪除數(shù)據(jù).查詢數(shù)據(jù),前面已經(jīng)講過(guò)簡(jiǎn)單的,主要看查詢出列表的查詢出列表,也就是返回list,在我們這個(gè)例子中也就是List<User>,這種方式返回?cái)?shù)據(jù),需要在User.xml里面配置返回的類型resultMap,注意不是resultType,而這個(gè)resultMap所對(duì)應(yīng)的應(yīng)該是我們自己配置的程序代碼程序代碼<!--為了返回list類型而定義的returnMap--><resultMaptype="User"id="resultListUser"><idcolumn="id"property="id"/><resultcolumn="userName"property="userName"/><resultcolumn="userAge"property="userAge"/><resultcolumn="userAddress"property="userAddress"/></resultMap>查詢列表的語(yǔ)句在User.xml中程序代碼程序代碼<!--返回list的select語(yǔ)句,注意resultMap的值是指向前面定義好的--><selectid="selectUsers"parameterType="string"resultMap="resultListUser">select*fromuserwhereuserNamelike#{userName}</select>在IUserOperation接口中增加方法:publicList<User>selectUsers(StringuserName);現(xiàn)在在Test類中做測(cè)試程序代碼程序代碼publicvoidgetUserList(StringuserName){SqlSessionsession=sqlSessionFactory.openSession();try{IUserOperationuserOperation=session.getMapper(IUserOperation.class);List<User>users=userOperation.selectUsers(userName);for(Useruser:users){System.out.println(user.getId()+":"+user.getUserName()+":"+user.getUserAddress());}}finally{session.close();}}現(xiàn)在在main方法中可以測(cè)試:程序代碼程序代碼publicstaticvoidmain(String[]args){TesttestUser=newTest();testUser.getUserList("%");}可以看到,結(jié)果成功查詢出來(lái)。如果是查詢單個(gè)數(shù)據(jù)的話,用第二講用過(guò)的方法就可以了。用mybatis增加數(shù)據(jù)在IUserOperation接口中增加方法:publicvoidaddUser(Useruser);在User.xml中配置程序代碼程序代碼<!--執(zhí)行增加操作的SQL語(yǔ)句。id和parameterType分別與IUserOperation接口中的addUser方法的名字和參數(shù)類型一致。以#{name}的形式引用Student參數(shù)的name屬性,MyBatis將使用反射讀取Student參數(shù)的此屬性。#{name}中name大小寫敏感。引用其他的gender等屬性與此一致。seGeneratedKeys設(shè)置為"true"表明要MyBatis獲取由數(shù)據(jù)庫(kù)自動(dòng)生成的主鍵;keyProperty="id"指定把獲取到的主鍵值注入到Student的id屬性--><insertid="addUser"parameterType="User"useGeneratedKeys="true"keyProperty="id">insertintouser(userName,userAge,userAddress)values(#{userName},#{userAge},#{userAddress})</insert>然后在Test中寫測(cè)試方法:程序代碼程序代碼/***測(cè)試增加,增加后,必須提交事務(wù),否則不會(huì)寫入到數(shù)據(jù)庫(kù).*/publicvoidaddUser(){Useruser=newUser();user.setUserAddress("人民廣場(chǎng)");user.setUserName("飛鳥(niǎo)");user.setUserAge(80);SqlSessionsession=sqlSessionFactory.openSession();try{IUserOperationuserOperation=session.getMapper(IUserOperation.class);userOperation.addUser(user);mit();System.out.println("當(dāng)前增加的用戶id為:"+user.getId());}finally{session.close();}}用mybatis更新數(shù)據(jù)方法類似,先在IUserOperation中增加方法:publicvoidaddUser(Useruser);然后配置User.xml程序代碼程序代碼<updateid="updateUser"parameterType="User">updateusersetuserName=#{userName},userAge=#{userAge},userAddress=#{userAddress}whereid=#{id}</update>Test類總的測(cè)試方法如下:程序代碼程序代碼publicvoidupdateUser(){//先得到用戶,然后修改,提交。SqlSessionsession=sqlSessionFactory.openSession();try{IUserOperationuserOperation=session.getMapper(IUserOperation.class);Useruser=userOperation.selectUserByID(4);user.setUserAddress("原來(lái)是魔都的浦東創(chuàng)新園區(qū)");userOperation.updateUser(user);mit();}finally{session.close();}}用mybatis刪除數(shù)據(jù)同理,IUserOperation增加方法:publicvoiddeleteUser(intid);配置User.xml程序代碼程序代碼<deleteid="deleteUser"parameterType="int">deletefromuserwhereid=#{id}</delete>然后在Test類中寫測(cè)試方法:程序代碼程序代碼/***刪除數(shù)據(jù),刪除一定要commit.*@paramid*/publicvoiddeleteUser(intid){SqlSessionsession=sqlSessionFactory.openSession();try{IUserOperationuserOperation=session.getMapper(IUserOperation.class);userOperation.deleteUser(id);mit();}finally{session.close();}}這樣,所有增刪改查都完成了,注意在增加,更改,刪除的時(shí)候要調(diào)用mit(),這樣才會(huì)真正對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,否則是沒(méi)有提交的。到此為止,簡(jiǎn)單的單表操作,應(yīng)該都會(huì)了,接下來(lái)的時(shí)間了,我會(huì)講多表聯(lián)合查詢,以及結(jié)果集的選取。除非申明,文章均為一號(hào)門原創(chuàng),轉(zhuǎn)載請(qǐng)注明本文地址,謝謝!mybatis實(shí)戰(zhàn)教程(mybatisinaction)之四:實(shí)現(xiàn)關(guān)聯(lián)數(shù)據(jù)的查詢有了前面幾章的基礎(chǔ),對(duì)一些簡(jiǎn)單的應(yīng)用是可以處理的,但在實(shí)際項(xiàng)目中,經(jīng)常是關(guān)聯(lián)表的查詢,比如最常見(jiàn)到的多對(duì)一,一對(duì)多等。這些查詢是如何處理的呢,這一講就講這個(gè)問(wèn)題。我們首先創(chuàng)建一個(gè)Article這個(gè)表,并初始化數(shù)據(jù).程序代碼程序代碼DropTABLEIFEXISTS`article`;CreateTABLE`article`(`id`int(11)NOTNULLauto_increment,`userid`int(11)NOTNULL,`title`varchar(100)NOTNULL,`content`textNOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=5DEFAULTCHARSET=utf8;--添加幾條測(cè)試數(shù)據(jù)--InsertINTO`article`VALUES('1','1','test_title','test_content');InsertINTO`article`VALUES('2','1','test_title_2','test_content_2');InsertINTO`article`VALUES('3','1','test_title_3','test_content_3');InsertINTO`article`VALUES('4','1','test_title_4','test_content_4');你應(yīng)該發(fā)現(xiàn)了,這幾個(gè)文章對(duì)應(yīng)的userid都是1,所以需要用戶表user里面有id=1的數(shù)據(jù)??梢孕薷某蓾M足自己條件的數(shù)據(jù).按照orm的規(guī)則,表已經(jīng)創(chuàng)建了,那么肯定需要一個(gè)對(duì)象與之對(duì)應(yīng),所以我們?cè)黾右粋€(gè)Article的class程序代碼程序代碼packagecom.yihaomen.mybatis.model;publicclassArticle{privateintid;privateUseruser;privateStringtitle;privateStringcontent;publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicUsergetUser(){returnuser;}publicvoidsetUser(Useruser){this.user=user;}publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringtitle){this.title=title;}publicStringgetContent(){returncontent;}publicvoidsetContent(Stringcontent){this.content=content;}}注意一下,文章的用戶是怎么定義的,是直接定義的一個(gè)User對(duì)象。而不是int類型。多對(duì)一的實(shí)現(xiàn)場(chǎng)景:在讀取某個(gè)用戶發(fā)表的所有文章。當(dāng)然還是需要在User.xml里面配置select語(yǔ)句,但重點(diǎn)是這個(gè)select的resultMap對(duì)應(yīng)什么樣的數(shù)據(jù)呢。這是重點(diǎn),這里要引入association看定義如下:程序代碼程序代碼<!--User聯(lián)合文章進(jìn)行查詢方法之一的配置(多對(duì)一的方式)--><resultMapid="resultUserArticleList"type="Article"><idproperty="id"column="aid"/><resultproperty="title"column="title"/><resultproperty="content"column="content"/><associationproperty="user"javaType="User"><idproperty="id"column="id"/><resultproperty="userName"column="userName"/><resultproperty="userAddress"column="userAddress"/></association></resultMap><selectid="getUserArticles"parameterType="int"resultMap="resultUserArticleList">selectuser.id,user.userName,user.userAddress,article.idaid,article.title,article.contentfromuser,articlewhereuser.id=article.useridanduser.id=#{id}</select>這樣配置之后,就可以了,將select語(yǔ)句與resultMap對(duì)應(yīng)的映射結(jié)合起來(lái)看,就明白了。用association來(lái)得到關(guān)聯(lián)的用戶,這是多對(duì)一的情況,因?yàn)樗械奈恼露际峭粋€(gè)用戶的。還有另外一種處理方式,可以復(fù)用我們前面已經(jīng)定義好的resultMap,前面我們定義過(guò)一個(gè)resultListUser,看這第二種方法如何實(shí)現(xiàn):程序代碼程序代碼<resultMaptype="User"id="resultListUser"><idcolumn="id"property="id"/><resultcolumn="userName"property="userName"/><resultcolumn="userAge"property="userAge"/><resultcolumn="userAddress"property="userAddress"/></resultMap><!--User聯(lián)合文章進(jìn)行查詢方法之二的配置(多對(duì)一的方式)--><resultMapid="resultUserArticleList-2"type="Article"><idproperty="id"column="aid"/><resultproperty="title"column="title"/><resultproperty="content"column="content"/><associationproperty="user"javaType="User"resultMap="resultListUser"/></resultMap><selectid="getUserArticles"parameterType="int"resultMap="resultUserArticleList">selectuser.id,user.userName,user.userAddress,article.idaid,article.title,article.contentfromuser,articlewhereuser.id=article.useridanduser.id=#{id}</select>將association中對(duì)應(yīng)的映射獨(dú)立抽取出來(lái),可以達(dá)到復(fù)用的目的。好了,現(xiàn)在在Test類中寫測(cè)試代碼:程序代碼程序代碼publicvoidgetUserArticles(intuserid){SqlSessionsession=sqlSessionFactory.openSession();try{IUserOperationuserOperation=session.getMapper(IUserOperation.class);List<Article>articles=userOperation.getUserArticles(userid);for(Articlearticle:articles){System.out.println(article.getTitle()+":"+article.getContent()+":作者是:"+article.getUser().getUserName()+":地址:"+article.getUser().getUserAddress());}}finally{session.close();}}漏掉了一點(diǎn),我們一定要在IUserOperation接口中,加入select對(duì)應(yīng)的id名稱相同的方法:publicList<Article>getUserArticles(intid);然后運(yùn)行就可以測(cè)試。整個(gè)程序下載:下載文件點(diǎn)擊下載此文件除非申明,文章均為一號(hào)門原創(chuàng),轉(zhuǎn)載請(qǐng)注明本文地址,謝謝!mybatis實(shí)戰(zhàn)教程(mybatisinaction)之五:與spring3集成(附源碼)在這一系列文章中,前面講到純粹用mybatis連接數(shù)據(jù)庫(kù),然后進(jìn)行增刪改查,以及多表聯(lián)合查詢的的例子,但實(shí)際項(xiàng)目中,通常會(huì)用spring這個(gè)沾合劑來(lái)管理datasource等。充分利用spring基于接口的編程,以及aop,ioc帶來(lái)的方便。用spring來(lái)管理mybatis與管理hibernate有很多類似的地方。今天的重點(diǎn)就是數(shù)據(jù)源管理以及bean的配置。你可以下載源碼后,對(duì)比著看,源代碼沒(méi)有帶jar包,太大了,空間有限.有截圖,你可以看到用到哪些jar包,源碼在本文最后.1.首先對(duì)前面的工程結(jié)構(gòu)做一點(diǎn)改變,在src_user源代碼目錄下建立文件夾config,并將原來(lái)的mybatis配置文件Configuration.xml移動(dòng)到這個(gè)文件夾中,并在config文家?jiàn)A中建立spring配置文件:applicationContext.xml,這個(gè)配置文件里最主要的配置:程序代碼程序代碼<!--本示例采用DBCP連接池,應(yīng)預(yù)先把DBCP的jar包復(fù)制到工程的lib目錄下。--><beanid="dataSource"class="mons.dbcp.BasicDataSource"><propertyname="driverClassName"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://:3306/mybatis?characterEncoding=utf8"/><propertyname="username"value="root"/><propertyname="password"value="password"/></bean><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><!--dataSource屬性指定要用到的連接池--><propertyname="dataSource"ref="dataSource"/><!--configLocation屬性指定mybatis的核心配置文件--><propertyname="configLocation"value="config/Configuration.xml"/></bean><beanid="userMapper"class="org.mybatis.spring.mapper.MapperFactoryBean"><!--sqlSessionFactory屬性指定要用到的SqlSessionFactory實(shí)例--><propertyname="sqlSessionFactory"ref="sqlSessionFactory"/><!--mapperInterface屬性指定映射器接口,用于實(shí)現(xiàn)此接口并生成映射器對(duì)象--><propertyname="mapperInterface"value="er.IUserOperation"/></bean>[b]這里面的重點(diǎn)就是org.mybatis.spring.SqlSessionFactoryBean與org.mybatis.spring.mapper.MapperFactoryBean[b]實(shí)現(xiàn)了spring的接口,并產(chǎn)生對(duì)象。詳細(xì)可以查看mybatis-spring代碼。(/p/mybatis/),如果僅僅使用,固定模式,這樣配置就好。然后寫測(cè)試程序程序代碼程序代碼packagecom.yihaomen.test;importjava.util.List;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importer.IUserOperation;importcom.yihaomen.mybatis.model.Article;importcom.yihaomen.mybatis.model.User;publicclassMybatisSprintTest{privatestaticApplicationContextctx;static{ctx=newClassPathXmlApplicationContext("config/applicationContext.xml");}publicstaticvoidmain(String[]args){IUserOperationmapper=(IUserOperation)ctx.getBean("userMapper");//測(cè)試id=1的用戶查詢,根據(jù)數(shù)據(jù)庫(kù)中的情況,可以改成你自己的.System.out.println("得到用戶id=1的用戶信息");Useruser=mapper.selectUserByID(1);System.out.println(user.getUserAddress());//得到文章列表測(cè)試System.out.println("得到用戶id為1的所有文章列表");List<Article>articles=mapper.getUserArticles(1);for(Articlearticle:articles){System.out.println(article.getContent()+"--"+article.getTitle());}}}mybatis實(shí)戰(zhàn)教程(mybatisinaction)之六:與SpringMVC的集成前面幾篇文章已經(jīng)講到了mybatis與spring的集成。但這個(gè)時(shí)候,所有的工程還不是web工程,雖然我一直是創(chuàng)建的web工程。今天將直接用mybatis與Springmvc的方式集成起來(lái),源碼在本文結(jié)尾處下載.主要有以下幾個(gè)方面的配置1.web.xml配置springdispatchservlet,比如為:mvc-dispatcher2.mvc-dispatcher-servlet.xml文件配置3.springapplicationContext.XML文件配置(與數(shù)據(jù)庫(kù)相關(guān),與mybatissqlSessionFaction整合,掃描所有mybatismapper文件等.)4.編寫controller類5.編寫頁(yè)面代碼.[/code]1.web.xml配置springdispatchservlet,比如為:mvc-dispatcher程序代碼程序代碼<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:config/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><listener><listener-class>org.springframework.web.context.ContextCleanupListener</listener-class></listener><servlet><servlet-name>mvc-dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>mvc-dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>2.在web.xml同目錄下配置mvc-dispatcher-servlet.xml文件,這個(gè)文件名前面部分必須與你在web.xml里面配置的DispatcherServlet的servlet名字對(duì)應(yīng).其內(nèi)容為:程序代碼程序代碼<beansxmlns="/schema/beans"xmlns:context="/schema/context"xmlns:mvc="/schema/mvc"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd/schema/mvc/schema/mvc/spring-mvc-3.0.xsd"><context:component-scanbase-package="com.yihaomen.controller"/><mvc:annotation-driven/><mvc:resourcesmapping="/static/**"location="/WEB-INF/static/"/><mvc:default-servlet-handler/><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><propertyname="prefix"><value>/WEB-INF/pages/</value></property><propertyname="suffix"><value>.jsp</value></property></bean></beans>3.在源碼目錄config目錄下配置spring配置文件applicationContext.xml程序代碼程序代碼<!--本示例采用DBCP連接池,應(yīng)預(yù)先把DBCP的jar包復(fù)制到工程的lib目錄下。--><context:property-placeholderlocation="classpath:/config/perties"/><beanid="dataSource"class="mons.dbcp.BasicDataSource"destroy-method="close"p:driverClassName="com.mysql.jdbc.Driver"p:url="jdbc:mysql://:3306/mybatis?characterEncoding=utf8"p:username="root"p:password="password"p:maxActive="10"p:maxIdle="10"></bean><beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><!--dataSource屬性指定要用到的連接池--><propertyname="dataSource"ref="dataSource"/><!--configLocation屬性指定mybatis的核心配置文件--><propertyname="configLocation"value="classpath:config/Configuration.xml"/><!--所有配置的mapper文件--><propertyname="mapperLocations"value="classpath*:com/yihaomen/mapper/*.xml"/></bean><beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer"><propertyname="basePackage"value="er"/></bean>不知道為什么,一旦我用了MapperScannerConfigurer去掃描所有的mapper接口時(shí),數(shù)據(jù)庫(kù)配置datasource就不能用讀取perties文件了。報(bào)錯(cuò):CannotloadJDBCdriverclass'${jdbc.driverClassName}',網(wǎng)上有人說(shuō)在spring3.1.1下用sqlSessionFactionBean注入可以解決,但我用spring3.1.3還是有問(wèn)題,所以只好把數(shù)據(jù)庫(kù)連接信息直接配置在了XML文件里面。4.編寫controller層程序代碼程序代碼packagecom.yihaomen.controller;importjava.util.List;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.servlet.ModelAndView;importer.IUserOperation;importcom.yihaomen.model.Article;@Controller@RequestMapping("/article")publicclassUserController{@AutowiredIUserOperationuserMapper;@RequestMapping("/list")publicModelAndViewlistall(HttpServletRequestrequest,HttpServletResponseresponse){List<Article>articles=userMapper.getUserArticles(1);ModelAndViewmav=newModelAndView("list");mav.addObject("articles",articles);returnmav;}}5.頁(yè)面文件:[code]<c:forEachitems="${articles}"var="item">${item.id}--${item.title}--${item.content}<br/></c:forEach>運(yùn)行結(jié)果:當(dāng)然還有mybatis的Configure.xml配置文件,與上一講的差不多,唯一不同的就是不用再配置類似如下的:<mapperresource="com/yihaomen/mapper/User.xml"/>,所有這些都交給在配置sqlSessionFactory的時(shí)候,由<propertyname="mapperLocations"value="classpath*:com/yihaomen/mapper/*.xml"/>去導(dǎo)入了。源碼下載:下載文件mybatisspring3MVC程序下載數(shù)據(jù)庫(kù)下載:下載文件springmvc數(shù)據(jù)庫(kù)測(cè)試文件除非申明,文章均為一號(hào)門原創(chuàng),轉(zhuǎn)載請(qǐng)注明本文地址,謝謝!mybatis實(shí)戰(zhàn)教程(mybatisinaction)之七:實(shí)現(xiàn)mybatis分頁(yè)(源碼下載)上一篇文章里已經(jīng)講到了mybatis與springMVC的集成,并且做了一個(gè)列表展示,顯示出所有article列表,但沒(méi)有用到分頁(yè),在實(shí)際的項(xiàng)目中,分頁(yè)是肯定需要的。而且是物理分頁(yè),不是內(nèi)存分頁(yè)。對(duì)于物理分頁(yè)方案,不同的數(shù)據(jù)庫(kù),有不同的實(shí)現(xiàn)方法,對(duì)于mysql來(lái)說(shuō)就是利用limitoffset,pagesize方式來(lái)實(shí)現(xiàn)的。oracle是通過(guò)rownum來(lái)實(shí)現(xiàn)的,如果你熟悉相關(guān)數(shù)據(jù)庫(kù)的操作,是一樣的很好擴(kuò)展,本文以mysql為例子來(lái)講述.先看一下效果圖(源代碼在文章最后提供下載):實(shí)現(xiàn)mybatis物理分頁(yè),一個(gè)最簡(jiǎn)單的方式是,是在你的mapper的SQL語(yǔ)句中直接寫類似如下方式:程序代碼程序代碼<selectid="getUserArticles"parameterType="Your_params"resultMap="resultUserArticleList">selectuser.id,user.userName,user.userAddress,article.idaid,article.title,article.contentfromuser,articlewhereuser.id=article.useridanduser.id=#{id}limit#{offset},#{pagesize}</select>請(qǐng)注意這里的parameterType是你傳入的參數(shù)類,或者map,里面包含了offset,pagesize,和其他你需要的參數(shù),用這種方式,肯定可以實(shí)現(xiàn)分頁(yè)。這是簡(jiǎn)單的一種方式。但更通用的一種方式是用mybatis插件的方式.參考了網(wǎng)上的很多資料,mybatisplugin方面的資料。寫自己的插件.程序代碼程序代碼packagecom.yihaomen.util;importjava.lang.reflect.Field;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.util.List;importjava.util.Map;importjava.util.Properties;importjavax.xml.bind.PropertyException;importorg.apache.ibatis.builder.xml.dynamic.ForEachSqlNode;importorg.apache.ibatis.executor.ErrorContext;importorg.apache.ibatis.executor.Executor;importorg.apache.ibatis.executor.ExecutorException;importorg.apache.ibatis.executor.statement.BaseStatementHandler;importorg.apache.ibatis.executor.statement.RoutingStatementHandler;importorg.apache.ibatis.executor.statement.StatementHandler;importorg.apache.ibatis.mapping.BoundSql;importorg.apache.ibatis.mapping.MappedStatement;importorg.apache.ibatis.mapping.ParameterMapping;importorg.apache.ibatis.mapping.ParameterMode;importorg.apache.ibatis.plugin.Interceptor;importorg.apache.ibatis.plugin.Intercepts;importorg.apache.ibatis.plugin.Invocation;importorg.apache.ibatis.plugin.Plugin;importorg.apache.ibatis.plugin.Signature;importorg.apache.ibatis.reflection.MetaObject;importperty.PropertyTokenizer;importorg.apache.ibatis.session.Configuration;importorg.apache.ibatis.session.ResultHandler;importorg.apache.ibatis.session.RowBounds;importorg.apache.ibatis.type.TypeHandler;importorg.apache.ibatis.type.TypeHandlerRegistry;@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})publicclassPagePluginimplementsInterceptor{privatestaticStringdialect="";privatestaticStringpageSqlId="";@SuppressWarnings("unchecked")publicObjectintercept(Invocationivk)throwsThrowable{if(ivk.getTarget()instanceofRoutingStatementHandler){RoutingStatementHandlerstatementHandler=(RoutingStatementHandler)ivk.getTarget();BaseStatementHandlerdelegate=(BaseStatementHandler)ReflectHelper.getValueByFieldName(statementHandler,"delegate");MappedStatementmappedStatement=(MappedStatement)ReflectHelper.getValueByFieldName(delegate,"mappedStatement");if(mappedStatement.getId().matches(pageSqlId)){BoundSqlboundSql=delegate.getBoundSql();ObjectparameterObject=boundSql.getParameterObject();if(parameterObject==null){thrownewNullPointerException("parameterObjecterror");}else{Connectionconnection=(Connection)ivk.getArgs()[0];Stringsql=boundSql.getSql();StringcountSql="selectcount(0)from("+sql+")myCount";System.out.println("總數(shù)sql語(yǔ)句:"+countSql);PreparedStatementcountStmt=connection.prepareStatement(countSql);BoundSqlcountBS=newBoundSql(mappedStatement.getConfiguration(),countSql,boundSql.getParameterMappings(),parameterObject);setParameters(countStmt,mappedStatement,countBS,parameterObject);ResultSetrs=countStmt.executeQuery();intcount=0;if(rs.next()){count=rs.getInt(1);}rs.close();countStmt.close();PageInfopage=null;if(parameterObjecti

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論