亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis學習教程之開發Dao的方法教程

發布時間:2020-10-10 03:53:54 來源:腳本之家 閱讀:122 作者:ngulc 欄目:編程語言

簡介

使用Mybatis開發Dao,通常有兩個方法,即原始Dao開發方法和Mapper接口開發方法。下面話不多說,來一起看看詳細的介紹:

主要概念介紹:

MyBatis中進行Dao開發時候有幾個重要的類,它們是SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。

SqlSession中封裝了對數據庫的操作,如:查詢、插入、更新、刪除等。通過SqlSessionFactory創建SqlSession,而SqlSessionFactory是通過SqlSessionFactoryBuilder進行創建。

1、SqlSessionFactoryBuilder

  SqlSessionFactoryBuilder用于創建SqlSessionFacoty,SqlSessionFacoty一旦創建完成就不需要SqlSessionFactoryBuilder了,因為SqlSession是通過SqlSessionFactory生產,所以可以將SqlSessionFactoryBuilder當成一個工具類使用,最佳使用范圍是方法范圍即方法體內局部變量。

2、SqlSessionFactory

  SqlSessionFactory是一個接口,接口中定義了openSession的不同重載方法,SqlSessionFactory的最佳使用范圍是整個應用運行期間,一旦創建后可以重復使用,通常以單例模式管理SqlSessionFactory。

3、SqlSession

  SqlSession是一個面向用戶的接口, sqlSession中定義了數據庫操作,默認使用DefaultSqlSession實現類。

  SqlSession中提供了很多操作數據庫的方法:如:selectOne(返回單個對象)、selectList(返回單個或多個對象),SqlSession是線程不安全的,在SqlSesion實現類中除了有接口中的方法(操作數據庫的方法)還有數據域屬性,SqlSession最佳應用場合在方法體內,定義成局部變量使用,絕對不能將SqlSession實例的引用放在一個類的靜態字段或實例字段中。

打開一個 SqlSession;使用完畢就要關閉它。通常把這個關閉操作放到 finally 塊中以確保每次都能執行關閉。

如下:

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}

原始Dao開發方式

原始Dao開發方法需要程序員編寫Dao接口和Dao實現類。

還是以前文提到的簡單的增刪改查為例,來簡單介紹原始Dao開發方式。

1、映射文件

<?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">
<mapper namespace="user">
 <!-- 根據id獲取用戶信息 -->
 <select id="findUserById" parameterType="int" resultType="user">
  select * from user where id = #{id}
 </select>
 <!-- 根據username模糊查詢用戶信息 -->
 <select id="findUserByName" parameterType="java.lang.String" resultType="com.luchao.mybatis.first.po.User">
  select * from user where username like '%${value}%'
 </select>
 <!-- 添加用戶信息 -->
 <insert id="insertUser" parameterType="com.luchao.mybatis.first.po.User">
  <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
   select LAST_INSERT_ID()
  </selectKey>
  insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address});
 </insert>
 <!-- 根據id刪除用戶信息 -->
 <delete id="deleteUser" parameterType="int">
  delete from user where id=#{id}
 </delete>
 <!-- 修改用戶信息 -->
 <update id="updateUser" parameterType="com.luchao.mybatis.first.po.User">
  update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
  where id=#{id}
 </update>
</mapper>

2、Dao接口

public interface UserDao {
 //根據ID查詢用戶信息
 public User findUserById(int id) throws Exception;
 //添加用戶信息
 public void insertUser(User user) throws Exception;
 //刪除用戶信息
 public void deleteUser(int id) throws Exception;
}

3、Dao接口實現類

public class UserDaoImpl implements UserDao{
 
 // 需要向dao實現類中注入SqlSessionFactory
 // 這里通過構造方法注入
 private SqlSessionFactory sqlSessionFactory;
 
 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
  super();
  this.sqlSessionFactory = sqlSessionFactory;
 }
 @Override
 public void deleteUser(int id) throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  //執行刪除操作
  sqlSession.insert("user.deleteUser", id);
  // 提交事務
  sqlSession.commit();
  // 釋放資源
  sqlSession.close();
 }
 @Override
 public User findUserById(int id) throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();//獲取sqlSession
  User user = sqlSession.selectOne("user.findUserById", id);
  sqlSession.close();//關閉資源
  return user;
 }
 @Override
 public void insertUser(User user) throws Exception {
  SqlSession sqlSession = sqlSessionFactory.openSession();
  //執行插入操作
  sqlSession.insert("user.insertUser", user);
  // 提交事務
  sqlSession.commit();
  // 釋放資源
  sqlSession.close();
 }
}

4、測試代碼:

public class MyBatis_dao_test {
 private SqlSessionFactory sqlSessionFactory;
 @Before
 public void init() throws IOException{
  //創建sqlSessionFactory
  //MyBatis配置文件
  String resource = "SqlMapConfig.xml";
  //得到配置文件流
  InputStream inputStream = Resources.getResourceAsStream(resource);
  //創建會話工廠,傳入MyBatis的配置信息
  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 }
 @Test
 public void testFindUserById() throws Exception{
  //創建UserDao對象
  UserDao userDao = new UserDaoImpl(sqlSessionFactory);
  //調用UserDao的方法,根據ID查找user
  User user = userDao.findUserById(10);
  //打印客戶信息
  System.out.println(user);
 }
}

5、原始Dao方法總結:

  (1)、dao接口實現類方法中存在大量模板方法,如:通過SqlSessionFactory創建SqlSession,調用SqlSession的數據庫操作方法。

  (2)、調用sqlSession的數據庫操作方法需要指定statement的id,這里存在硬編碼。

  (3)、調用sqlsession方法時傳入的變量,由于sqlsession方法使用泛型,即使變量類型傳入錯誤,在編譯階段也不報錯,不利于程序員開發。

