一、本課目標(biāo)
- 掌握SQL映射文件的常用元素
- 掌握使用select完成(單/多)條件查詢

簡(jiǎn)介:
1、mapper,是映射文件的根節(jié)點(diǎn)。里面只有一個(gè)屬性namespace,即命名空間,通過(guò)namespace來(lái)區(qū)分不同的mapper來(lái)做到全局唯一。并且通過(guò)namespace還可以綁定相應(yīng)的DAO接口來(lái)實(shí)現(xiàn)面向接口編程。
二、mapper

有了Mapper。xml文件之后,就不用寫Mapper接口的具體實(shí)現(xiàn)類了,mybatis會(huì)通過(guò)接口的完全限定名去找到對(duì)應(yīng)的Mapper里面的sql語(yǔ)句去執(zhí)行。也就是說(shuō)namaspace的命名必須跟某個(gè)接口同名,此時(shí)接口中的方法與映射文件中sql語(yǔ)句id一一對(duì)應(yīng)。
namespace
namespace的屬性值cn.smbms.dao.user.UserMapper到底是java文件的名字還是xml文件的名字?
因?yàn)槲覀冎暗哪夸浭且韵逻@樣的:

可以進(jìn)行如下的測(cè)試:
新建一個(gè)mapper包,將UserMapper.xml放進(jìn)來(lái):

同時(shí)修改改xml文件中的namespace屬性值:

則對(duì)于單元測(cè)試的第一種方式來(lái)說(shuō):

只要將后面的字符串改為跟namespace的值相同就可以成功測(cè)試。
而對(duì)于第二種使用接口的測(cè)試方式來(lái)說(shuō)則會(huì)報(bào)錯(cuò),這時(shí)如果將mapper包下面的UserMapper.xml文件的namespace屬性值改為:
cn.smbms.dao.user.UserMapper,則可以測(cè)試成功,說(shuō)明當(dāng)使用接口的時(shí)候,程序會(huì)去找namespace的值為接口的完全限定名的mapper標(biāo)簽。
綜上,在mybatis-config.xml文件中引入U(xiǎn)serMapper.xml文件之后,當(dāng)使用select的方式去執(zhí)行操作的時(shí)候,只需要把namespace的值寫進(jìn)后面的字符串參數(shù)即可;當(dāng)使用接口的方式的時(shí)候,程序會(huì)去找接口的完全限定名,只要當(dāng)Mapper.xml中的namespace的值設(shè)置的跟接口的完全限定名即路徑一致的時(shí)候才能執(zhí)行。也就是上面的兩句話,xml文件中的namespace的值必須跟某個(gè)接口的絕對(duì)路徑相同,同時(shí)xml文件中的sql語(yǔ)句的id必須跟接口中的方法同名。
所以,可以把namespace的值寫為java文件的名字,這樣不管使用什么方法,總不會(huì)有問(wèn)題。
習(xí)慣上都會(huì)把mapper、.xml文件跟你的mapper接口放在一個(gè)包下面,并且在MyBatis里面,我們的DAO接口一般不叫作UserDao,而叫做UserMapper
三、select元素

3、1單參數(shù)查詢
在UserMapper.xml文件中增加查詢:
<!-- 根據(jù)用戶名稱查詢用戶列表(模糊查詢) -->
<select id="getUserListByUserName" parameterType="string" resultType="User">
select * from smbms_user where userName like CONCAT('%',#{userName},'%')
</select>
分析:1、參數(shù)類型是string,這個(gè)地方對(duì)大小寫不敏感。參數(shù)類型也可以是自己定義的實(shí)體類類型。
2、sql語(yǔ)句中拿到參數(shù)的方法是#{參數(shù)名},這個(gè)參數(shù)名跟測(cè)試類中傳進(jìn)來(lái)的參數(shù)名必須一樣。
3、數(shù)據(jù)庫(kù)字段名必須跟實(shí)體類字段名保持一致,這樣才能把查詢到的數(shù)據(jù)跟實(shí)體類對(duì)象一一匹配。
在UserMapper.java中增加方法:
public List<User> getUserListByUserName(String userName);
3、構(gòu)建測(cè)試類:
@Test
public void testGetUserListByUserName() {
List<User> userList = null;
SqlSession sqlSession = null;
String userName = "趙";
try {
sqlSession = MyBatisUtil.createSqlSession();
userList = sqlSession.getMapper(UserMapper.class).getUserListByUserName(userName);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for (User user:userList) {
logger.debug("testGetUserList userCode:" + user.getUserCode()
+ "and userName" + user.getUserName());
}
}
3.2多條件查詢
問(wèn)題:按條件查詢用戶表,若多條件情況先如何處理?

分析:
1、傳入多個(gè)參數(shù)進(jìn)行入?yún)ⅲ?br>
2、封裝成user對(duì)象進(jìn)行入?yún)ⅲ?/p>

使用實(shí)體類入?yún)?/h4>
示例代碼:
改造UserMapper.xml文件:
<!-- 查詢用戶列表 -->
<select id="getUserList" parameterType="user" resultType="User">
select * from smbms_user
where userName like CONCAT('%',#{userName},'%')
and userRole=#{userRole}
</select>
改造接口:
public List<User> getUserList(User user);
改造測(cè)試類;
@Test
public void testGetUserList() {
List<User> userList = null;
SqlSession sqlSession = null;
User user1 = new User();
user1.setUserName("趙");
user1.setUserRole(2);
try {
sqlSession = MyBatisUtil.createSqlSession();
// 4、調(diào)用mapper文件來(lái)對(duì)數(shù)據(jù)進(jìn)行操作,操作之前必須將mapper文件引入到mabatis-config.xml中
// userList = sqlSession.selectList("mmp.UserMapper.getUserList");
userList = sqlSession.getMapper(UserMapper.class).getUserList(user1);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for (User user:userList) {
logger.debug("testGetUserList userCode:" + user.getUserCode()
+ "and userName" + user.getUserName());
}
}
最終的運(yùn)行結(jié)果正常。
使用Map入?yún)?/h4>
在UserMapper.xml文件中增加:
<select id="getUserListByMap" parameterType="Map" resultType="User">
select * from smbms_user
where userName like CONCAT('%',#{uName},'%')
and userRole=#{uRole}
</select>
在接口中增加方法;
public List<User> getUserListByMap(Map<String, String> userMap);
實(shí)體類構(gòu)建如下:
@Test
public void testGetUserListByMap() {
List<User> userList = null;
SqlSession sqlSession = null;
Map<String, String> userMap = new HashMap<String, String>();
userMap.put("uName", "趙");
userMap.put("uRole", "2");
try {
sqlSession = MyBatisUtil.createSqlSession();
userList = sqlSession.getMapper(UserMapper.class).getUserListByMap(userMap);
} catch (Exception e) {
e.printStackTrace();
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
for (User user:userList) {
logger.debug("testGetUserList userCode:" + user.getUserCode()
+ "and userName" + user.getUserName());
}
}
單元測(cè)試正常。
3.3小結(jié)

四、總結(jié)

所以mybatis的核心就是通過(guò)核心對(duì)象sqlSession的getMapper方法獲得要找的sql語(yǔ)句的namespace+id,然后在核心配置文件引入的xml文件中去找namespace+id對(duì)應(yīng)的sql語(yǔ)句然后執(zhí)行并返回結(jié)果。如果不使用接口的話,則直接通過(guò)sqlSession的select等方法,把sql語(yǔ)句的namespace+id座位參數(shù)穿進(jìn)去,然后mybatis會(huì)直接去找這個(gè)sql語(yǔ)句。