【MyBatis框架】MyBatis入門程序第二部分

咱們經過寫一個簡單的MyBatis小項目來在實戰中學習MyBatis,接着上一篇繼續

咱們開始實現需求中的添加和刪除用戶功能
(1)向數據庫中添加用戶數據
使用User.xml,加入添加用戶的sql語句。java

<!-- 添加用戶
parameterType:指定輸入參數類型是pojo(包括用戶信息) 
#{}中指定POJO的屬性名,接收到POJO對象的屬性值,mybatis經過OGNL獲取對象的屬性
-->
<insert id="insertUser" parameterType="cn.edu.hpu.mybatis.PO.User">
    insert into user(username,birthday,sex,address) value(#{username}.#{birthday,jdbcType=DATE}.#{sex},#{address})
</insert>

*注:在字段中有Date和DateTime類型,在插入數據時只要將實體的屬性設置成Timestamp就會對應mysql的DateTime類型,Date會對應mysql的Date類型:
#{modified_date,jdbcType=TIMESTAMP}、#{date,jdbcType=DATE}。mysql


測試方法:程序員

//添加用戶
sql

 @Test 
    public void insertUserTest(){
        
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        
        //將配置文件加載成流
        InputStream inputStream;
        
        try {
            
            inputStream = Resources.getResourceAsStream(resource);
            //建立會話工廠,傳入mybatis配置文件的信息
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            
            //經過工廠獲得sqlSession
            sqlSession=sqlSessionFactory.openSession();
            
            //插入用戶對象
            User user=new User();
            user.setUsername("李雲華");
            user.setBirthday(new Date());
            user.setSex("男");
            user.setAddress("雲南大理");
            //經過SqlSession操做數據庫
            //第一個參數:映射文件中的statement的Id,等於=namespace+"."+statement的Id
            //第二個參數:指定和映射文件所匹配的parameterType類型的參數
            //sqlSession.selectOne最終結果與你映射文件中所匹配的resultType類型
            sqlSession.insert("test.insertUser",user);
            
            //提交事務
            sqlSession.commit();
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //釋放資源
            sqlSession.close();
        }
        
    }

測試結果:
在數據庫中插入了
李雲華(String), 2015-06-07(Date), 男(String), 雲南大理(String)
數據庫


(2)主鍵返回
a.自增主鍵的返回
mysql的自增主鍵,執行insert以前自動生成一個自增主鍵
經過mysql函數獲取到剛插入記錄的自增主鍵
LAST_INSERT_ID
(當插入一個數據後,當即用這個函數就會返回剛加的主鍵:SELECT LAST_INSERT_ID())
在剛剛的User.xml中這麼寫:
apache

<!-- 添加用戶
parameterType:指定輸入參數類型是pojo(包括用戶信息) 
#{}中指定POJO的屬性名,接收到POJO對象的屬性值,mybatis經過OGNL獲取對象的屬性
-->
<insert id="insertUser" parameterType="cn.edu.hpu.mybatis.PO.User">
    <!-- 將插入數據的主鍵返回,返回到user對象中。
    SELECT_INSERT_ID():獲得剛insert進去的主鍵值,只適用於自增主鍵 
    KeyProperty:將查詢到主鍵值設置到parameterType指定對象的哪一個屬性。
    order:SELECT LAST_INSERT_ID()執行順序,相對於insert語句來講它的執行順序
    -->
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
        SELECT LAST_INSERT_ID()
    </selectKey>
    insert into user(username,birthday,sex,address) value(#{username},#{birthday,jdbcType=DATE},#{sex},#{address})
</insert>

咱們在剛剛的方法後面輸出user的IDmybatis

//插入用戶對象
User user=new User();
user.setUsername("李雲華");
user.setBirthday(new Date());
user.setSex("男");
user.setAddress("雲南大理");
//經過SqlSession操做數據庫
//第一個參數:映射文件中的statement的Id,等於=namespace+"."+statement的Id
//第二個參數:指定和映射文件所匹配的parameterType類型的參數
//sqlSession.selectOne最終結果與你映射文件中所匹配的resultType類型
sqlSession.insert("test.insertUser",user);
            
//提交事務
sqlSession.commit();
            
System.out.println(user.getId());

結果:6
爲啥能獲得,就是在配置文件裏設置了當insert完成以後就把id取出來存到user對象中

b.非自增主鍵的返回
使用mysql的uuid()函數生成主鍵,須要修改表中id字段類型爲string,長度設置成35位。

執行思路:
先經過uuid()查詢到主鍵,將主鍵輸入到sql語句中。

執行uuid()語句順序相對於insert語句以前執行。

在剛剛的User.xml中這麼寫:oracle

<!-- 使用MySql的UUID來生成主鍵
        執行過程:
        首先經過uuid()獲得主鍵,將主鍵設置到user對象的id屬性中
        其次在insert執行時,從user對象中取出id屬性值 -->
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT uuid()
        </selectKey>
        insert into user(id,birthday,sex,address) value(#{id},#{birthday,jdbcType=DATE},#{sex},#{address})

若是使用的數據庫是oracle那麼經過oracle的序列生成主鍵寫法:
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            SELECT 序列名.nextval()
</selectKey>
insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday,jdbcType=DATE},#{sex},#{address})


(3)刪除和更新用戶

映射文件User.xml中添加的語句:框架

<!-- 刪除用戶 -->
<delete id="deleteUser" parameterType="java.lang.Integer">
    delete from user where id=#{id}
</delete>
    
<!-- 更新用戶 
分析:
須要傳入用戶的id,須要傳入用戶的更新信息.
parameterType指定user對象,包括id和更新信息(注意:id必須存在)
#{id}:從輸入user對象中獲取id屬性值-->
<update id="updateUser" parameterType="cn.edu.hpu.mybatis.PO.User">
    update user set username=#{username},birthday=#{birthday,jdbcType=DATE},sex=#{sex},address=#{address}     
        where id=#{id}
</update>

測試代碼:
刪除測試代碼:函數

//刪除用戶
    @Test 
    public void deleteUserTest(){
        
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        
        //將配置文件加載成流
        InputStream inputStream;
        
        try {
            
            inputStream = Resources.getResourceAsStream(resource);
            //建立會話工廠,傳入mybatis配置文件的信息
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            
            //經過工廠獲得sqlSession
            sqlSession=sqlSessionFactory.openSession();
            
            //傳入id刪除用戶
            sqlSession.delete("test.deleteUser",6);
            
            //提交事務
            sqlSession.commit();
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //釋放資源
            sqlSession.close();
        }
        
    }

   

測試結果:從數據庫刪除了id爲6的數據

更新測試代碼:

   

//更新用戶
    @Test 
    public void updateUserTest(){
        
        //mybatis配置文件
        String resource="SqlMapConfig.xml";
        
        //將配置文件加載成流
        InputStream inputStream;
        
        try {
            
            inputStream = Resources.getResourceAsStream(resource);
            //建立會話工廠,傳入mybatis配置文件的信息
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            
            //經過工廠獲得sqlSession
            sqlSession=sqlSessionFactory.openSession();
            
            //更新用戶信息(更改id=5的用戶數據)
            User user=new User();
            user.setId(5);
            user.setUsername("劉三姐");
            user.setBirthday(new Date());
            user.setSex("女");
            user.setAddress("雲南大理");
            sqlSession.update("test.updateUser",user);
            
            //提交事務
            sqlSession.commit();
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            //釋放資源
            sqlSession.close();
        }
        
    }

測試結果:
id=5的數據被更新

小結:
a.parameterType
在映射文件中經過parameterType指定輸入 參數的類型。

b.resultType
在映射文件中經過resultType指定輸出結果的類型。

c.#{}和${}

#{}表示一個佔位符號,#{}接收輸入參數,類型能夠是簡單類型,pojo、hashmap。
若是接收簡單類型,#{}中能夠寫成value或其它名稱。
#{}接收pojo對象值,經過OGNL讀取對象中的屬性值,經過屬性.屬性.屬性...的方式獲取對象屬性值。

${}表示一個拼接符號,會引用sql注入,因此不建議使用${}。
${}接收輸入參數,類型能夠是簡單類型,pojo、hashmap。
若是接收簡單類型,${}中只能寫成value。
${}接收pojo對象值,經過OGNL讀取對象中的屬性值,經過屬性.屬性.屬性...的方式獲取對象屬性值。

d.selectOne和selectList
selectOne表示查詢出一條記錄進行映射。若是使用selectOne能夠實現使用selectList也能夠實現(list中只有一個對象)。

selectList表示查詢出一個列表(多條記錄)進行映射。若是使用selectList查詢多條記錄,不能使用selectOne。

若是使用selectOne報錯:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 4


最後來講說hibernate與mybatis,你們若是用過hibernate,剛學mybatis就會很疑惑,mybatis的執行效率並不比 hibernate高多少,並且還要多寫sql語句,爲何要用它呢?下面來看一下它們的區別,你就會明白mybatis的存在是有必定道理的
看看mybatis和hibernate本質區別和應用場景:hibernate:是一個標準ORM框架(對象關係映射)。入門門檻較高的,不須要程序寫sql,sql語句自動生成了。對sql語句進行優化、修改比較困難的。應用場景:適用與需求變化很少的中小型項目,好比:後臺管理系統,erp、orm、oa。。mybatis:專一是sql自己,須要程序員本身編寫sql語句,sql修改、優化比較方便。mybatis是一個不徹底 的ORM框架,雖然程序員本身寫sql,mybatis 也能夠實現映射(輸入映射、輸出映射)。應用場景:適用與需求變化較多的項目,好比:互聯網項目。

相關文章
相關標籤/搜索