1. 程式人生 > >mybatis總結2

mybatis總結2

MyBatic第二天總結

2 輸入對映和輸出對映 2.1 parameterType(輸入型別) 2.1.1 傳遞簡單型別 參考第一天內容 2.1.2 傳遞pojo物件 參考第一天內容 Mybatis使用ognl表示式解析物件欄位的值,#{}或者${}括號中的值為pojo屬性名稱。 2.1.3 傳遞pojo包裝物件

  1. 新建包裝pojo物件QueryVo /**
  • 包裝pojo

  • @author Steven */ public class QueryVo {

    //使用者物件 private User user;

    public User getUser() { return user; }

    public void setUser(User user) { this.user = user; }

}

  1. 對映檔案與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>
  1. 新增介面方法
  2. 增加測試方法,完成測試

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片段。

  1. 定義
<sql id="user_column">
	`id`,
	`username`,
	`birthday`,
	`sex`,
	`address`,
	`uuid2`
</sql>
  1. 使用 SELECT FROM USER

其它步驟跟前面類似,新增介面方法與測試方法,完成測試。

4 關聯查詢 4.1 一對一關聯 4.1.1 方法一,使用resultType

  1. 新建OrderUser的pojo,繼承自Order。 public class OrderUser extends Order {

    private String username; private String address; …….get,set }

  2. 修改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

  1. 改造order的pojo

  2. 修改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 一對多關聯

  1. 改造user的pojo

  2. 修改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 整合步驟

  1. 建立一個java工程。
  2. 匯入jar包。(課前資料中mybatis與spring整合所有包)
  3. mybatis的配置檔案sqlmapConfig.xml
  4. 編寫Spring的配置檔案
  1. 資料庫連線及連線池
  2. sqlsessionFactory物件,配置到spring容器中
  3. 編寫Spring的配置檔案
  1. 複製jdbc.properties配置檔案到新工程
  2. 複製log4j.properties配置檔案到新工程

5.3 Dao開發 5.3.1 複製user的pojo到新工程 5.3.2 傳統Dao開發

  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 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 } }

  5. 在applicationContext.xml中配置UserDaoImpl實現類

<bean class="com.itheima.mybatis.dao.impl.UserDaoImpl">
	<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
  1. 編寫測試類,新建單完測試類 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

  1. 複製UserMapper.xml到新工程,並修改,只留下要測試的三個方法
  2. 複製UserMapper介面到新工程,並修改,只留下要測試的三個方法
  3. 配置Mapper
  1. 單個介面配置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>
  1. 配置包掃描器
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);
}

6 Mybatis逆向工程 注意的點:在generatorConfig.xml中配置mapper生成的詳細資訊,注意改下幾點: 1、 新增要生成的資料庫表 2、 po檔案所在包路徑 3、 mapper檔案所在包路徑

其餘的可以參考教案。