1. 程式人生 > >MyBatis學習(三)

MyBatis學習(三)

數據模型 連接池 自定義 mysq integer out put 模型 exce

1、Mybatis入門Demo實踐

A、添加用戶
B、更新用戶
C、刪除用戶

重點:MySql自增主鍵返回

添加用戶時候,如何返回自增主鍵?
<!-- 添加用戶 -->
<insert id="insertUser" parameterType="com.kid.mybatis.pojo.User">
    <!-- selectKey將主鍵返回,需要再返回
         keyProperty:返回的主鍵存儲在pojo中的哪個屬性
         order:selectKey的執行順序,是相對與insert語句來說,由於mysql的自增原理執行完insert語句之後才將主鍵生成,
          所以這裏selectKey的執行順序為after;resultType:返回的主鍵是什麽類型
         LAST_INSERT_ID():是mysql的函數,返回auto_increment自增列新記錄id值。 
     -->
    <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>

添加selectKey實現將主鍵返回
    keyProperty:返回的主鍵存儲在pojo中的哪個屬性
    order:selectKey的執行順序,是相對與insert語句來說,由於mysql的自增原理執行完insert語句之後才將主鍵生成,所以這裏selectKey的執行順序為after
    resultType:返回的主鍵是什麽類型
    LAST_INSERT_ID():是mysql的函數,返回auto_increment自增列新記錄id值。

Mysql使用 uuid實現主鍵

<insert id="insertUser" parameterType="com.kid.mybatis.pojo.User">
    <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">
        select uuid()
    </selectKey>
        insert into user(username,birthday,sex,address) 
        value(#{username},#{birthday},#{sex},#{address})
</insert>
註意這裏使用的order是"BEFORE"

1、繼續操作 User.xml實現用戶的刪除和更新

<!-- 刪除用戶 -->
<delete id="deleteUserById" parameterType="int">
    delete from user where id=#{id}
</delete>

<!-- 更新用戶數據 -->
<update id="updateUser" parameterType="com.kid.mybatis.pojo.User">
    update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}
    where id=#{id}
</update>

2、測試文件

//創建會話工廠
private SqlSessionFactory sqlSessionFactory = null;

@Before
public void createSqlSessionFactory() throws Exception {
    //第一步:創建一個SQLSessionFactoryBuilder對象。
    SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
    //第二步:加載配置文件。
    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
    //第三步:創建SQLSessionFactory對象
    sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
}

@Test   //添加用戶信息
public void insertTest() {
    // 數據庫會話實例
    SqlSession sqlSession = null;
    try {
        // 創建數據庫會話實例sqlSession
        sqlSession = sqlSessionFactory.openSession();
        //創建User對象
        User user = new User();
        user.setUsername("趙雲");
        user.setBirthday(new Date());
        user.setSex("2");
        user.setAddress("上海");
        //插入數據
        sqlSession.insert("insertUser",user);
        System.out.println(user.getId());
        //提交事務
        sqlSession.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        sqlSession.close();
    }
}

@Test //刪除用戶
public void deleteUserById() {
    //數據庫會話實例
    SqlSession sqlSession=null;
    try {
        // 創建數據庫會話實例sqlSession
        sqlSession=sqlSessionFactory.openSession();
        //刪除用戶
        sqlSession.delete("deleteUserById",16);
        sqlSession.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

@Test //更新用戶數據
public void uodateUserTest() {
    // 數據庫會話實例
    SqlSession sqlSession = null;
    try {
        sqlSession = sqlSessionFactory.openSession();
        // 添加用戶信息
        User user = new User();
        user.setId(26);
        user.setUsername("張小明");
        user.setAddress("陜西西安");
        user.setSex("1");
        sqlSession.update("updateUser", user);
        // 提交事務
        sqlSession.commit();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

總結

1、Mybatis解決jdbc編程的問題

a、數據庫鏈接創建、釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫鏈接池可解決此問題。
  解決:在SqlMapConfig.xml中配置數據鏈接池,使用連接池管理數據庫鏈接。

b、Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼。
  解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。

c、向sql語句傳參數麻煩,因為sql語句的where條件不一定,可能多也可能少,占位符需要和參數一一對應。
  解決:Mybatis自動將java對象映射至sql語句,通過statement中的parameterType定義輸入參數的類型。

d、對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象解析比較方便。
  解決:Mybatis自動將sql執行結果映射至java對象,通過statement中的resultType定義輸出結果的類型。

2、mybatis與hibernate不同

a、Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程序員自己編寫Sql語句,不過mybatis可以通過XML  
   或註解方式靈活配置要運行的sql語句,並將java對象和sql語句映射生成最終執行的sql,最後將sql執行的結果再映射生成java對象。

b、Mybatis學習門檻低,簡單易學,程序員直接編寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求  
   不高的軟件開發,例如互聯網軟件、企業運營類軟件等,因為這類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。  
   但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件則需要自定義多套sql映射文件,工作量大。

c、Hibernate對象/關系映射能力強,數據庫無關性好,對於關系模型要求高的軟件(例如需求固定的定制化軟件)如果用hibernate開發  
   可以節省很多代碼,提高效率。但是Hibernate的學習門檻高,要精通門檻更高,而且怎麽設計O/R映射,在性能和對象模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行。
總之,按照用戶的需求在有限的資源環境下只要能做出維護性、擴展性良好的軟件架構都是好架構,所以框架只有適合才是最好。

MyBatis學習(三)