Mybatis(4)輸入映射和輸出映射

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.3​​​​​​​Mapper.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.1​​​​​​​​​​​​​​Mapper.xml文件

在UserMapper.xml中配置sql,如下圖:

​​​​​​​​​​​​​​2.1.2​​​​​​​​​​​​​​Mapper接口

在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.2​​​​​​​Mapper.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.3​​​​​​​​​​​​​​​​​​​​​Mapper接口

編寫接口如下:

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就可以了,再次測試結果如下:

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章