mybatis總結2
MyBatic第二天總結
2 輸入對映和輸出對映 2.1 parameterType(輸入型別) 2.1.1 傳遞簡單型別 參考第一天內容 2.1.2 傳遞pojo物件 參考第一天內容 Mybatis使用ognl表示式解析物件欄位的值,#{}或者${}括號中的值為pojo屬性名稱。 2.1.3 傳遞pojo包裝物件
- 新建包裝pojo物件QueryVo /**
-
包裝pojo
-
@author Steven */ public class QueryVo {
//使用者物件 private User user;
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
}
- 對映檔案與sql
<select id="getUserByQueryVo" parameterType="queryvo" resultType="com.itheima.mybatis.pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE #{name} -->
SELECT * FROM USER WHERE username LIKE '%${user.username}%'
</select>
- 新增介面方法
- 增加測試方法,完成測試
2.2 resultType(輸出型別) 2.2.1 輸出簡單型別
<select id="getUserCount" resultType="int">
SELECT COUNT(1) FROM USER
</select>
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。
2.2.2 輸出pojo物件 參考第一天內容
2.2.3 輸出pojo列表 參考第一天內容。
2.3 輸出resultMap 演示基於完成訂單列表的查詢,由user_id欄位與pojo屬性不一致時引出的resultMap。
<resultMap type="order" id="orderMap"> <!-- id標籤用於繫結主鍵 --> <!-- <id property="id" column="id"/> --> <!-- 使用result繫結普通欄位 --> <result property="userId" column="user_id"/> <result property="number" column="number"/> <result property="createtime" column="createtime"/> <result property="note" column="note"/> </resultMap> <!-- 使用resultMap --> <select id="getOrderListResultMap" resultMap="orderMap"> SELECT * FROM `order` </select>
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。
3 動態sql 3.1 If 演示基於完成使用者列表查詢功能,由多查詢條件拼裝引出if標籤。
<select id="getUserByWhere" parameterType="user" resultType="com.itheima.mybatis.pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE '%${username}%' and id = #{id} -->
SELECT * FROM USER where 1 = 1
<!-- if標籤的使用 -->
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != ''">
and username LIKE '%${username}%'
</if>
</select>
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。
3.2 Where 複製getUserByWhere修改一下,改名為getUserByWhere2。
<select id="getUserByWhere2" parameterType="user"
resultType="com.itheima.mybatis.pojo.User">
<!-- include:引入sql片段,refid引入片段id -->
SELECT
*
FROM USER
<!-- where會自動加上where同處理多餘的and -->
<where>
<!-- if標籤的使用 -->
<if test="id != null">
and id = #{id}
</if>
<if test="username != null and username != ''">
and username LIKE '%${username}%'
</if>
</where>
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。
3.3 Foreach 複製getUserByWhere2修改一下,改名為getUserByIds。
<select id="getUserByIds" parameterType="queryvo"
resultType="com.itheima.mybatis.pojo.User">
SELECT
*
FROM USER
<!-- where會自動加上where同處理多餘的and -->
<where>
<!-- id IN(1,10,25,30,34) -->
<!-- foreach迴圈標籤
collection:要遍歷的集合,來源入參
open:迴圈開始前的sql
separator:分隔符
close:迴圈結束拼接的sql
-->
<foreach item="uid" collection="ids" open="id IN(" separator=","
close=")">
#{uid}
</foreach> </where>
</select>
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。 3.4 Sql片段 演示通過select * 不好引出查詢欄位名,抽取共用sql片段。
- 定義
<sql id="user_column">
`id`,
`username`,
`birthday`,
`sex`,
`address`,
`uuid2`
</sql>
- 使用 SELECT FROM USER
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。
4 關聯查詢 4.1 一對一關聯 4.1.1 方法一,使用resultType
-
新建OrderUser的pojo,繼承自Order。 public class OrderUser extends Order {
private String username; private String address; …….get,set }
-
修改order的對映檔案,新增查詢方法getOrderUser。
<select id="getOrderUser" resultType="orderuser">
SELECT
o.`id`,
o.`user_id` userId,
o.`number`,
o.`createtime`,
o.`note`,
u.`username`,
u.`address`
FROM `order` o
LEFT JOIN `user` u
ON u.id = o.`user_id`
</select>
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。 4.1.2 方法二,使用resultMap
-
改造order的pojo
-
修改order的對映檔案
<resultMap type="order" id="order_user_map">
<!-- id標籤用於繫結主鍵 -->
<id property="id" column="id"/>
<!-- 使用result繫結普通欄位 -->
<result property="userId" column="user_id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
<!-- association:配置一對一關聯
property:繫結的使用者屬性
javaType:屬性資料型別,支援別名
-->
<association property="user" javaType="com.itheima.mybatis.pojo.User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="address" column="address"/>
<result property="sex" column="sex"/>
</association>
</resultMap>
<!-- 一對一關聯查詢-使用resultMap -->
<select id="getOrderUser2" resultMap="order_user_map">
SELECT
o.`id`,
o.`user_id`,
o.`number`,
o.`createtime`,
o.`note`,
u.`username`,
u.`address`,
u.`sex`
FROM `order` o
LEFT JOIN `user` u
ON u.id = o.`user_id`
</select>
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。
4.2 一對多關聯
-
改造user的pojo
-
修改user的對映檔案
<resultMap type="user" id="user_order_map">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="birthday" column="birthday" />
<result property="address" column="address" />
<result property="sex" column="sex" />
<result property="uuid2" column="uuid2" />
<!-- collection:配置一對多關係
property:使用者下的order屬性
ofType:property的資料型別,支援別名
-->
<collection property="orders" ofType="order">
<!-- id標籤用於繫結主鍵 -->
<id property="id" column="oid"/>
<!-- 使用result繫結普通欄位 -->
<result property="userId" column="id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
</collection>
</resultMap>
<!-- 一對多關聯查詢 -->
<select id="getUserOrder" resultMap="user_order_map">
SELECT
u.`id`,
u.`username`,
u.`birthday`,
u.`sex`,
u.`address`,
u.`uuid2`,
o.`id` oid,
o.`number`,
o.`createtime`
FROM `user` u
LEFT JOIN `order` o
ON o.`user_id` = u.`id`
</select>
其它步驟跟前面類似,新增介面方法與測試方法,完成測試。 5 Mybatis整合spring 5.1 整合思路 1、SqlSessionFactory物件應該放到spring容器中作為單例存在。 2、傳統dao的開發方式中,應該從spring容器中獲得sqlsession物件。 3、Mapper代理形式中,應該從spring容器中直接獲得mapper的代理物件。 4、資料庫的連線以及資料庫連線池事務管理都交給spring容器來完成。
5.2 整合步驟
- 建立一個java工程。
- 匯入jar包。(課前資料中mybatis與spring整合所有包)
- mybatis的配置檔案sqlmapConfig.xml
- 編寫Spring的配置檔案
- 資料庫連線及連線池
- sqlsessionFactory物件,配置到spring容器中
- 編寫Spring的配置檔案
- 複製jdbc.properties配置檔案到新工程
- 複製log4j.properties配置檔案到新工程
5.3 Dao開發 5.3.1 複製user的pojo到新工程 5.3.2 傳統Dao開發
-
複製user.xml到新工程,並修改,只留下要測試的三個方法
-
在SqlMapConfig.xml載入user.xml
-
複製UserDao介面到新工程,並修改,只留下要測試的三個方法
-
編寫UserDaoImpl實現類,關鍵是繼承SqlSessionDaoSupport public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override public User getUserById(Integer id) { SqlSession sqlSession = super.getSqlSession(); //查詢使用者 User user = sqlSession.selectOne(“user.getUserById”, id);
//不能關閉SqlSession //sqlSession.close(); return user;
}
@Override public List getUserByUserName(String name) { SqlSession sqlSession = super.getSqlSession(); List list = sqlSession.selectList(“user.getUserByName”, name); //不能關閉SqlSession return list; }
@Override public void insertUser(User user) { SqlSession sqlSession = super.getSqlSession(); sqlSession.insert(“user.insertUser”, user); //不用手動提交事務,交給spring } }
-
在applicationContext.xml中配置UserDaoImpl實現類
<bean class="com.itheima.mybatis.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
-
編寫測試類,新建單完測試類 public class UserDaoTest {
private ApplicationContext applicationContext;
@Before public void init(){ applicationContext = new ClassPathXmlApplicationContext(“applicationContext.xml”); }
@Test public void testGetUserById() { UserDao userDao = applicationContext.getBean(UserDao.class); User user = userDao.getUserById(10); System.out.println(user); } ………省略其它方法 }
5.3.3 Mapper代理模式開發Dao
- 複製UserMapper.xml到新工程,並修改,只留下要測試的三個方法
- 複製UserMapper介面到新工程,並修改,只留下要測試的三個方法
- 配置Mapper
- 單個介面配置MapperFactoryBean
<bean id="baseMapper" class="org.mybatis.spring.mapper.MapperFactoryBean" abstract="true" lazy-init="true">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<!-- 使用者動態代理掃描 -->
<bean parent="baseMapper">
<property name="mapperInterface" value="com.itheima.mybatis.mapper.UserMapper" />
</bean>
- 配置包掃描器
public class UserMapperTest {
private ApplicationContext applicationContext;
@Before
public void init(){
applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void testGetUserById() {
UserMapper userMapper = applicationContext.getBean(UserMapper.class);
User user = userMapper.getUserById(10);
System.out.println(user);
}
6 Mybatis逆向工程 注意的點:在generatorConfig.xml中配置mapper生成的詳細資訊,注意改下幾點: 1、 新增要生成的資料庫表 2、 po檔案所在包路徑 3、 mapper檔案所在包路徑
其餘的可以參考教案。