<article>
<h1 class="csdn_top">MyBatis 多表联合查询及优化</h1>
<div class="article_bar clearfix">
<div class="artical_tag">
<span class="original">
原创 </span>
<span class="time">2015年05月25日 11:50:27</span>
</div>
<ul class="article_tags clearfix csdn-tracking-statistics tracking-click" data-mod="popu_377">
<li class="tit">标签:</li>
<!-- [startarticletags]-->
<li><a href="http://so.csdn.net/so/search/s.do?q=mybatis&t=blog" target="_blank">mybatis</a> <span>/</span></li>
<li><a href="http://so.csdn.net/so/search/s.do?q=多表&t=blog" target="_blank">多表</a> <span>/</span></li>
<li><a href="http://so.csdn.net/so/search/s.do?q=联合查询&t=blog" target="_blank">联合查询</a> <span style="display: none;">/</span></li>
<!-- [endarticletags]-->
</ul>
<ul class="right_bar">
<li><button class="btn-noborder"><i class="icon iconfont icon-read"></i><span class="txt">90957</span></button></li>
<li class="edit" style="display: none;">
<a class="btn-noborder" href="http://write.blog.csdn.net/postedit/45967763">
<i class="icon iconfont icon-bianji"></i><span class="txt">编辑</span>
</a>
</li>
<li class="del" style="display: none;">
<a class="btn-noborder" οnclick="javascript:deleteArticle(fileName);return false;">
<i class="icon iconfont icon-shanchu"></i><span class="txt">删除</span>
</a>
</li>
</ul>
</div>
<div id="article_content" class="article_content csdn-tracking-statistics tracking-click" data-mod="popu_519" data-dsm="post" style="overflow: hidden;">
<br><br><h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t0"></a>序</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">这篇文章我打算来简单的谈谈 mybatis 的多表联合查询。起初是觉得挺简单的,没必要拿出来写,毕竟 mybatis 这东西现在是个开发的都会用,而且网上的文章也是一搜罗一大堆,根本就用不着我来重复。但是吧,就我前几天在做一个多表联合查询的时候,竟然出了很多意想不到的问题,而且这些问题的出现,并不是对 mybatis 不了解,而是在用的过程中会或多或少的忽略一些东西,导致提示各种错误。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t1"></a>背景</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">老规矩,开始之前,还是要先说说这件事的背景。也就是最近几天,公司要做一个后台的管理平台,由于之前的一些限制,这次要做成单独的项目进行部署,因此就要重新考虑很多东西。索性这几天有时间,就做了一个小 Demo ,实现 mybatis 的多表联合查询的,由于之前用的是 Hibernate 做的联合查询,众所周知,Hibernate 是全自动的数据库持久层框架,它可以通过实体来映射数据库,通过设置一对多、多对一、一对一、多对多的关联来实现联合查询。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t2"></a>正文</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">下面就来说一下 mybatis 是通过什么来实现多表联合查询的。首先看一下表关系,如图:</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="text-align:center;font-family:'微软雅黑';font-size:14px;line-height:21px;">
<img src="https://img-blog.csdn.net/20150525113540142?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlsZWU2Njg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><br></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">这里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了简单期间,你可以不用搭前端的框架,只使用 Spring + MyBatis 就可以,外加 junit 测试即可。环境我就不带大家搭了,这里只说涉及到联合查询的操作。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">设计好表之后,我用到了 mybatis 的自动生成工具 mybatis generator 生成的实体类、mapper 接口、以及 mapper xml 文件。由于是测试多表联合查询,因此需要自己稍加改动。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">下面是 User 和 Role 的实体类代码:</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">User</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 1296px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.domain; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.io.Serializable; </span></span></li><li class=""><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> User </span><span class="keyword">implements</span><span> Serializable { </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String id; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> String username; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> String password; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> List<Role> roles; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">long</span><span> serialVersionUID = 1L; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> String getId() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> id; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setId(String id) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.id = id == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : id.trim(); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> String getUsername() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> username; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setUsername(String username) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.username = username == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : username.trim(); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> String getPassword() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> password; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setPassword(String password) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.password = password == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : password.trim(); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> List<Role> getRoles() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> roles; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setRoles(List<Role> roles) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.roles = roles; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">boolean</span><span> equals(Object that) { </span></span></li><li class="alt"><span> <span class="keyword">if</span><span> (</span><span class="keyword">this</span><span> == that) { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">true</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">if</span><span> (that == </span><span class="keyword">null</span><span>) { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">if</span><span> (getClass() != that.getClass()) { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> User other = (User) that; </span></li><li class="alt"><span> <span class="keyword">return</span><span> (</span><span class="keyword">this</span><span>.getId() == </span><span class="keyword">null</span><span> ? other.getId() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getId().equals(other.getId())) </span></span></li><li class=""><span> && (<span class="keyword">this</span><span>.getUsername() == </span><span class="keyword">null</span><span> ? other.getUsername() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getUsername().equals(other.getUsername())) </span></span></li><li class="alt"><span> && (<span class="keyword">this</span><span>.getPassword() == </span><span class="keyword">null</span><span> ? other.getPassword() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getPassword().equals(other.getPassword())); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> hashCode() { </span></span></li><li class=""><span> <span class="keyword">final</span><span> </span><span class="keyword">int</span><span> prime = </span><span class="number">31</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">int</span><span> result = </span><span class="number">1</span><span>; </span></span></li><li class=""><span> result = prime * result + ((getId() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getId().hashCode()); </span></span></li><li class="alt"><span> result = prime * result + ((getUsername() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getUsername().hashCode()); </span></span></li><li class=""><span> result = prime * result + ((getPassword() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getPassword().hashCode()); </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> result; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.domain;
import java.io.Serializable;
import java.util.List;
public class User implements Serializable {
private String id;
private String username;
private String password;
private List<Role> roles;
private static final long serialVersionUID = 1L;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id == null ? null : id.trim();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
@Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
User other = (User) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername()))
&& (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());
result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());
return result;
}
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">Role</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 2799px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.domain; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.io.Serializable; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Role </span><span class="keyword">implements</span><span> Serializable { </span></span></li><li class=""><span> <span class="keyword">private</span><span> String id; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String name; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String jsms; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String bz; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> Integer jlzt; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String glbm; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String userid; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">long</span><span> serialVersionUID = 1L; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getId() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> id; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setId(String id) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.id = id == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : id.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getName() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> name; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setName(String name) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.name = name == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : name.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getJsms() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> jsms; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setJsms(String jsms) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.jsms = jsms == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : jsms.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getBz() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> bz; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setBz(String bz) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.bz = bz == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : bz.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> Integer getJlzt() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> jlzt; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setJlzt(Integer jlzt) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.jlzt = jlzt; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getGlbm() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> glbm; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setGlbm(String glbm) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.glbm = glbm == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : glbm.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getUserid() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> userid; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setUserid(String userid) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.userid = userid == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : userid.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">boolean</span><span> equals(Object that) { </span></span></li><li class=""><span> <span class="keyword">if</span><span> (</span><span class="keyword">this</span><span> == that) { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">if</span><span> (that == </span><span class="keyword">null</span><span>) { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">if</span><span> (getClass() != that.getClass()) { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> Role other = (Role) that; </span></li><li class=""><span> <span class="keyword">return</span><span> (</span><span class="keyword">this</span><span>.getId() == </span><span class="keyword">null</span><span> ? other.getId() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getId().equals(other.getId())) </span></span></li><li class="alt"><span> && (<span class="keyword">this</span><span>.getName() == </span><span class="keyword">null</span><span> ? other.getName() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getName().equals(other.getName())) </span></span></li><li class=""><span> && (<span class="keyword">this</span><span>.getJsms() == </span><span class="keyword">null</span><span> ? other.getJsms() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getJsms().equals(other.getJsms())) </span></span></li><li class="alt"><span> && (<span class="keyword">this</span><span>.getBz() == </span><span class="keyword">null</span><span> ? other.getBz() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getBz().equals(other.getBz())) </span></span></li><li class=""><span> && (<span class="keyword">this</span><span>.getJlzt() == </span><span class="keyword">null</span><span> ? other.getJlzt() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getJlzt().equals(other.getJlzt())) </span></span></li><li class="alt"><span> && (<span class="keyword">this</span><span>.getGlbm() == </span><span class="keyword">null</span><span> ? other.getGlbm() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getGlbm().equals(other.getGlbm())) </span></span></li><li class=""><span> && (<span class="keyword">this</span><span>.getUserid() == </span><span class="keyword">null</span><span> ? other.getUserid() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getUserid().equals(other.getUserid())); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> hashCode() { </span></span></li><li class="alt"><span> <span class="keyword">final</span><span> </span><span class="keyword">int</span><span> prime = </span><span class="number">31</span><span>; </span></span></li><li class=""><span> <span class="keyword">int</span><span> result = </span><span class="number">1</span><span>; </span></span></li><li class="alt"><span> result = prime * result + ((getId() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getId().hashCode()); </span></span></li><li class=""><span> result = prime * result + ((getName() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getName().hashCode()); </span></span></li><li class="alt"><span> result = prime * result + ((getJsms() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getJsms().hashCode()); </span></span></li><li class=""><span> result = prime * result + ((getBz() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getBz().hashCode()); </span></span></li><li class="alt"><span> result = prime * result + ((getJlzt() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getJlzt().hashCode()); </span></span></li><li class=""><span> result = prime * result + ((getGlbm() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getGlbm().hashCode()); </span></span></li><li class="alt"><span> result = prime * result + ((getUserid() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getUserid().hashCode()); </span></span></li><li class=""><span> <span class="keyword">return</span><span> result; </span></span></li><li class="alt"><span> } </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.domain;
import java.io.Serializable;
public class Role implements Serializable {
private String id;
private String name;
private String jsms;
private String bz;
private Integer jlzt;
private String glbm;
private String userid;
private static final long serialVersionUID = 1L;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id == null ? null : id.trim();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public String getJsms() {
return jsms;
}
public void setJsms(String jsms) {
this.jsms = jsms == null ? null : jsms.trim();
}
public String getBz() {
return bz;
}
public void setBz(String bz) {
this.bz = bz == null ? null : bz.trim();
}
public Integer getJlzt() {
return jlzt;
}
public void setJlzt(Integer jlzt) {
this.jlzt = jlzt;
}
public String getGlbm() {
return glbm;
}
public void setGlbm(String glbm) {
this.glbm = glbm == null ? null : glbm.trim();
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid == null ? null : userid.trim();
}
@Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
Role other = (Role) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
&& (this.getJsms() == null ? other.getJsms() == null : this.getJsms().equals(other.getJsms()))
&& (this.getBz() == null ? other.getBz() == null : this.getBz().equals(other.getBz()))
&& (this.getJlzt() == null ? other.getJlzt() == null : this.getJlzt().equals(other.getJlzt()))
&& (this.getGlbm() == null ? other.getGlbm() == null : this.getGlbm().equals(other.getGlbm()))
&& (this.getUserid() == null ? other.getUserid() == null : this.getUserid().equals(other.getUserid()));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
result = prime * result + ((getJsms() == null) ? 0 : getJsms().hashCode());
result = prime * result + ((getBz() == null) ? 0 : getBz().hashCode());
result = prime * result + ((getJlzt() == null) ? 0 : getJlzt().hashCode());
result = prime * result + ((getGlbm() == null) ? 0 : getGlbm().hashCode());
result = prime * result + ((getUserid() == null) ? 0 : getUserid().hashCode());
return result;
}
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">首先讲一下业务,这里用到的 User 、Role 的对应关系是,一个用户有多个角色,也就是 User : Role 是 1 : n 的关系。因此,在 User 的实体中加入一个 Role 的属性,对应一对多的关系。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">然后就是 mapper 接口和 xml 文件了:</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">mapper接口</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">UserMapper</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 5127px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.mapper; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.domain.User; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> UserMapper { </span></span></li><li class=""><span> <span class="keyword">int</span><span> deleteByPrimaryKey(String id); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">int</span><span> insert(User record); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">int</span><span> insertSelective(User record); </span></span></li><li class="alt"><span> </span></li><li class=""><span> User selectByPrimaryKey(String id); </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">int</span><span> updateByPrimaryKeySelective(User record); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">int</span><span> updateByPrimaryKey(User record); </span></span></li><li class="alt"><span> </span></li><li class=""><span> List<User> queryForList(); </span></li><li class="alt"><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.mapper;
import com.sica.domain.User;
import java.util.List;
public interface UserMapper {
int deleteByPrimaryKey(String id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(String id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
List<User> queryForList();
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">mapper xml文件</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">UserMapper</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 168px; top: 5661px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">span</span><span> </span><span class="attribute">style</span><span>=</span><span class="attribute-value">"font-family:Comic Sans MS;font-size:12px;"</span><span class="tag">></span><span class="tag"><?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span> </span><span class="tag">?></span><span> </span></span></li><li class=""><span><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" <span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">mapper</span><span> </span><span class="attribute">namespace</span><span>=</span><span class="attribute-value">"com.sica.mapper.UserMapper"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">resultMap</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"BaseResultMap"</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">id</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">resultMap</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">resultMap</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"queryForListMap"</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">id</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">collection</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"roles"</span><span> </span><span class="attribute">javaType</span><span>=</span><span class="attribute-value">"java.util.List"</span><span> </span><span class="attribute">ofType</span><span>=</span><span class="attribute-value">"com.sica.domain.Role"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">id</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_id"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_name"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"name"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_jsms"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"jsms"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_bz"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"bz"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_jlzt"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"jlzt"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"INTEGER"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_glbm"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"glbm"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">collection</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">resultMap</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">select</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"queryForList"</span><span> </span><span class="attribute">resultMap</span><span>=</span><span class="attribute-value">"queryForListMap"</span><span class="tag">></span><span> </span></span></li><li class=""><span> SELECT </span></li><li class="alt"><span> u.id, </span></li><li class=""><span> u.username, </span></li><li class="alt"><span> u.password, </span></li><li class=""><span> r.id r_id, </span></li><li class="alt"><span> r.name r_name, </span></li><li class=""><span> r.jsms r_jsms, </span></li><li class="alt"><span> r.bz r_bz, </span></li><li class=""><span> r.jlzt r_jlzt, </span></li><li class="alt"><span> r.glbm r_glbm </span></li><li class=""><span> FROM </span></li><li class="alt"><span> user u </span></li><li class=""><span> LEFT JOIN </span></li><li class="alt"><span> role r </span></li><li class=""><span> ON </span></li><li class="alt"><span> <span class="attribute">u.id</span><span> = </span><span class="attribute-value">r</span><span>.userid </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">select</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">sql</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"Base_Column_List"</span><span class="tag">></span><span> </span></span></li><li class=""><span> id, username, password </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">sql</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">select</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"selectByPrimaryKey"</span><span> </span><span class="attribute">resultMap</span><span>=</span><span class="attribute-value">"BaseResultMap"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"java.lang.String"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> select </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">include</span><span> </span><span class="attribute">refid</span><span>=</span><span class="attribute-value">"Base_Column_List"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> from user </span></li><li class=""><span> where <span class="attribute">id</span><span> = #{id,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">select</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">delete</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"deleteByPrimaryKey"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"java.lang.String"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> delete from user </span></li><li class=""><span> where <span class="attribute">id</span><span> = #{id,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">delete</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">insert</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"insert"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> insert into user (id, username, password </span></li><li class=""><span> ) </span></li><li class="alt"><span> values (#{id,<span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, #{username,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, #{password,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class=""><span> ) </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">insert</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">insert</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"insertSelective"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> insert into user </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">trim</span><span> </span><span class="attribute">prefix</span><span>=</span><span class="attribute-value">"("</span><span> </span><span class="attribute">suffix</span><span>=</span><span class="attribute-value">")"</span><span> </span><span class="attribute">suffixOverrides</span><span>=</span><span class="attribute-value">","</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"id != null"</span><span class="tag">></span><span> </span></span></li><li class=""><span> id, </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"username != null"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> username, </span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"password != null"</span><span class="tag">></span><span> </span></span></li><li class=""><span> password, </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">trim</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">trim</span><span> </span><span class="attribute">prefix</span><span>=</span><span class="attribute-value">"values ("</span><span> </span><span class="attribute">suffix</span><span>=</span><span class="attribute-value">")"</span><span> </span><span class="attribute">suffixOverrides</span><span>=</span><span class="attribute-value">","</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"id != null"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> #{id,<span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"username != null"</span><span class="tag">></span><span> </span></span></li><li class=""><span> #{username,<span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"password != null"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> #{password,<span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">trim</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">insert</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">update</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"updateByPrimaryKeySelective"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class=""><span> update user </span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">set</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"username != null"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="attribute">username</span><span> = #{username,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"password != null"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="attribute">password</span><span> = #{password,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">set</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> where <span class="attribute">id</span><span> = #{id,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">update</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">update</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"updateByPrimaryKey"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class=""><span> update user </span></li><li class="alt"><span> set <span class="attribute">username</span><span> = #{username,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class=""><span> <span class="attribute">password</span><span> = #{password,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class="alt"><span> where <span class="attribute">id</span><span> = #{id,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">update</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">mapper</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">span</span><span class="tag">></span><span> </span></span></li></ol></div><pre class="html" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sica.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.sica.domain.User">
<id column="id" property="id" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="queryForListMap" type="com.sica.domain.User">
<id column="id" property="id" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
<collection property="roles" javaType="java.util.List" ofType="com.sica.domain.Role">
<id column="r_id" property="id" jdbcType="VARCHAR" />
<result column="r_name" property="name" jdbcType="VARCHAR" />
<result column="r_jsms" property="jsms" jdbcType="VARCHAR" />
<result column="r_bz" property="bz" jdbcType="VARCHAR" />
<result column="r_jlzt" property="jlzt" jdbcType="INTEGER" />
<result column="r_glbm" property="glbm" jdbcType="VARCHAR" />
</collection>
</resultMap>
<select id="queryForList" resultMap="queryForListMap">
SELECT
u.id,
u.username,
u.password,
r.id r_id,
r.name r_name,
r.jsms r_jsms,
r.bz r_bz,
r.jlzt r_jlzt,
r.glbm r_glbm
FROM
user u
LEFT JOIN
role r
ON
u.id = r.userid
</select>
<sql id="Base_Column_List">
id, username, password
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String">
select
<include refid="Base_Column_List"/>
from user
where id = #{id,jdbcType=VARCHAR}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
delete from user
where id = #{id,jdbcType=VARCHAR}
</delete>
<insert id="insert" parameterType="com.sica.domain.User">
insert into user (id, username, password
)
values (#{id,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
)
</insert>
<insert id="insertSelective" parameterType="com.sica.domain.User">
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="username != null">
username,
</if>
<if test="password != null">
password,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=VARCHAR},
</if>
<if test="username != null">
#{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
#{password,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.sica.domain.User">
update user
<set>
<if test="username != null">
username = #{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
password = #{password,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey" parameterType="com.sica.domain.User">
update user
set username = #{username,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper></span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">之后,我扩展了一个 Dao 接口,当然,你也可以直接使用 mapper 接口,都是一样的。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">Dao 接口</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">IUserDao</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 7724px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.dao; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.mapper.UserMapper; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * Created by IntelliJ IDEA.</span> </span></li><li class="alt"><span><span class="comment"> * Package: com.sica.dao</span> </span></li><li class=""><span><span class="comment"> * Name: IUserDao</span> </span></li><li class="alt"><span><span class="comment"> * User: xiang.li</span> </span></li><li class=""><span><span class="comment"> * Date: 2015/5/22</span> </span></li><li class="alt"><span><span class="comment"> * Time: 15:25</span> </span></li><li class=""><span><span class="comment"> * Desc: To change this template use File | Settings | File Templates.</span> </span></li><li class="alt"><span><span class="comment"> */</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> IUserDao </span><span class="keyword">extends</span><span> UserMapper { </span></span></li><li class="alt"><span> </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.dao;
import com.sica.mapper.UserMapper;
/**
* Created by IntelliJ IDEA.
* Package: com.sica.dao
* Name: IUserDao
* User: xiang.li
* Date: 2015/5/22
* Time: 15:25
* Desc: To change this template use File | Settings | File Templates.
*/
public interface IUserDao extends UserMapper {
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">下面就是 service 和实现层的代码了。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">IUserService</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 8164px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.service; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.domain.User; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * Created by xiang.li on 2015/1/31.</span> </span></li><li class="alt"><span><span class="comment"> */</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> IUserService { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">/**</span> </span></li><li class="alt"><span><span class="comment"> * 根据Id查询用户对象</span> </span></li><li class=""><span><span class="comment"> * @param id 编号</span> </span></li><li class="alt"><span><span class="comment"> * @return 用户对象</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span> User getUserById(String id); </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * 根据用户名查询用户对象</span> </span></li><li class="alt"><span><span class="comment"> * @return List</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span> List<User> queryUserList(); </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.service;
import com.sica.domain.User;
import java.util.List;
/**
* Created by xiang.li on 2015/1/31.
*/
public interface IUserService {
/**
* 根据Id查询用户对象
* @param id 编号
* @return 用户对象
*/
User getUserById(String id);
/**
* 根据用户名查询用户对象
* @return List
*/
List<User> queryUserList();
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">UserServiceImpl</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 8707px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.service.impl; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.dao.IUserDao; </span></span></li><li class=""><span><span class="keyword">import</span><span> com.sica.domain.User; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.service.IUserService; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.stereotype.Service; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> javax.annotation.Resource; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * Created by xiang.li on 2015/1/31.</span> </span></li><li class="alt"><span><span class="comment"> */</span><span> </span></span></li><li class=""><span><span class="annotation">@Service</span><span>(</span><span class="string">"userService"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> UserServiceImpl </span><span class="keyword">implements</span><span> IUserService { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Resource</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> IUserDao userDao; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> User getUserById(String id) { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">this</span><span>.userDao.selectByPrimaryKey(id); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> List<User> queryUserList() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> userDao.queryForList(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.service.impl;
import com.sica.dao.IUserDao;
import com.sica.domain.User;
import com.sica.service.IUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by xiang.li on 2015/1/31.
*/
@Service("userService")
public class UserServiceImpl implements IUserService {
@Resource
public IUserDao userDao;
@Override
public User getUserById(String id) {
return this.userDao.selectByPrimaryKey(id);
}
@Override
public List<User> queryUserList() {
return userDao.queryForList();
}
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">当然,还有所谓的 applicationContext.xml 配置,不过,我这里叫 spring-mybatis.xml。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="line-height:21px;"><div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 168px; top: 9385px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">span</span><span> </span><span class="attribute">style</span><span>=</span><span class="attribute-value">"font-family:Comic Sans MS;font-size:12px;"</span><span class="tag">></span><span class="tag"><?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?></span><span> </span></span></li><li class=""><span><span class="tag"><</span><span class="tag-name">beans</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/beans"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span> </span></span></li><li class=""><span> <span class="attribute">xmlns:p</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/p"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">xmlns:context</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/context"</span><span> </span></span></li><li class=""><span> <span class="attribute">xmlns:mvc</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/mvc"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">xsi:schemaLocation</span><span>="http://www.springframework.org/schema/beans </span></span></li><li class=""><span> http://www.springframework.org/schema/beans/spring-beans.xsd </span></li><li class="alt"><span> http://www.springframework.org/schema/context </span></li><li class=""><span> http://www.springframework.org/schema/context/spring-context.xsd </span></li><li class="alt"><span> http://www.springframework.org/schema/mvc </span></li><li class=""><span> http://www.springframework.org/schema/mvc/spring-mvc.xsd"<span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- 自动扫描 --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">context:component-scan</span><span> </span><span class="attribute">base-package</span><span>=</span><span class="attribute-value">"com.sica"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- 引入配置文件 --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"propertyConfigurer"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:location</span><span>=</span><span class="attribute-value">"classpath:jdbc.properties"</span><span> </span></span></li><li class="alt"><span> <span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- 配置数据库连接池 --></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- 初始化连接大小 --></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- 连接池最大数量 --></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- 连接池最大空闲 --></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- 连接池最小空闲 --></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- 获取连接最大等待时间 --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"dataSource"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.commons.dbcp.BasicDataSource"</span><span> </span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">"close"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:driverClassName</span><span>=</span><span class="attribute-value">"${jdbc.driver}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:url</span><span>=</span><span class="attribute-value">"${jdbc.url}"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:username</span><span>=</span><span class="attribute-value">"${jdbc.username}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:password</span><span>=</span><span class="attribute-value">"${jdbc.password}"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:initialSize</span><span>=</span><span class="attribute-value">"${jdbc.initialSize}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:maxActive</span><span>=</span><span class="attribute-value">"${jdbc.maxActive}"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:maxIdle</span><span>=</span><span class="attribute-value">"${jdbc.maxIdle}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:minIdle</span><span>=</span><span class="attribute-value">"${jdbc.minIdle}"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:maxWait</span><span>=</span><span class="attribute-value">"${jdbc.maxWait}"</span><span> </span></span></li><li class="alt"><span> <span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"sqlSessionFactory"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.mybatis.spring.SqlSessionFactoryBean"</span><span> </span><span class="attribute">lazy-init</span><span>=</span><span class="attribute-value">"default"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:dataSource-ref</span><span>=</span><span class="attribute-value">"dataSource"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:mapperLocations</span><span>=</span><span class="attribute-value">"classpath:com/sica/mapping/*.xml"</span><span> </span></span></li><li class="alt"><span> <span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- DAO接口所在包名,Spring会自动查找其下的类 --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:basePackage</span><span>=</span><span class="attribute-value">"com.sica.dao"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:sqlSessionFactoryBeanName</span><span>=</span><span class="attribute-value">"sqlSessionFactory"</span><span> </span></span></li><li class="alt"><span> <span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"transactionManager"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:dataSource-ref</span><span>=</span><span class="attribute-value">"dataSource"</span><span> </span></span></li><li class=""><span> <span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">span</span><span class="tag">></span><span> </span></span></li></ol></div><pre class="html" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.sica"/>
<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="classpath:jdbc.properties"
/>
<!-- 配置数据库连接池 -->
<!-- 初始化连接大小 -->
<!-- 连接池最大数量 -->
<!-- 连接池最大空闲 -->
<!-- 连接池最小空闲 -->
<!-- 获取连接最大等待时间 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:initialSize="${jdbc.initialSize}"
p:maxActive="${jdbc.maxActive}"
p:maxIdle="${jdbc.maxIdle}"
p:minIdle="${jdbc.minIdle}"
p:maxWait="${jdbc.maxWait}"
/>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" lazy-init="default"
p:dataSource-ref="dataSource"
p:mapperLocations="classpath:com/sica/mapping/*.xml"
/>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="com.sica.dao"
p:sqlSessionFactoryBeanName="sqlSessionFactory"
/>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
/>
</beans></span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">最后,我用到的是 junit 进行的测试,测试代码如下。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br>
GetUserTest<br style="background-color:inherit;"></div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 10541px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_9" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.user; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.alibaba.fastjson.JSON; </span></span></li><li class=""><span><span class="keyword">import</span><span> com.sica.domain.User; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.service.IUserService; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.junit.runner.RunWith; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.slf4j.Logger; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.slf4j.LoggerFactory; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.test.context.ContextConfiguration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> javax.annotation.Resource; </span></span></li><li class=""><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="comment">/**</span> </span></li><li class="alt"><span><span class="comment"> * Created by xiang.li on 2015/2/1.</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(locations = </span><span class="string">"classpath:spring-mybatis.xml"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> GetUserTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> String UUID = </span><span class="string">"3"</span><span>; </span></span></li><li class=""><span> <span class="annotation">@Resource</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> IUserService userService; </span></span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> Logger logger = LoggerFactory.getLogger(GetUserTest.</span><span class="keyword">class</span><span>); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> test() { </span></span></li><li class=""><span> User user = userService.getUserById(UUID); </span></li><li class="alt"><span> logger.info(JSON.toJSONString(user)); </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">/**</span> </span></li><li class="alt"><span><span class="comment"> * 测试联合查询</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> test2() { </span></span></li><li class="alt"><span> List<User> users = userService.queryUserList(); </span></li><li class=""><span> logger.info(JSON.toJSONString(users)); </span></li><li class="alt"><span> } </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.user;
import com.alibaba.fastjson.JSON;
import com.sica.domain.User;
import com.sica.service.IUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by xiang.li on 2015/2/1.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-mybatis.xml")
public class GetUserTest {
private static String UUID = "3";
@Resource
private IUserService userService;
private static Logger logger = LoggerFactory.getLogger(GetUserTest.class);
@Test
public void test() {
User user = userService.getUserById(UUID);
logger.info(JSON.toJSONString(user));
}
/**
* 测试联合查询
*/
@Test
public void test2() {
List<User> users = userService.queryUserList();
logger.info(JSON.toJSONString(users));
}
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t3"></a>测试结果</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="text-align:center;font-family:'微软雅黑';font-size:14px;line-height:21px;">
<img src="https://img-blog.csdn.net/20150525114801761?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlsZWU2Njg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">可以看到,所有的用户和用户对应的角色都全部查出来了,这说明,这次的测试很成功。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t4"></a>关于优化</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">对于优化嘛,我这里简单的提几点,大家可以考虑一下。首先,就是对表的设计,在设计表初期,不仅仅要考虑到数据库的规范性,还好考虑到所谓的业务,以及对性能的影响,比如,如果从规范性角度考虑的话,可能就会分多个表,但是如果从性能角度来考虑的话,庞大的数据量在多表联合查询的时候,相对于单表来说,就会慢很多,这时,如果字段不是很多的话,可以考虑冗余几个字段采用单表的设计。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">其次嘛,就是在 sql 上下功夫了,对于联合查询,sql 的优化是很有必要的,到底是采用 INNER JOIN,还是采用 LEFT JOIN 亦或是 RIGHT JOIN 、OUTTER JOIN 等,都是要在满足业务需求之后,通过测试性能得出的结论。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">再次嘛,就是在程序中调用的时候了,是采用懒加载,还是采用非懒加载的方式,这也算是一个因素吧,具体的还是要考虑业务的需要。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">最后嘛,就要用到数据库的缓存了,或者在数据库与程序的中间再加一层缓存。不过,还是建议用好数据库本身自带的缓存功能。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t5"></a>结束语</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">最后的最后,还是要提醒大家,不要因为觉得简单就引不起足够的重视,否则你会由于一点点小的失误,而浪费大把大把的时间的。我就在这上边体会过,所以,这里奉劝大家,还是小心为妙啊@!</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
</div>
</div>
</article>
<h1 class="csdn_top">MyBatis 多表联合查询及优化</h1>
<div class="article_bar clearfix">
<div class="artical_tag">
<span class="original">
原创 </span>
<span class="time">2015年05月25日 11:50:27</span>
</div>
<ul class="article_tags clearfix csdn-tracking-statistics tracking-click" data-mod="popu_377">
<li class="tit">标签:</li>
<!-- [startarticletags]-->
<li><a href="http://so.csdn.net/so/search/s.do?q=mybatis&t=blog" target="_blank">mybatis</a> <span>/</span></li>
<li><a href="http://so.csdn.net/so/search/s.do?q=多表&t=blog" target="_blank">多表</a> <span>/</span></li>
<li><a href="http://so.csdn.net/so/search/s.do?q=联合查询&t=blog" target="_blank">联合查询</a> <span style="display: none;">/</span></li>
<!-- [endarticletags]-->
</ul>
<ul class="right_bar">
<li><button class="btn-noborder"><i class="icon iconfont icon-read"></i><span class="txt">90957</span></button></li>
<li class="edit" style="display: none;">
<a class="btn-noborder" href="http://write.blog.csdn.net/postedit/45967763">
<i class="icon iconfont icon-bianji"></i><span class="txt">编辑</span>
</a>
</li>
<li class="del" style="display: none;">
<a class="btn-noborder" οnclick="javascript:deleteArticle(fileName);return false;">
<i class="icon iconfont icon-shanchu"></i><span class="txt">删除</span>
</a>
</li>
</ul>
</div>
<div id="article_content" class="article_content csdn-tracking-statistics tracking-click" data-mod="popu_519" data-dsm="post" style="overflow: hidden;">
<br><br><h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t0"></a>序</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">这篇文章我打算来简单的谈谈 mybatis 的多表联合查询。起初是觉得挺简单的,没必要拿出来写,毕竟 mybatis 这东西现在是个开发的都会用,而且网上的文章也是一搜罗一大堆,根本就用不着我来重复。但是吧,就我前几天在做一个多表联合查询的时候,竟然出了很多意想不到的问题,而且这些问题的出现,并不是对 mybatis 不了解,而是在用的过程中会或多或少的忽略一些东西,导致提示各种错误。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t1"></a>背景</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">老规矩,开始之前,还是要先说说这件事的背景。也就是最近几天,公司要做一个后台的管理平台,由于之前的一些限制,这次要做成单独的项目进行部署,因此就要重新考虑很多东西。索性这几天有时间,就做了一个小 Demo ,实现 mybatis 的多表联合查询的,由于之前用的是 Hibernate 做的联合查询,众所周知,Hibernate 是全自动的数据库持久层框架,它可以通过实体来映射数据库,通过设置一对多、多对一、一对一、多对多的关联来实现联合查询。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t2"></a>正文</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">下面就来说一下 mybatis 是通过什么来实现多表联合查询的。首先看一下表关系,如图:</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="text-align:center;font-family:'微软雅黑';font-size:14px;line-height:21px;">
<img src="https://img-blog.csdn.net/20150525113540142?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlsZWU2Njg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><br></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">这里,我已经搭好了开发的环境,用到的是 SpringMVC + Spring + MyBatis,当然,为了简单期间,你可以不用搭前端的框架,只使用 Spring + MyBatis 就可以,外加 junit 测试即可。环境我就不带大家搭了,这里只说涉及到联合查询的操作。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">设计好表之后,我用到了 mybatis 的自动生成工具 mybatis generator 生成的实体类、mapper 接口、以及 mapper xml 文件。由于是测试多表联合查询,因此需要自己稍加改动。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">下面是 User 和 Role 的实体类代码:</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">User</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 1296px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.domain; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.io.Serializable; </span></span></li><li class=""><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> User </span><span class="keyword">implements</span><span> Serializable { </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> String id; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> String username; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> String password; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> List<Role> roles; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">long</span><span> serialVersionUID = 1L; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> String getId() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> id; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setId(String id) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.id = id == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : id.trim(); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> String getUsername() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> username; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setUsername(String username) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.username = username == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : username.trim(); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> String getPassword() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> password; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setPassword(String password) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.password = password == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : password.trim(); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> List<Role> getRoles() { </span></span></li><li class=""><span> <span class="keyword">return</span><span> roles; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setRoles(List<Role> roles) { </span></span></li><li class=""><span> <span class="keyword">this</span><span>.roles = roles; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">boolean</span><span> equals(Object that) { </span></span></li><li class="alt"><span> <span class="keyword">if</span><span> (</span><span class="keyword">this</span><span> == that) { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">true</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">if</span><span> (that == </span><span class="keyword">null</span><span>) { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">if</span><span> (getClass() != that.getClass()) { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> User other = (User) that; </span></li><li class="alt"><span> <span class="keyword">return</span><span> (</span><span class="keyword">this</span><span>.getId() == </span><span class="keyword">null</span><span> ? other.getId() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getId().equals(other.getId())) </span></span></li><li class=""><span> && (<span class="keyword">this</span><span>.getUsername() == </span><span class="keyword">null</span><span> ? other.getUsername() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getUsername().equals(other.getUsername())) </span></span></li><li class="alt"><span> && (<span class="keyword">this</span><span>.getPassword() == </span><span class="keyword">null</span><span> ? other.getPassword() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getPassword().equals(other.getPassword())); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> hashCode() { </span></span></li><li class=""><span> <span class="keyword">final</span><span> </span><span class="keyword">int</span><span> prime = </span><span class="number">31</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">int</span><span> result = </span><span class="number">1</span><span>; </span></span></li><li class=""><span> result = prime * result + ((getId() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getId().hashCode()); </span></span></li><li class="alt"><span> result = prime * result + ((getUsername() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getUsername().hashCode()); </span></span></li><li class=""><span> result = prime * result + ((getPassword() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getPassword().hashCode()); </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> result; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.domain;
import java.io.Serializable;
import java.util.List;
public class User implements Serializable {
private String id;
private String username;
private String password;
private List<Role> roles;
private static final long serialVersionUID = 1L;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id == null ? null : id.trim();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username == null ? null : username.trim();
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
@Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
User other = (User) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getUsername() == null ? other.getUsername() == null : this.getUsername().equals(other.getUsername()))
&& (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getUsername() == null) ? 0 : getUsername().hashCode());
result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());
return result;
}
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">Role</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 2799px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.domain; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.io.Serializable; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> Role </span><span class="keyword">implements</span><span> Serializable { </span></span></li><li class=""><span> <span class="keyword">private</span><span> String id; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String name; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String jsms; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String bz; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> Integer jlzt; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String glbm; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> String userid; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> </span><span class="keyword">long</span><span> serialVersionUID = 1L; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getId() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> id; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setId(String id) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.id = id == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : id.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getName() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> name; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setName(String name) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.name = name == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : name.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getJsms() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> jsms; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setJsms(String jsms) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.jsms = jsms == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : jsms.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getBz() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> bz; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setBz(String bz) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.bz = bz == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : bz.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> Integer getJlzt() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> jlzt; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setJlzt(Integer jlzt) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.jlzt = jlzt; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getGlbm() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> glbm; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setGlbm(String glbm) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.glbm = glbm == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : glbm.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> String getUserid() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> userid; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> setUserid(String userid) { </span></span></li><li class="alt"><span> <span class="keyword">this</span><span>.userid = userid == </span><span class="keyword">null</span><span> ? </span><span class="keyword">null</span><span> : userid.trim(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">boolean</span><span> equals(Object that) { </span></span></li><li class=""><span> <span class="keyword">if</span><span> (</span><span class="keyword">this</span><span> == that) { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">if</span><span> (that == </span><span class="keyword">null</span><span>) { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">if</span><span> (getClass() != that.getClass()) { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> Role other = (Role) that; </span></li><li class=""><span> <span class="keyword">return</span><span> (</span><span class="keyword">this</span><span>.getId() == </span><span class="keyword">null</span><span> ? other.getId() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getId().equals(other.getId())) </span></span></li><li class="alt"><span> && (<span class="keyword">this</span><span>.getName() == </span><span class="keyword">null</span><span> ? other.getName() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getName().equals(other.getName())) </span></span></li><li class=""><span> && (<span class="keyword">this</span><span>.getJsms() == </span><span class="keyword">null</span><span> ? other.getJsms() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getJsms().equals(other.getJsms())) </span></span></li><li class="alt"><span> && (<span class="keyword">this</span><span>.getBz() == </span><span class="keyword">null</span><span> ? other.getBz() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getBz().equals(other.getBz())) </span></span></li><li class=""><span> && (<span class="keyword">this</span><span>.getJlzt() == </span><span class="keyword">null</span><span> ? other.getJlzt() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getJlzt().equals(other.getJlzt())) </span></span></li><li class="alt"><span> && (<span class="keyword">this</span><span>.getGlbm() == </span><span class="keyword">null</span><span> ? other.getGlbm() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getGlbm().equals(other.getGlbm())) </span></span></li><li class=""><span> && (<span class="keyword">this</span><span>.getUserid() == </span><span class="keyword">null</span><span> ? other.getUserid() == </span><span class="keyword">null</span><span> : </span><span class="keyword">this</span><span>.getUserid().equals(other.getUserid())); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">int</span><span> hashCode() { </span></span></li><li class="alt"><span> <span class="keyword">final</span><span> </span><span class="keyword">int</span><span> prime = </span><span class="number">31</span><span>; </span></span></li><li class=""><span> <span class="keyword">int</span><span> result = </span><span class="number">1</span><span>; </span></span></li><li class="alt"><span> result = prime * result + ((getId() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getId().hashCode()); </span></span></li><li class=""><span> result = prime * result + ((getName() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getName().hashCode()); </span></span></li><li class="alt"><span> result = prime * result + ((getJsms() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getJsms().hashCode()); </span></span></li><li class=""><span> result = prime * result + ((getBz() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getBz().hashCode()); </span></span></li><li class="alt"><span> result = prime * result + ((getJlzt() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getJlzt().hashCode()); </span></span></li><li class=""><span> result = prime * result + ((getGlbm() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getGlbm().hashCode()); </span></span></li><li class="alt"><span> result = prime * result + ((getUserid() == <span class="keyword">null</span><span>) ? </span><span class="number">0</span><span> : getUserid().hashCode()); </span></span></li><li class=""><span> <span class="keyword">return</span><span> result; </span></span></li><li class="alt"><span> } </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.domain;
import java.io.Serializable;
public class Role implements Serializable {
private String id;
private String name;
private String jsms;
private String bz;
private Integer jlzt;
private String glbm;
private String userid;
private static final long serialVersionUID = 1L;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id == null ? null : id.trim();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public String getJsms() {
return jsms;
}
public void setJsms(String jsms) {
this.jsms = jsms == null ? null : jsms.trim();
}
public String getBz() {
return bz;
}
public void setBz(String bz) {
this.bz = bz == null ? null : bz.trim();
}
public Integer getJlzt() {
return jlzt;
}
public void setJlzt(Integer jlzt) {
this.jlzt = jlzt;
}
public String getGlbm() {
return glbm;
}
public void setGlbm(String glbm) {
this.glbm = glbm == null ? null : glbm.trim();
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid == null ? null : userid.trim();
}
@Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
Role other = (Role) that;
return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
&& (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
&& (this.getJsms() == null ? other.getJsms() == null : this.getJsms().equals(other.getJsms()))
&& (this.getBz() == null ? other.getBz() == null : this.getBz().equals(other.getBz()))
&& (this.getJlzt() == null ? other.getJlzt() == null : this.getJlzt().equals(other.getJlzt()))
&& (this.getGlbm() == null ? other.getGlbm() == null : this.getGlbm().equals(other.getGlbm()))
&& (this.getUserid() == null ? other.getUserid() == null : this.getUserid().equals(other.getUserid()));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
result = prime * result + ((getJsms() == null) ? 0 : getJsms().hashCode());
result = prime * result + ((getBz() == null) ? 0 : getBz().hashCode());
result = prime * result + ((getJlzt() == null) ? 0 : getJlzt().hashCode());
result = prime * result + ((getGlbm() == null) ? 0 : getGlbm().hashCode());
result = prime * result + ((getUserid() == null) ? 0 : getUserid().hashCode());
return result;
}
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">首先讲一下业务,这里用到的 User 、Role 的对应关系是,一个用户有多个角色,也就是 User : Role 是 1 : n 的关系。因此,在 User 的实体中加入一个 Role 的属性,对应一对多的关系。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">然后就是 mapper 接口和 xml 文件了:</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">mapper接口</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">UserMapper</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 5127px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.mapper; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.domain.User; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> UserMapper { </span></span></li><li class=""><span> <span class="keyword">int</span><span> deleteByPrimaryKey(String id); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">int</span><span> insert(User record); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">int</span><span> insertSelective(User record); </span></span></li><li class="alt"><span> </span></li><li class=""><span> User selectByPrimaryKey(String id); </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">int</span><span> updateByPrimaryKeySelective(User record); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">int</span><span> updateByPrimaryKey(User record); </span></span></li><li class="alt"><span> </span></li><li class=""><span> List<User> queryForList(); </span></li><li class="alt"><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.mapper;
import com.sica.domain.User;
import java.util.List;
public interface UserMapper {
int deleteByPrimaryKey(String id);
int insert(User record);
int insertSelective(User record);
User selectByPrimaryKey(String id);
int updateByPrimaryKeySelective(User record);
int updateByPrimaryKey(User record);
List<User> queryForList();
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">mapper xml文件</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">UserMapper</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 168px; top: 5661px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">span</span><span> </span><span class="attribute">style</span><span>=</span><span class="attribute-value">"font-family:Comic Sans MS;font-size:12px;"</span><span class="tag">></span><span class="tag"><?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span> </span><span class="tag">?></span><span> </span></span></li><li class=""><span><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" <span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"><</span><span class="tag-name">mapper</span><span> </span><span class="attribute">namespace</span><span>=</span><span class="attribute-value">"com.sica.mapper.UserMapper"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">resultMap</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"BaseResultMap"</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">id</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">resultMap</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">resultMap</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"queryForListMap"</span><span> </span><span class="attribute">type</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">id</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"username"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"password"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">collection</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"roles"</span><span> </span><span class="attribute">javaType</span><span>=</span><span class="attribute-value">"java.util.List"</span><span> </span><span class="attribute">ofType</span><span>=</span><span class="attribute-value">"com.sica.domain.Role"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">id</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_id"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"id"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_name"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"name"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_jsms"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"jsms"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_bz"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"bz"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_jlzt"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"jlzt"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"INTEGER"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">result</span><span> </span><span class="attribute">column</span><span>=</span><span class="attribute-value">"r_glbm"</span><span> </span><span class="attribute">property</span><span>=</span><span class="attribute-value">"glbm"</span><span> </span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">"VARCHAR"</span><span> </span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">collection</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">resultMap</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">select</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"queryForList"</span><span> </span><span class="attribute">resultMap</span><span>=</span><span class="attribute-value">"queryForListMap"</span><span class="tag">></span><span> </span></span></li><li class=""><span> SELECT </span></li><li class="alt"><span> u.id, </span></li><li class=""><span> u.username, </span></li><li class="alt"><span> u.password, </span></li><li class=""><span> r.id r_id, </span></li><li class="alt"><span> r.name r_name, </span></li><li class=""><span> r.jsms r_jsms, </span></li><li class="alt"><span> r.bz r_bz, </span></li><li class=""><span> r.jlzt r_jlzt, </span></li><li class="alt"><span> r.glbm r_glbm </span></li><li class=""><span> FROM </span></li><li class="alt"><span> user u </span></li><li class=""><span> LEFT JOIN </span></li><li class="alt"><span> role r </span></li><li class=""><span> ON </span></li><li class="alt"><span> <span class="attribute">u.id</span><span> = </span><span class="attribute-value">r</span><span>.userid </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">select</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">sql</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"Base_Column_List"</span><span class="tag">></span><span> </span></span></li><li class=""><span> id, username, password </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">sql</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">select</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"selectByPrimaryKey"</span><span> </span><span class="attribute">resultMap</span><span>=</span><span class="attribute-value">"BaseResultMap"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"java.lang.String"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> select </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">include</span><span> </span><span class="attribute">refid</span><span>=</span><span class="attribute-value">"Base_Column_List"</span><span class="tag">/></span><span> </span></span></li><li class="alt"><span> from user </span></li><li class=""><span> where <span class="attribute">id</span><span> = #{id,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">select</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">delete</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"deleteByPrimaryKey"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"java.lang.String"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> delete from user </span></li><li class=""><span> where <span class="attribute">id</span><span> = #{id,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">delete</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">insert</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"insert"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> insert into user (id, username, password </span></li><li class=""><span> ) </span></li><li class="alt"><span> values (#{id,<span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, #{username,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, #{password,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class=""><span> ) </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">insert</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">insert</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"insertSelective"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> insert into user </span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">trim</span><span> </span><span class="attribute">prefix</span><span>=</span><span class="attribute-value">"("</span><span> </span><span class="attribute">suffix</span><span>=</span><span class="attribute-value">")"</span><span> </span><span class="attribute">suffixOverrides</span><span>=</span><span class="attribute-value">","</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"id != null"</span><span class="tag">></span><span> </span></span></li><li class=""><span> id, </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"username != null"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> username, </span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"password != null"</span><span class="tag">></span><span> </span></span></li><li class=""><span> password, </span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">trim</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">trim</span><span> </span><span class="attribute">prefix</span><span>=</span><span class="attribute-value">"values ("</span><span> </span><span class="attribute">suffix</span><span>=</span><span class="attribute-value">")"</span><span> </span><span class="attribute">suffixOverrides</span><span>=</span><span class="attribute-value">","</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"id != null"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> #{id,<span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"username != null"</span><span class="tag">></span><span> </span></span></li><li class=""><span> #{username,<span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"password != null"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> #{password,<span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">trim</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">insert</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">update</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"updateByPrimaryKeySelective"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class=""><span> update user </span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">set</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"username != null"</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="attribute">username</span><span> = #{username,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">if</span><span> </span><span class="attribute">test</span><span>=</span><span class="attribute-value">"password != null"</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="attribute">password</span><span> = #{password,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">if</span><span class="tag">></span><span> </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">set</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> where <span class="attribute">id</span><span> = #{id,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">update</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">update</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"updateByPrimaryKey"</span><span> </span><span class="attribute">parameterType</span><span>=</span><span class="attribute-value">"com.sica.domain.User"</span><span class="tag">></span><span> </span></span></li><li class=""><span> update user </span></li><li class="alt"><span> set <span class="attribute">username</span><span> = #{username,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>}, </span></span></li><li class=""><span> <span class="attribute">password</span><span> = #{password,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class="alt"><span> where <span class="attribute">id</span><span> = #{id,</span><span class="attribute">jdbcType</span><span>=</span><span class="attribute-value">VARCHAR</span><span>} </span></span></li><li class=""><span> <span class="tag"></</span><span class="tag-name">update</span><span class="tag">></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">mapper</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">span</span><span class="tag">></span><span> </span></span></li></ol></div><pre class="html" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;"><?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sica.mapper.UserMapper">
<resultMap id="BaseResultMap" type="com.sica.domain.User">
<id column="id" property="id" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
</resultMap>
<resultMap id="queryForListMap" type="com.sica.domain.User">
<id column="id" property="id" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
<collection property="roles" javaType="java.util.List" ofType="com.sica.domain.Role">
<id column="r_id" property="id" jdbcType="VARCHAR" />
<result column="r_name" property="name" jdbcType="VARCHAR" />
<result column="r_jsms" property="jsms" jdbcType="VARCHAR" />
<result column="r_bz" property="bz" jdbcType="VARCHAR" />
<result column="r_jlzt" property="jlzt" jdbcType="INTEGER" />
<result column="r_glbm" property="glbm" jdbcType="VARCHAR" />
</collection>
</resultMap>
<select id="queryForList" resultMap="queryForListMap">
SELECT
u.id,
u.username,
u.password,
r.id r_id,
r.name r_name,
r.jsms r_jsms,
r.bz r_bz,
r.jlzt r_jlzt,
r.glbm r_glbm
FROM
user u
LEFT JOIN
role r
ON
u.id = r.userid
</select>
<sql id="Base_Column_List">
id, username, password
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String">
select
<include refid="Base_Column_List"/>
from user
where id = #{id,jdbcType=VARCHAR}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
delete from user
where id = #{id,jdbcType=VARCHAR}
</delete>
<insert id="insert" parameterType="com.sica.domain.User">
insert into user (id, username, password
)
values (#{id,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}
)
</insert>
<insert id="insertSelective" parameterType="com.sica.domain.User">
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="username != null">
username,
</if>
<if test="password != null">
password,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=VARCHAR},
</if>
<if test="username != null">
#{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
#{password,jdbcType=VARCHAR},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.sica.domain.User">
update user
<set>
<if test="username != null">
username = #{username,jdbcType=VARCHAR},
</if>
<if test="password != null">
password = #{password,jdbcType=VARCHAR},
</if>
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey" parameterType="com.sica.domain.User">
update user
set username = #{username,jdbcType=VARCHAR},
password = #{password,jdbcType=VARCHAR}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper></span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">之后,我扩展了一个 Dao 接口,当然,你也可以直接使用 mapper 接口,都是一样的。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">Dao 接口</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">IUserDao</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 7724px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.dao; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.mapper.UserMapper; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * Created by IntelliJ IDEA.</span> </span></li><li class="alt"><span><span class="comment"> * Package: com.sica.dao</span> </span></li><li class=""><span><span class="comment"> * Name: IUserDao</span> </span></li><li class="alt"><span><span class="comment"> * User: xiang.li</span> </span></li><li class=""><span><span class="comment"> * Date: 2015/5/22</span> </span></li><li class="alt"><span><span class="comment"> * Time: 15:25</span> </span></li><li class=""><span><span class="comment"> * Desc: To change this template use File | Settings | File Templates.</span> </span></li><li class="alt"><span><span class="comment"> */</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> IUserDao </span><span class="keyword">extends</span><span> UserMapper { </span></span></li><li class="alt"><span> </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.dao;
import com.sica.mapper.UserMapper;
/**
* Created by IntelliJ IDEA.
* Package: com.sica.dao
* Name: IUserDao
* User: xiang.li
* Date: 2015/5/22
* Time: 15:25
* Desc: To change this template use File | Settings | File Templates.
*/
public interface IUserDao extends UserMapper {
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">下面就是 service 和实现层的代码了。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">IUserService</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 8164px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.service; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.domain.User; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * Created by xiang.li on 2015/1/31.</span> </span></li><li class="alt"><span><span class="comment"> */</span><span> </span></span></li><li class=""><span><span class="keyword">public</span><span> </span><span class="keyword">interface</span><span> IUserService { </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">/**</span> </span></li><li class="alt"><span><span class="comment"> * 根据Id查询用户对象</span> </span></li><li class=""><span><span class="comment"> * @param id 编号</span> </span></li><li class="alt"><span><span class="comment"> * @return 用户对象</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span> User getUserById(String id); </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * 根据用户名查询用户对象</span> </span></li><li class="alt"><span><span class="comment"> * @return List</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span> List<User> queryUserList(); </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.service;
import com.sica.domain.User;
import java.util.List;
/**
* Created by xiang.li on 2015/1/31.
*/
public interface IUserService {
/**
* 根据Id查询用户对象
* @param id 编号
* @return 用户对象
*/
User getUserById(String id);
/**
* 根据用户名查询用户对象
* @return List
*/
List<User> queryUserList();
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">UserServiceImpl</div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 8707px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_7" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_7" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=7&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.service.impl; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.dao.IUserDao; </span></span></li><li class=""><span><span class="keyword">import</span><span> com.sica.domain.User; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.service.IUserService; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.stereotype.Service; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="keyword">import</span><span> javax.annotation.Resource; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="comment">/**</span> </span></li><li class=""><span><span class="comment"> * Created by xiang.li on 2015/1/31.</span> </span></li><li class="alt"><span><span class="comment"> */</span><span> </span></span></li><li class=""><span><span class="annotation">@Service</span><span>(</span><span class="string">"userService"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> UserServiceImpl </span><span class="keyword">implements</span><span> IUserService { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Resource</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> IUserDao userDao; </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Override</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> User getUserById(String id) { </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">this</span><span>.userDao.selectByPrimaryKey(id); </span></span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="annotation">@Override</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> List<User> queryUserList() { </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> userDao.queryForList(); </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.service.impl;
import com.sica.dao.IUserDao;
import com.sica.domain.User;
import com.sica.service.IUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by xiang.li on 2015/1/31.
*/
@Service("userService")
public class UserServiceImpl implements IUserService {
@Resource
public IUserDao userDao;
@Override
public User getUserById(String id) {
return this.userDao.selectByPrimaryKey(id);
}
@Override
public List<User> queryUserList() {
return userDao.queryForList();
}
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">当然,还有所谓的 applicationContext.xml 配置,不过,我这里叫 spring-mybatis.xml。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="line-height:21px;"><div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><b>[html]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 168px; top: 9385px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_8" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_8" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=8&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">span</span><span> </span><span class="attribute">style</span><span>=</span><span class="attribute-value">"font-family:Comic Sans MS;font-size:12px;"</span><span class="tag">></span><span class="tag"><?</span><span class="tag-name">xml</span><span> </span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span> </span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?></span><span> </span></span></li><li class=""><span><span class="tag"><</span><span class="tag-name">beans</span><span> </span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/beans"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span> </span></span></li><li class=""><span> <span class="attribute">xmlns:p</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/p"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">xmlns:context</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/context"</span><span> </span></span></li><li class=""><span> <span class="attribute">xmlns:mvc</span><span>=</span><span class="attribute-value">"http://www.springframework.org/schema/mvc"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">xsi:schemaLocation</span><span>="http://www.springframework.org/schema/beans </span></span></li><li class=""><span> http://www.springframework.org/schema/beans/spring-beans.xsd </span></li><li class="alt"><span> http://www.springframework.org/schema/context </span></li><li class=""><span> http://www.springframework.org/schema/context/spring-context.xsd </span></li><li class="alt"><span> http://www.springframework.org/schema/mvc </span></li><li class=""><span> http://www.springframework.org/schema/mvc/spring-mvc.xsd"<span class="tag">></span><span> </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comments"><!-- 自动扫描 --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">context:component-scan</span><span> </span><span class="attribute">base-package</span><span>=</span><span class="attribute-value">"com.sica"</span><span class="tag">/></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- 引入配置文件 --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"propertyConfigurer"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:location</span><span>=</span><span class="attribute-value">"classpath:jdbc.properties"</span><span> </span></span></li><li class="alt"><span> <span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- 配置数据库连接池 --></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- 初始化连接大小 --></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- 连接池最大数量 --></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- 连接池最大空闲 --></span><span> </span></span></li><li class="alt"><span> <span class="comments"><!-- 连接池最小空闲 --></span><span> </span></span></li><li class=""><span> <span class="comments"><!-- 获取连接最大等待时间 --></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"dataSource"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.commons.dbcp.BasicDataSource"</span><span> </span><span class="attribute">destroy-method</span><span>=</span><span class="attribute-value">"close"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:driverClassName</span><span>=</span><span class="attribute-value">"${jdbc.driver}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:url</span><span>=</span><span class="attribute-value">"${jdbc.url}"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:username</span><span>=</span><span class="attribute-value">"${jdbc.username}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:password</span><span>=</span><span class="attribute-value">"${jdbc.password}"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:initialSize</span><span>=</span><span class="attribute-value">"${jdbc.initialSize}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:maxActive</span><span>=</span><span class="attribute-value">"${jdbc.maxActive}"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:maxIdle</span><span>=</span><span class="attribute-value">"${jdbc.maxIdle}"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:minIdle</span><span>=</span><span class="attribute-value">"${jdbc.minIdle}"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:maxWait</span><span>=</span><span class="attribute-value">"${jdbc.maxWait}"</span><span> </span></span></li><li class="alt"><span> <span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"sqlSessionFactory"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.mybatis.spring.SqlSessionFactoryBean"</span><span> </span><span class="attribute">lazy-init</span><span>=</span><span class="attribute-value">"default"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:dataSource-ref</span><span>=</span><span class="attribute-value">"dataSource"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:mapperLocations</span><span>=</span><span class="attribute-value">"classpath:com/sica/mapping/*.xml"</span><span> </span></span></li><li class="alt"><span> <span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- DAO接口所在包名,Spring会自动查找其下的类 --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:basePackage</span><span>=</span><span class="attribute-value">"com.sica.dao"</span><span> </span></span></li><li class=""><span> <span class="attribute">p:sqlSessionFactoryBeanName</span><span>=</span><span class="attribute-value">"sqlSessionFactory"</span><span> </span></span></li><li class="alt"><span> <span class="tag">/></span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comments"><!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --></span><span> </span></span></li><li class=""><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">id</span><span>=</span><span class="attribute-value">"transactionManager"</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span> </span></span></li><li class="alt"><span> <span class="attribute">p:dataSource-ref</span><span>=</span><span class="attribute-value">"dataSource"</span><span> </span></span></li><li class=""><span> <span class="tag">/></span><span> </span></span></li><li class="alt"><span><span class="tag"></</span><span class="tag-name">beans</span><span class="tag">></span><span class="tag"></</span><span class="tag-name">span</span><span class="tag">></span><span> </span></span></li></ol></div><pre class="html" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.sica"/>
<!-- 引入配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="classpath:jdbc.properties"
/>
<!-- 配置数据库连接池 -->
<!-- 初始化连接大小 -->
<!-- 连接池最大数量 -->
<!-- 连接池最大空闲 -->
<!-- 连接池最小空闲 -->
<!-- 获取连接最大等待时间 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:initialSize="${jdbc.initialSize}"
p:maxActive="${jdbc.maxActive}"
p:maxIdle="${jdbc.maxIdle}"
p:minIdle="${jdbc.minIdle}"
p:maxWait="${jdbc.maxWait}"
/>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" lazy-init="default"
p:dataSource-ref="dataSource"
p:mapperLocations="classpath:com/sica/mapping/*.xml"
/>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="com.sica.dao"
p:sqlSessionFactoryBeanName="sqlSessionFactory"
/>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
/>
</beans></span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">最后,我用到的是 junit 进行的测试,测试代码如下。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br>
GetUserTest<br style="background-color:inherit;"></div>
<div style="line-height:21px;"><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 166px; top: 10541px; width: 16px; height: 16px; z-index: 99;"><embed id="ZeroClipboardMovie_9" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_9" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=9&width=16&height=16" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a></div></div><ol start="1" class="dp-j"><li class="alt"><span><span><span style=</span><span class="string">"font-family:Comic Sans MS;font-size:12px;"</span><span>></span><span class="keyword">package</span><span> com.sica.user; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> com.alibaba.fastjson.JSON; </span></span></li><li class=""><span><span class="keyword">import</span><span> com.sica.domain.User; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> com.sica.service.IUserService; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.junit.Test; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.junit.runner.RunWith; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.slf4j.Logger; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.slf4j.LoggerFactory; </span></span></li><li class=""><span><span class="keyword">import</span><span> org.springframework.test.context.ContextConfiguration; </span></span></li><li class="alt"><span><span class="keyword">import</span><span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">import</span><span> javax.annotation.Resource; </span></span></li><li class=""><span><span class="keyword">import</span><span> java.util.List; </span></span></li><li class="alt"><span> </span></li><li class=""><span><span class="comment">/**</span> </span></li><li class="alt"><span><span class="comment"> * Created by xiang.li on 2015/2/1.</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span><span class="annotation">@RunWith</span><span>(SpringJUnit4ClassRunner.</span><span class="keyword">class</span><span>) </span></span></li><li class=""><span><span class="annotation">@ContextConfiguration</span><span>(locations = </span><span class="string">"classpath:spring-mybatis.xml"</span><span>) </span></span></li><li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> GetUserTest { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> String UUID = </span><span class="string">"3"</span><span>; </span></span></li><li class=""><span> <span class="annotation">@Resource</span><span> </span></span></li><li class="alt"><span> <span class="keyword">private</span><span> IUserService userService; </span></span></li><li class=""><span> <span class="keyword">private</span><span> </span><span class="keyword">static</span><span> Logger logger = LoggerFactory.getLogger(GetUserTest.</span><span class="keyword">class</span><span>); </span></span></li><li class="alt"><span> </span></li><li class=""><span> <span class="annotation">@Test</span><span> </span></span></li><li class="alt"><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> test() { </span></span></li><li class=""><span> User user = userService.getUserById(UUID); </span></li><li class="alt"><span> logger.info(JSON.toJSONString(user)); </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">/**</span> </span></li><li class="alt"><span><span class="comment"> * 测试联合查询</span> </span></li><li class=""><span><span class="comment"> */</span><span> </span></span></li><li class="alt"><span> <span class="annotation">@Test</span><span> </span></span></li><li class=""><span> <span class="keyword">public</span><span> </span><span class="keyword">void</span><span> test2() { </span></span></li><li class="alt"><span> List<User> users = userService.queryUserList(); </span></li><li class=""><span> logger.info(JSON.toJSONString(users)); </span></li><li class="alt"><span> } </span></li><li class=""><span>}</span> </span></li></ol></div><pre class="java" name="code" style="display: none;"><span style="font-family:Comic Sans MS;font-size:12px;">package com.sica.user;
import com.alibaba.fastjson.JSON;
import com.sica.domain.User;
import com.sica.service.IUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.List;
/**
* Created by xiang.li on 2015/2/1.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-mybatis.xml")
public class GetUserTest {
private static String UUID = "3";
@Resource
private IUserService userService;
private static Logger logger = LoggerFactory.getLogger(GetUserTest.class);
@Test
public void test() {
User user = userService.getUserById(UUID);
logger.info(JSON.toJSONString(user));
}
/**
* 测试联合查询
*/
@Test
public void test2() {
List<User> users = userService.queryUserList();
logger.info(JSON.toJSONString(users));
}
}</span></pre></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t3"></a>测试结果</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="text-align:center;font-family:'微软雅黑';font-size:14px;line-height:21px;">
<img src="https://img-blog.csdn.net/20150525114801761?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlsZWU2Njg4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">可以看到,所有的用户和用户对应的角色都全部查出来了,这说明,这次的测试很成功。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t4"></a>关于优化</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">对于优化嘛,我这里简单的提几点,大家可以考虑一下。首先,就是对表的设计,在设计表初期,不仅仅要考虑到数据库的规范性,还好考虑到所谓的业务,以及对性能的影响,比如,如果从规范性角度考虑的话,可能就会分多个表,但是如果从性能角度来考虑的话,庞大的数据量在多表联合查询的时候,相对于单表来说,就会慢很多,这时,如果字段不是很多的话,可以考虑冗余几个字段采用单表的设计。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">其次嘛,就是在 sql 上下功夫了,对于联合查询,sql 的优化是很有必要的,到底是采用 INNER JOIN,还是采用 LEFT JOIN 亦或是 RIGHT JOIN 、OUTTER JOIN 等,都是要在满足业务需求之后,通过测试性能得出的结论。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">再次嘛,就是在程序中调用的时候了,是采用懒加载,还是采用非懒加载的方式,这也算是一个因素吧,具体的还是要考虑业务的需要。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">最后嘛,就要用到数据库的缓存了,或者在数据库与程序的中间再加一层缓存。不过,还是建议用好数据库本身自带的缓存功能。</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<h1 style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><a name="t5"></a>结束语</h1>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br style="background-color:inherit;"></div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;">最后的最后,还是要提醒大家,不要因为觉得简单就引不起足够的重视,否则你会由于一点点小的失误,而浪费大把大把的时间的。我就在这上边体会过,所以,这里奉劝大家,还是小心为妙啊@!</div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
<div>
<div style="font-family:'微软雅黑';font-size:14px;line-height:21px;"><br></div>
</div>
</div>
</article>