使用MyBatis進行CRUD操作

1.準備工作

  • 創建工程

    • 導入jar包(maven座標)

    • 創建一個實體(實體類和數據庫的表對應)

    • 創建接口,編寫一個方法(接口UserDao.java)

    • 編寫配置文件(resources資源下,sqlMapConfig.xml)

    • 編寫映射文件(resources資源下,創建的包結果和接口的結構對應,UserDao.xml)

    • 測試類(使用mybatis的api),操作查詢所有

2. 使用Junit重寫UserDao.java

/**
 * 測試mybatis的crud操作
 */
public class MybatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private UserDao userDao;

    @Before//用於在測試方法執行之前執行
    public void init()throws Exception{
        //1.讀取配置文件,生成字節輸入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.獲取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.獲取SqlSession對象
        sqlSession = factory.openSession();
        //4.獲取dao的代理對象
        userDao = sqlSession.getMapper(UserDao.class);
    }

    @After//用於在測試方法執行之後執行
    public void destroy()throws Exception{
        //提交事務
        sqlSession.commit();
        //6.釋放資源
        sqlSession.close();
        in.close();
    }

    /**
     * 測試查詢所有
     */
    @Test
    public void testFindAll(){
        //5.執行查詢所有方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }
      
      /*
      	保存,刪除,修改等操作
      */
      

    }

3.進行CURD時的注意事項

3.1 事務處理

在進行增刪改時需要進行事務處理,而mybatis內部會自動開啓和回滾事務,
所以需要我們使用sqlSession.commit()來提交事務.

3.2 獲取自增長的數據庫id

新增用戶後,同時還要返回當前新增用戶的id值,因爲id是由數據庫的自動增長來實現的,所以就相當於我們要在新增後將自動增長auto_increment的值返回。

配置:UserDao.xml

<!--保存用戶-->
<!-- 配置插入操作後,獲取插入數據的id -->
<insert id="saveUser" parameterType="com.itheima.domain.User"    
 useGeneratedKeys="true" keyColumn="id" keyProperty="id">  
    insert into user(username,address,sex,birthday)
    values(#{username},#{address},#{sex},#{birthday});
</insert>

<!--其中的參數
        #{username}等價於 user.getUsername();   (OGNL)
        useGeneratedKeys="true"   是否使用新增的主鍵:true使用
         keyColumn="id"           主鍵對應的數據庫列名
         keyProperty="id"         主鍵對應的java對象屬性名
    -->

3.3模糊查詢中的問題:

查詢語句有兩種寫法:

a. select * from user where name like #{name} 
b. select * from user where username like '%${value}%'

#{}與${}的區別:
a.#{}表示一個佔位符號
通過#{}可以實現prepareStatement向佔位符中設置值,自動進行java類型
和jdbc類型轉換,#{}可以有效防止sql注入問題.#{}可以接受簡單類型值和pojo屬性值.
如果parameterType傳輸單個簡單類型的值,#{}括號中可以是value或者其他自定義名稱.
b.${}表示拼接sql串
通過${}可以將parameterType傳入的內容拼接在sql中且不進行jdbc類型轉換,${}可以接受簡單類型值或pojo類型屬性值,如果parameterType傳輸單個簡單類型的值,
${}括號內只能是value(因爲源碼中讀取的key的名字是value,所以在綁定參數時只能叫value).

4.Mybatis輸出結果的封裝

如果數據庫中的字段和對象中的屬性不一致

<!--
	如果返回的列名和實體類的屬性不一致時,我們就不能封裝結果到指定的實體對象
解決方案  使用resultMap替換resultType
在UserDao.xml中的<mapper>下定義resultMap

 -->
<!-- 配置 查詢結果的列名和實體類的屬性名的對應關係 -->
<resultMap id="userMap" type="com.itheima.domain.User">
    <!-- 主鍵字段的對應 -->
    <id property="userId" column="id"></id>
    <!--非主鍵字段的對應-->
    <result property="userName" column="username"></result>
    <result property="userAddress" column="address"></result>
    <result property="userSex" column="sex"></result>
    <result property="userBirthday" column="birthday"></result>
</resultMap>

	<id/>:此屬性表示查詢結果集的唯一標識,也是數據庫的主鍵,
			如果是多個字段爲複合唯一約束則定義多個<id/>
	property:表示java中類的屬性
	column:表示數據庫的列名
	column和property放在一塊兒表示將sql查詢出來的字段映射到指定的pojo類屬性上。 
<result />:普通屬性(普通字段),即pojo的屬性	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章