參考第一天內容java
參考第一天內容spring
Mybatis使用ognl表達式解析對象字段的值,#{}或者${}括號中的值爲pojo屬性名稱。sql
/** * 包裝pojo * @author Steven */ public class QueryVo { //用戶對象 private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
<!-- 1、resultType:若是要返回數據集合,只需設定爲每個元素的數據類型 二、 包裝的pojo取值經過 "."來獲取 --> <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>
3. 新增接口方法數據庫
4. 增長測試方法,完成測試session
<!-- 查詢用戶總記錄數,演示返回簡單類型 --> <select id="getUserCount" resultType="int"> SELECT COUNT(1) FROM USER </select>
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。mybatis
參考第一天內容app
參考第一天內容。ide
演示基於完成訂單列表的查詢,由user_id字段與pojo屬性不一致時引出的resultMap。測試
<!-- resultMap入門 type:映射成的pojo類型 id: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>
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。ui
演示基於完成用戶列表查詢功能,由多查詢條件拼裝引出if標籤。
<!-- 演示動態sql-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>
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。
複製getUserByWhere修改一下,更名爲getUserByWhere2。
<!-- 演示動態sql-where標籤的使用情景 --> <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> </select>
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。
複製getUserByWhere2修改一下,更名爲getUserByIds。
<!-- 演示動態sql-foreach標籤的使用情景 --> <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>
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。
演示經過select * 很差引出查詢字段名,抽取共用sql片斷。
<!-- sql片斷 定義,id:片斷惟一標識 -->
<sql id="user_column">
`id`,
`username`,
`birthday`,
`sex`,
`address`,
`uuid2`
</sql>
SELECT <!-- sql片斷的使用:include:引入sql片斷,refid引入片斷id --> <include refid="user_column" /> FROM USER
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。
public class OrderUser extends Order { private String username; private String address; …….get,set }
<!-- 一對一關聯查詢,使用resultType --> <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>
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。
<!-- 一對一關聯查詢-resultMap --> <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>
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。
<!-- 一對多關聯查詢 --> <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>
其它步驟跟前面相似,添加接口方法與測試方法,完成測試。
一、SqlSessionFactory對象應該放到spring容器中做爲單例存在。
二、傳統dao的開發方式中,應該從spring容器中得到sqlsession對象。
三、Mapper代理形式中,應該從spring容器中直接得到mapper的代理對象。
四、數據庫的鏈接以及數據庫鏈接池事務管理都交給spring容器來完成。
1) 數據庫鏈接及鏈接池
2) sqlsessionFactory對象,配置到spring容器中
3) 編寫Spring的配置文件
1. 複製user.xml到新工程,並修改,只留下要測試的三個方法
2. 在SqlMapConfig.xml加載user.xml
3. 複製UserDao接口到新工程,並修改,只留下要測試的三個方法
4. 編寫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<User> getUserByUserName(String name) { SqlSession sqlSession = super.getSqlSession(); List<User> 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 } }
5. 在applicationContext.xml中配置UserDaoImpl實現類
<!-- 傳統dao -->
<bean class="com.itheima.mybatis.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
6. 編寫測試類,新建單完測試類
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); } ………省略其它方法 }
1. 複製UserMapper.xml到新工程,並修改,只留下要測試的三個方法
2. 複製UserMapper接口到新工程,並修改,只留下要測試的三個方法
3. 配置Mapper
1) 單個接口配置MapperFactoryBean
<!-- 動態代理Dao開發,第一種方式 -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>
2) 配置包掃描器
<!-- 動態代理Dao開發,第一種方式,包掃描器(推薦使用) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- basePackage:配置映射包裝掃描,多個包時用","或";"分隔 -->
<property name="basePackage" value="com.itheima.mybatis.mapper" />
</bean>
4. 測試
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); }
注意的點:在generatorConfig.xml中配置mapper生成的詳細信息,注意改下幾點:
一、 添加要生成的數據庫表
二、 po文件所在包路徑
三、 mapper文件所在包路徑