Mapper動態代理方式

1、實現原理

  Mapper接口開發方法只需要程序員編寫Mapper接口(相當于Dao接口),由Mybatis框架根據接口定義創建接口的動態代理對象,代理對象的方法體同上邊Dao接口實現類方法。這樣通過動態代理就實現了將模板方法進行封裝,只需要實現具體的實現即可。

Mapper接口開發需要遵循以下規范:

     (1)、 Mapper.xml文件中的namespace與mapper接口的類路徑相同。

     (2)、 Mapper接口方法名和Mapper.xml中定義的每個statement的id相同 。

     (3)、 Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同。

     (4)、 Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同。

2、Mapper.xml(映射文件)

映射文件與原始Dao開發的映射文件相似,只需要將namespace定于為mapper接口全路徑。

<?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">
<mapper namespace="com.luchao.mybatis.first.mapper.UserMapper">
 <!-- 根據id獲取用戶信息 -->
 <select id="findUserById" parameterType="int" resultType="user">
  select * from user where id = #{id}
 </select>
 <!-- 根據username模糊查詢用戶信息 -->
 <select id="findUserByName" parameterType="java.lang.String" resultType="com.luchao.mybatis.first.po.User">
  select * from user where username like '%${value}%'
 </select>
 <!-- 添加用戶信息 -->
 <insert id="insertUser" parameterType="com.luchao.mybatis.first.po.User">
  <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
   select LAST_INSERT_ID()
  </selectKey>
  insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address});
 </insert>
 <!-- 根據id刪除用戶信息 -->
 <delete id="deleteUser" parameterType="int">
  delete from user where id=#{id}
 </delete>
 <!-- 修改用戶信息 -->
 <update id="updateUser" parameterType="com.luchao.mybatis.first.po.User">
  update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
  where id=#{id}
 </update>
</mapper>

3、Mapper.java(接口文件)

public interface UserMapper {
 //根據ID查詢用戶信息
 public User findUserById(int id) throws Exception;
 //添加用戶信息
 public void insertUser(User user) throws Exception;
 //刪除用戶信息
 public void deleteUser(int id) throws Exception;
 //更新用戶信息
 public void updateUser(User user) throws Exception;
 //根據用戶名模糊查找
 public List<User> findUserByName(String user) throws Exception;
}

接口定義有如下特點:

  (1)、 Mapper接口方法名和Mapper.xml中定義的statement的id相同。

  (2)、 Mapper接口方法的輸入參數類型和mapper.xml中定義的statement的parameterType的類型相同。

  (3)、 Mapper接口方法的輸出參數類型和mapper.xml中定義的statement的resultType的類型相同。

4、加載UserMapper.xml文件

在SqlMapConfig.xml文件中加載UserMapper.xml,如下:

 <mappers>
  <mapper resource="mapper/UserMapper.xml"/>
 </mappers>

5、測試代碼:

public class MyBatis_mapper_test {
 private SqlSessionFactory sqlSessionFactory;
 @Before
 public void init() throws IOException{
  //創建sqlSessionFactory
  //MyBatis配置文件
  String resource = "SqlMapConfig.xml";
  //得到配置文件流
  InputStream inputStream = Resources.getResourceAsStream(resource);
  //創建會話工廠,傳入MyBatis的配置信息
  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
 }
 @Test
 public void testFindUserById() throws Exception{
  //獲取sqlSession對象
  SqlSession sqlSession = sqlSessionFactory.openSession();
  //創建UserMapper對象,MyBatis自動生成mapper代理
  UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  //調用userMapper的方法
  User user = userMapper.findUserById(10);
  //關閉資源
  sqlSession.close();
  //打印客戶信息
  System.out.println(user);
 }
}

5、Mapper動態代理總結:

  (1)、動態代理對象調用sqlSession.selectOne()sqlSession.selectList()是根據mapper接口方法的返回值決定,如果返回list則調用selectList方法,如果返回單個對象則調用selectOne方法。

  (2)、使用mapper代理方法時,輸入參數可以使用pojo包裝對象或map對象,保證dao的通用性。在系統中,dao層的代碼是被業務層公用的。即使mapper接口只有一個參數,可以使用包裝類型的pojo滿足不同的業務方法的需求。

注意:持久層方法的參數可以包裝類型、map等,service方法中建議不要使用包裝類型(不利于業務層的可擴展)。

mybatis開發dao的方法有兩種:原始Dao開發和Mapper動態代理開發,這兩種各有優點。原始Dao開發:程序員要寫Dao和Dao實現,需要些較多的代碼,但是比較好理解。Mapper動態代理:程序員只需要寫Mapper接口,然后按照規范進行配置,MyBatis就會自動實現類似Dao實現,減少模板方法。mybatis官方推薦使用mapper代理方法開發mapper接口,程序員不用編寫mapper接口實現類,使用mapper代理方法時,輸入參數可以使用pojo包裝對象或map對象,保證dao的通用性。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

深水埗区| 多伦县| 大同县| 淮安市| 张家界市| 怀集县| 垫江县| 原阳县| 宣恩县| 凌海市| 甘肃省| 天全县| 定远县| 通州区| 灵山县| 滦平县| 商河县| 台北市| 秦皇岛市| 夏津县| 玉门市| 福建省| 盈江县| 永宁县| 固安县| 高碑店市| 来安县| 老河口市| 临湘市| 崇仁县| 醴陵市| 海安县| 阿尔山市| 宁城县| 湟中县| 岚皋县| 景洪市| 三亚市| 宁安市| 澎湖县| 城口县|