一、本課目標
- 掌握SQL映射文件的常用元素
- 掌握使用select完成(單/多)條件查詢
簡介:
1容达、mapper古涧,是映射文件的根節(jié)點。里面只有一個屬性namespace花盐,即命名空間羡滑,通過namespace來區(qū)分不同的mapper來做到全局唯一。并且通過namespace還可以綁定相應(yīng)的DAO接口來實現(xiàn)面向接口編程算芯。
二柒昏、mapper
有了Mapper。xml文件之后熙揍,就不用寫Mapper接口的具體實現(xiàn)類了职祷,mybatis會通過接口的完全限定名去找到對應(yīng)的Mapper里面的sql語句去執(zhí)行。也就是說namaspace的命名必須跟某個接口同名,此時接口中的方法與映射文件中sql語句id一一對應(yīng)有梆。
namespace
namespace的屬性值cn.smbms.dao.user.UserMapper
到底是java文件的名字還是xml文件的名字是尖?
因為我們之前的目錄是以下這樣的:
可以進行如下的測試:
新建一個mapper包,將UserMapper.xml放進來:
同時修改改xml文件中的namespace屬性值:
則對于單元測試的第一種方式來說:
只要將后面的字符串改為跟namespace的值相同就可以成功測試泥耀。
而對于第二種使用接口的測試方式來說則會報錯饺汹,這時如果將mapper包下面的UserMapper.xml文件的namespace屬性值改為:
cn.smbms.dao.user.UserMapper
,則可以測試成功,說明當使用接口的時候痰催,程序會去找namespace的值為接口的完全限定名的mapper標簽兜辞。
綜上,在mybatis-config.xml文件中引入UserMapper.xml文件之后夸溶,當使用select的方式去執(zhí)行操作的時候弦疮,只需要把namespace的值寫進后面的字符串參數(shù)即可;當使用接口的方式的時候蜘醋,程序會去找接口的完全限定名胁塞,只要當Mapper.xml中的namespace的值設(shè)置的跟接口的完全限定名即路徑一致的時候才能執(zhí)行。也就是上面的兩句話压语,xml文件中的namespace的值必須跟某個接口的絕對路徑相同啸罢,同時xml文件中的sql語句的id必須跟接口中的方法同名。
所以胎食,可以把namespace的值寫為java文件的名字扰才,這樣不管使用什么方法,總不會有問題厕怜。
習(xí)慣上都會把mapper衩匣、.xml文件跟你的mapper接口放在一個包下面,并且在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,這個地方對大小寫不敏感缀程。參數(shù)類型也可以是自己定義的實體類類型搜吧。
2、sql語句中拿到參數(shù)的方法是#{參數(shù)名}杨凑,這個參數(shù)名跟測試類中傳進來的參數(shù)名必須一樣滤奈。
3、數(shù)據(jù)庫字段名必須跟實體類字段名保持一致撩满,這樣才能把查詢到的數(shù)據(jù)跟實體類對象一一匹配蜒程。
在UserMapper.java中增加方法:
public List<User> getUserListByUserName(String userName);
3绅你、構(gòu)建測試類:
@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多條件查詢
問題:按條件查詢用戶表,若多條件情況先如何處理搞糕?
分析:
1、傳入多個參數(shù)進行入?yún)ⅲ?br>
2曼追、封裝成user對象進行入?yún)ⅲ?/p>
使用實體類入?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);
改造測試類窍仰;
@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文件來對數(shù)據(jù)進行操作,操作之前必須將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());
}
}
最終的運行結(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);
實體類構(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());
}
}
單元測試正常。
3.3小結(jié)
四晶伦、總結(jié)
所以mybatis的核心就是通過核心對象sqlSession的getMapper方法獲得要找的sql語句的namespace+id碟狞,然后在核心配置文件引入的xml文件中去找namespace+id對應(yīng)的sql語句然后執(zhí)行并返回結(jié)果。如果不使用接口的話婚陪,則直接通過sqlSession的select等方法族沃,把sql語句的namespace+id座位參數(shù)穿進去,然后mybatis會直接去找這個sql語句泌参。