上一章节中我们已l完成了对单表的CRUD操作Q接下来今天q一讲讲q的是关于Mybatis在多表查询时候的应用Q毕竟实际业务中也是多表的联合查询比较多嘛~
q记得最一开始我们新一张Website表吗Q在那张表里有个VisitorId字段Q表C问者访问过哪些|站Q现在我们先按照上一张中的要求把关于Website的JavaBean实体先徏立出来?/p>
q是在david.mybatis.model包下面新Z个Websitec,用来持久化数据之用,重写下相应toString()ҎQ方便测试程序之用?/p>
在david.mybatis.demo下面分别新徏相应的操作接口:
在mapper文g夹下新徏WebsiteMapper.xml映射文gQ分别参照上一张所说的把增删改查的单表操作配置分别放进去,q样你可以徏造一Ҏ试数据。如?/p>
q里今天主要说的是那个查,现在我们惌查询|站的同时分别把相应的访问者信息一h出来Q怎么做呢Q大家可以参照配|中的query,写下联表查询的SQLQ?/p>
q里主要要注意的是,Website实体与Visit的实体里面Id与Nameq?个属性都是一LQ所以ؓ了避免映出现出错现象,把相应的查询l果列v上不一L别名Q这L定的时候就可以避免?/p>
假如我想下面一样配|会得到什么呢?
?木有发觉QVisitor的Id也变?了,q个其实它默认映了Website的IDQ因为SQL语句查询出来的结?个ID都是变成2了,有h会问?什么不?呢,因ؓ他默认匹配第一个如果你把Website.Id与Visit.Id的位|,怺换下׃发现l果又神奇的变了
所以需要v个别名避免这U情况,q样你就会发现真相其实只有一个就是下面的Q?/p>
?家可以看到其实多表处理resultMap的方式和单表是一致的Q也无非是吧列明与Javabean属性名成对应上去,可以看到在Website ?lt;resultMap>节点里面前台另外一个resultMapQ他是代表Visit实体所需要映的实体Q可以用以下方式进行关?/p>
<association property="visitor" javaType="Visitor" resultMap="visitorRs" />
其中的visitor是Website实体中的visit字段名,必须保证名称一_否则׃抛出There is no getter for property named 'XXX' in 'class david.mybatis.model.Website'的异?/strong>Q这在上几章已经讲述了,?然如果你觉得不用嵌套resultMap也行Q嵌套也是出于其他地方可以还要用到这个配|那提炼出来的q程Q也是抽象出来的一U思想。具体 ?lt;resultMap>中的ID与Result可以从官|查扄应区别说明:http://mybatis.github.io /mybatis-3/sqlmap-xml.html#Result_Maps
q样Q一个简单的多表联合查询出来啦~Q如果还有更加复杂的查询业务Ҏ在这个基上些许的变通修攏V?/span>
q章到此ؓ止啦Q下一章会l箋跟讲下,如果弄一个简单的Mybatis下的分页效果~^0^
上一章节中,我们已经搭徏玩了最单的能够q行的HelloWorld环境Q这一章将把上章中的操作方式改Z接口的方式操?/p>
我们可以发现在上一个章节中
q样其实在真正的开发过E中如果两边的名字一不小心没有对应上Q就会出现异常。ؓ了避免这L情况我们可以采取接口的方式来q行相应的操作,下面我们来修改这D东ѝ?/p>
首先我们在包名ؓdavid.mybatis.demo的下面新Z个IVisitOperationc,表示今后要操作数据库所有方法的接口Q如下所C:
q样大功告成了Q这h们就不必为手动书写方法名可能D的不匚w而烦g?/p>
下一章将l箋讲述Z单表情况下的CRUD操作Q我会尽快整理更新~^0^
最q抽I学习了Mybatisq个框架Q在学习的过E中也找了很多的文章Q个人感觉官|上的东西太多太杂,不适合许多希望一步步快速上手的朋友们,当然觉得查阅问题的时候可以直接通过官网找还比较快或者是StackOverflowQ鉴于此原因把自己想把自己学习过E中的经验留作笔C供分享参考之用,量绕弯\。因为想直接了解Mybatis的用方式,而网上有许多学习文章是Mybatis与Spring的结合范例,或者说直接在Web Project目下创立的范例Q感觉对于只是纯_Ҏ了解那个东西怎么使用的朋友应该不需要那么多附加的条Ӟ所以本pd中直接用最单的Java Project作范例演C?/p>
什么是MybatisQ前wiBatisQ个人没用过Q所以没什么发a权)Q引q官|的原意来说QMybatis是支持普通SQL查询Q可以更单直接的操作SQLQ存储过E和高映射的一U优U的持久层框架Q用它基本可以消除所有的JDBC大麦和参数的手工讄以及l果集的索,其实个h使用下来感觉Q其实主要工作都是在配置XML或者注解上Q然后将接口和Java的POJOQ普通Java对象映射成数据库的记录)Q个人没用过Java的HbQ所以对于两者之间的差异性也没权限发表意见,我相信各个事物的产生L它自q目的?/p>
q段旉学习下来Q其实对Mybatis来说主要的过E无法是以下几步
1. 从XML配置文g中获取SessionFactoryQ然后由SessionFactory产生相应的Session?/p>
2. 是用Session对象对业务数据完成相应的CRUD操作Q增删改查)和相应的事务控制?/p>
3. 使用完毕后关闭相应的SessionQ以免过度占用资?/p>
4. 使用配置相应的Mapper xml文gq行业务实体的JavaBean与数据库表之间做相应的Map操作
战前准备Q?/p>
1. 开发环境Eclipse JavaEE IDEQJDK 1.6Q数据库mysql 5.5
2. 下蝲相应Jar包,以备后用
mybatis-3.2.3.zip 解压后拿?mybatis-3.2.3.jarQ?> 下蝲地址Q?http://code.google.com/p/mybatis/ QMybatis核心包)
mybatis-generator-core-1.3.1.jar => 下蝲地址Q?http://code.google.com/p/mybatis/wiki/Generator QMybatis自动生成配置文g包)
mysql-connector-java-5.1.26-bin.jar => 下蝲地址Q?a data-mce->http://dev.mysql.com/downloads/connector/j/ QMysql 的jdbc驱动包)
接下来大家可以再Eclipse下面Z个名为MybatisDemo的Java Project目Q按照如下图中所C新建相应的包结构和文g夹结构,其中config与mapper分别为文件夹Q?/p>
包david.mybatis.demo与包david.mybatis.model下分别存攄应的demoq行E序与Javabean对象Qlib文g夹下存放刚刚下蝲的那几个W三方jar包?/p>
建完下面的目录,我们可以d相应的Jar包,如下?/p>
完成后,执行下面SQLQ徏立DEMO所需的表l构Q分别有3张表QVisitorQ访问者表Q,WebsiteQ网站表Q,ChannelQ频道表Q
像开头说的,Mybatis的所有配|都源于一份XML配置文gQ我们需要在config文g夹下Q新建名为mybatis_demo_config.xml的配|文Ӟq一份东西就是我们后面所需要操作的核心之一?/p>
在配|这个文?span style="background-color: #ffff00;" data-mce-style="background-color: #ffff00;">千万要注?/strong><configuration>节点内的元素都是有层U顺?/strong>的要求的Q不能够随意更换ơ序Q否则在加蝲xml配置文g的时候会出现异常而导致后l操作不成功?/span>
具体的节点说明大家可以查?a data-mce->http://mybatis.github.io/mybatis-3/zh/configuration.html#Q这里只说比较常用的节点QtypeAliasesQenvironmentsQmappers?/span>
1. typeAliases => 别名节点Q可以通过讄q个节点的属性,q样配置文g中其他需要实体名字的地方都可以用此别名而不是完全限定名Q例?<typeAlias type="david.mybatis.model.Visitor" alias="Visitor" />
2. environments => 环境节点Q配|数据连接相关的信息
3. mappers => 配置SQL映射语句?/p>
最单的配置如下Q?br />
在包david.mybatis.demo下面新徏一个名为MyBatisUtilsc,里面存放获取SqlSession与关闭SqlSession的方法,提炼出来方便多次复用?/p>
在包david.mybatis.model下面新徏一个名为Visitor的类Q用来作相应的OR Mapping?/p>
在包david.mybatis.demo下面新徏一个VisitorMapper.xmlQ用来映相应SQL语句?/p>
q里要注意namespace=>david.mybatis.demo.IVisitorOperation一定要与对应这个包下面的实际文件名QIVisitorOperation否则无法成功加蝲相应的映文?/strong>
接下来运行下面的E序
q算是Mybatispd的HelloWordQ下回会讲述关于使用接口的方式进行相应操作?/p>