1.輸入映射和輸出映射
Mapper.xml映射文件中定義了操作數據庫的sql,每個sql是一個statement,映射文件是mybatis的核心。
1.1SqlMapConfig.xml配置文件。Mapper映射器只保留包掃描的方式
1.2parameterType(輸入類型)
1.2.1傳遞簡單類型
參考第一天內容。
使用#{}佔位符,或者${}進行sql拼接。
1.2.2傳遞pojo對象
參考第一天的內容。
Mybatis使用ognl表達式解析對象字段的值,#{}或者${}括號中的值爲pojo屬性名稱。
1.2.3傳遞pojo包裝對象
開發中通過可以使用pojo傳遞查詢條件。
查詢條件可能是綜合的查詢條件,不僅包括用戶查詢條件還包括其它的查詢條件(比如查詢用戶信息的時候,將用戶購買商品信息也作爲查詢條件),這時可以使用包裝對象傳遞輸入參數。
包裝對象:Pojo類中的一個屬性是另外一個pojo。
需求:根據用戶名模糊查詢用戶信息,查詢條件放到QueryVo的user屬性中。
1.3.1編寫QueryVo
public class QueryVo {
// 包含其他的pojo
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
1.3.2Sql語句
SELECT * FROM user WHERE username LIKE '%張%'
1.3.3Mapper.xml文件
在UserMapper.xml中配置sql,如下圖。
1.3.4Mapper接口
在UserMapper接口中添加方法,如下圖:
1.3.5測試方法
在UserMapeprTest增加測試方法,如下:
@Test
public void testQueryUserByQueryVo() {
// mybatis和spring整合,整合之後,交給spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 創建Mapper接口的動態代理對象,整合之後,交給spring管理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 使用userMapper執行查詢,使用包裝對象
QueryVo queryVo = new QueryVo();
// 設置user條件
User user = new User();
user.setUsername("張");
// 設置到包裝對象中
queryVo.setUser(user);
// 執行查詢
List<User> list = userMapper.queryUserByQueryVo(queryVo);
for (User u : list) {
System.out.println(u);
}
// mybatis和spring整合,整合之後,交給spring管理
sqlSession.close();
}
2.resultType(輸出類型)
2.1輸出簡單類型
需求:查詢用戶表數據條數
sql:SELECT count(*) FROM `user`
2.1.1Mapper.xml文件
在UserMapper.xml中配置sql,如下圖:
2.1.2Mapper接口
在UserMapper添加方法,如下圖:
2.1.3測試方法
在UserMapeprTest增加測試方法,如下:
@Test
public void testQueryUserCount() {
// mybatis和spring整合,整合之後,交給spring管理
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 創建Mapper接口的動態代理對象,整合之後,交給spring管理
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 使用userMapper執行查詢用戶數據條數
int count = userMapper.queryUserCount();
System.out.println(count);
// mybatis和spring整合,整合之後,交給spring管理
sqlSession.close();
}
2.1.4效果
測試結果如下圖:
注意:輸出簡單類型必須查詢出來的結果集有一條記錄,最終將第一個字段的值轉換爲輸出類型。
3.resultMap
resultType可以指定將查詢結果映射爲pojo,但需要pojo的屬性名和sql查詢的列名一致方可映射成功。
如果sql查詢字段名和pojo的屬性名不一致,可以通過resultMap將字段名和屬性名作一個對應關係 ,resultMap實質上還需要將查詢結果映射到pojo對象中。
resultMap可以實現將查詢結果映射爲複雜類型的pojo,比如在查詢結果映射對象中包括pojo和list實現一對一查詢和一對多查詢。
需求:查詢訂單表order的所有數據
sql:SELECT id, user_id, number, createtime, note FROM `order`
3.1聲明pojo對象
數據庫表如下圖:
3.1.1Order對象:
3.1.2Mapper.xml文件
創建OrderMapper.xml配置文件,如下:
<?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">
<!-- namespace:命名空間,用於隔離sql,還有一個很重要的作用,Mapper動態代理開發的時候使用,需要指定Mapper的類路徑 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper">
<!-- 查詢所有的訂單數據 -->
<select id="queryOrderAll" resultType="order">
SELECT id, user_id,
number,
createtime, note FROM `order`
</select>
</mapper>
3.1.3Mapper接口
編寫接口如下:
public interface OrderMapper {
/**
* 查詢所有訂單
*
* @return
*/
List<Order> queryOrderAll();
}
3.1.4測試方法
編寫測試方法OrderMapperTest如下:
public class OrderMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testQueryAll() {
// 獲取sqlSession
SqlSession sqlSession = this.sqlSessionFactory.openSession();
// 獲取OrderMapper
OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
// 執行查詢
List<Order> list = orderMapper.queryOrderAll();
for (Order order : list) {
System.out.println(order);
}
}
}
3.1.5效果
測試效果如下圖:
發現userId爲null
解決方案:使用resultMap
3.1.6使用resultMap
由於上邊的mapper.xml中sql查詢列(user_id)和Order類屬性(userId)不一致,所以查詢結果不能映射到pojo中。
需要定義resultMap,把orderResultMap將sql查詢列(user_id)和Order類屬性(userId)對應起來
改造OrderMapper.xml,如下:
<?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">
<!-- namespace:命名空間,用於隔離sql,還有一個很重要的作用,Mapper動態代理開發的時候使用,需要指定Mapper的類路徑 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper">
<!-- resultMap最終還是要將結果映射到pojo上,type就是指定映射到哪一個pojo -->
<!-- id:設置ResultMap的id -->
<resultMap type="order" id="orderResultMap">
<!-- 定義主鍵 ,非常重要。如果是多個字段,則定義多個id -->
<!-- property:主鍵在pojo中的屬性名 -->
<!-- column:主鍵在數據庫中的列名 -->
<id property="id" column="id" />
<!-- 定義普通屬性 -->
<result property="userId" column="user_id" />
<result property="number" column="number" />
<result property="createtime" column="createtime" />
<result property="note" column="note" />
</resultMap>
<!-- 查詢所有的訂單數據 -->
<select id="queryOrderAll" resultMap="orderResultMap">
SELECT id, user_id,
number,
createtime, note FROM `order`
</select>
</mapper>
效果
只需要修改Mapper.xml就可以了,再次測試結果如下: