上一篇寫到Mybatis動態代理實現Dao和一些Mybatis的一些配置,下來我們將接着上一篇講到的Mybatis的參數傳遞和文件配置。
包裝pojo
爲什會需要包裝pojo呢,包裝pojo主要是用於一些複雜查詢,它可以將你需要用到的pojo包裝進去,可以在查詢時從pojo裏調屬性。下來就用一個包裝pojo的實例分析:
1.配置Mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--<properties resource="jdbc.properties">-->
<!--加載配置文件,${}表達式,先加載在此文件的配置,後加載外部的配置文件-->
<!--<property name="xx" value="xxx"/>-->
<!--</properties>-->
<!--配置別名,別名不區分大小寫-->
<typeAliases>
<!--給pojo.user起別名,不區分大小寫-->
<!--<typeAlias type="pojo.User" alias="USER"/>-->
<!--別名就是類名,不區分大小寫,推薦-->
<package name="pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理 -->
<transactionManager type="JDBC"/>
<!-- 數據庫連接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="wrial.qq.com"/>
</dataSource>
</environment>
</environments>
<!--加載映射文件-->
<mappers>
<mapper resource="user.xml"/>
<!--<mapper resource="UserMapper.xml"/>-->
<!--映射文件類掃描
1.接口文件和映射文件必須在同一目錄下
2.接口文件和映射文件的命名必須一致
-->
<!--<mapper class="DaoProxy.UserMapper" />-->
<package name="DaoProxy"/>
</mappers>
</configuration>
2.建立擴展類,擴展實現額外的一些功能(如果沒有需求也不用寫擴展類)
package pojo;
public class UserAdd extends User {
//可以添加User之外的東西,作爲擴展類來使用
private String nearPeopel;
public String getNearPeopel() {
return nearPeopel;
}
public void setNearPeopel(String nearPeopel) {
this.nearPeopel = nearPeopel;
}
}
3.使用包裝類,包裝pojo
(1)沒使用擴展類
package pojo;
public class UserQuaryVo {
private User user;
private Order order;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
}
(2)使用擴展類:可以對pojo做一個整合,可以接受複雜的數據進行查詢操作
package pojo;
public class UserQuaryVo {
private UserAdd userAdd;
private Order order;
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public UserAdd getUserAdd() {
return userAdd;
}
public void setUserAdd(UserAdd userAdd) {
this.userAdd = userAdd;
}
}
4.在Mapper中編寫sql
<select id="getUserByQuaryVo" parameterType="userquaryvo" resultType="user">
select *
from user
where id = #{user.id}
</select>
5.編寫測試類
@Test
public void testGetUserById() throws IOException {
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory("SqlMapCofig.xml");
SqlSession sqlSession = sqlSessionFactory.openSession();
UserQuaryVo quaryVo = new UserQuaryVo();
UserAdd userAdd = new UserAdd();
userAdd.setId(1);
quaryVo.setUserAdd(userAdd);
User user = sqlSession.selectOne("DaoProxy.UserMapper.getUserByQuaryVo", quaryVo.getUserAdd().getId());
System.out.println(user.toString());
sqlSession.close();
}
上邊就是包裝pojo的全過程,在需求複雜的情況下會遇到。
ResultMap入門之使用ResultMap解決數據庫和pojo數據類型不符合問題
下邊用實例來處理這一問題,基於在覈心文件配置包掃描
先不配置類型一致,會出現如下錯誤(我設置pojo的userId和數據庫中user_id),userId不能匹配,所以無法賦值
下來在xml配置resultMap
OrderMapper.xml
<mapper namespace="DaoProxy.OrderMapper">
<resultMap id="GetOrderList" type="order">
<!--id用於映射主鍵-->
<!--<id property="id" column="id"/>-->
<!--result 映射普通字段-->
<result property="userId" column="user_id"/>
</resultMap>
<select id="GetOrders" resultMap="GetOrderList">
SELECT *
FROM `order`;
</select>
</mapper>
測試類
@Test
public void testGetOrders() throws IOException {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory("SqlMapCofig.xml").openSession();
List<Order> orders = sqlSession.selectList("DaoProxy.OrderMapper.GetOrders");
for (Order order1 : orders
) {
System.out.println(order1.toString());
}
}
解決後結果如下:
注:在單表查詢可以只寫需要改的屬性,因爲在<resultMap id="GetOrderList" type="order">定義了類型,多表就不能這樣了
動態sql語句
爲什麼說mybatis用起來好用,其中有很大一部分原因是它可以簡單的使用動態sql語句,下來我們就來學習一下動態sql。
if標籤(用法和基礎裏if大同小異)
映射文件(實現多條件查詢):注意要在where後加1=1,因爲如果沒有篩選到就查詢全部。
<select id="getUserByIfPojo" parameterType="user" resultType="User">
select *
from user
where 1=1
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
<if test="sex!=null and sex!=''">
and sex=#{sex}
</if>
</select>
測試類
@Test
public void testGet() throws IOException {
SqlSession sqlSession = SqlSessionUtils.getSqlSession("SqlMapCofig.xml");
User user = new User();
user.setUsername("張");
user.setSex("w");
List<User> users = sqlSession.selectList("DaoProxy.UserMapper.getUserByIfPojo",user);
for (User u :users) {
System.out.println(u.toString());
}
sqlSession.close();
}
如果不設置性別測試如下
sql - where
where標籤自動補where關鍵字(和手動寫會起衝突)
映射文件
<select id="getUserByIfPojo" parameterType="user" resultType="User">
select *
from user
<where>
<if test="username!=null and username!=''">
and username like '%${username}%'
</if>
<if test="sex!=null and sex!=''">
and sex=#{sex}
</if>
</where>
</select>
sql - sql
sql片段拼接用include關鍵字
<sql id="user_sql">
'username','sex'
</sql>
<select id="getUserByIfPojo" parameterType="user" resultType="User">
select
<include refid="user_sql"/>
from user
foreach
循環標籤,一般用於集合查詢
映射文件
<!--通過包裝-->
<select id="getUserFromList" parameterType="UserQuaryVo" resultType="user">
select * from user
<where>
<foreach collection="ids" open="id IN(" item="id" separator="," close=")">
#{id}
</foreach>
</where>
</select>
測試類
@Test
public void testList() throws IOException {
SqlSession sqlSession = SqlSessionUtils.getSqlSession("SqlMapCofig.xml");
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserQuaryVo vo = new UserQuaryVo();
vo.setIds(Arrays.asList(1,29,31));
List<User> list = userMapper.getUserFromList(vo);
for (User user:list
) {
System.out.println(user.toString());
}
}
這一次就到這結束了,下一次寫關聯查詢還有和Spring進行整合!