1. 程式人生 > >【MyBatis】MyBatis實現CRUD操作

【MyBatis】MyBatis實現CRUD操作

\n \t 事務 time nihao name conf bye class ora

1、實現基本CRUD功能

使用MyBatis對數據完整的操作,也就是CRUD功能的實現。根據之前的內容,要想實現CRUD,只需要進行映射文件的配置。

範例:修改EmpMapper.xml文件,實現CRUD

<?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">
  <!--     每個POJO都對應MyBatis的一個命名空間,不能重復。
          resultType使用全路徑
          設置命名空間,可以與不同表的同類型操作進行區分,使用時以“namespace.id”的方式調用;命名空間按照表名稱給出   
--> <mapper namespace="com.github.logsave.pojo.EmpMapper"> <insert id="creatOne" parameterType="com.github.logsave.pojo.Emp"> INSERT INTO emp(empno,ename,job,mgr,hiredate,sal) VALUES (#{empno},#{ename},#{job},#{mgr},#{hiredate},#{sal}) </insert> <!-- 數據更新操作,最簡單的更新一定是基於Emp類的數據實現的
--> <update id="updateOne" parameterType="com.github.logsave.pojo.Emp"> UPDATE emp SET empno=#{empno}, ename=#{ename}, job=#{job}, mgr=#{mgr}, hiredate=#{hiredate}, sal=#{sal} WHERE empno={empno} </update> <!-- 刪除數據,一般根據主鍵刪除empno,empno這裏是Integer類型 -->
<delete id="removeOne" parameterType="java.lang.Integer"> DELETE FROM emp WHERE empno=#{empno} </delete> <!-- 根據empno查詢 --> <select id="selOne" resultType="com.github.logsave.pojo.Emp"> SELECT empno,ename,job,mgr,hiredate,sal FROM emp WHERE empno=#{empno} </select> <!-- 查詢全部數據,此時配置的resultType表示當前查詢結果中每一條數據返回的對象類型,不是整個方法的返回。 --> <select id="selAll" resultType="com.github.logsave.pojo.Emp"> SELECT empno,ename,job,mgr,hiredate,sal FROM emp </select> </mapper>

此時已經完成了映射文件的配置。就可以利用SqlSession類對象完成具體的操作,方法如下:

  • 增加數據:public int insert(String statrment, Object parameter), 返回增加的行數;
  • 刪除數據:public int delete(String statrment, Object parameter), 返回刪除的行數;
  • 更新數據:public int update(String statrment, Object parameter), 返回更新的行數;
  • 查詢單個數據:public T selectOne(String statrment, Object parameter);
  • 查詢全部數據:public List selectList(String statement)。

測試CRUD功能,分別編寫函數進行測試。

範例:執行函數主方法

public static void main(String[] args) {

    try {
        // 1、取得操作的SqlSession對象
        String resource = "mybatis-config.xml"; // MyBatis配置文件路徑
        Reader reader = Resources.getResourceAsReader(resource); // 當前配置文件輸入流
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 數據庫會話工廠
        SqlSession sqlSession = sqlSessionFactory.openSession(); // 取得連接
            
            // 2、操作簡單Java類    
            // 為了測試方便,將各個方法分別編寫函數進行測試。在函數中改變方法內容進行測試。
//            creat(sqlSession);                     // 增加數據
//            selectByEmpNo(sqlSession,7499);     // 按empno查詢數據    
//            update(sqlSession);                    // 更新數據
//            remove(sqlSession);                    // 刪除數據
//            selectAll(sqlSession);                // 查詢全部數據
        
        sqlSession.close();        // 關閉連接
    } catch(IOException e) {
        e.printStackTrace();
    }
}

範例:增加數據

public static void creat(SqlSession sqlSession) {
    Emp emp = new Emp();
    emp.setEmpno(7369); 
    emp.setEname("SMITH");
    emp.setJob("CLERK");
    emp.setMgr(7902);
    
    Calendar c = Calendar.getInstance();
    c.set(1980,10,17);
    Date date = c.getTime();
    emp.setHiredate(date);
    
    emp.setSal(800.00);
        
    System.out.println("【INSERT】數據更新行數:" 
    + sqlSession.insert("com.github.logsave.pojo.EmpMapper.creatOne",emp)); sqlSession.commit(); // 事務提交 }
【INSERT】數據更新行數:1

範例:刪除數據

public static void remove(SqlSession sqlSession) {
    int empno = 7499;     // 刪除數據的empno
    System.out.println("【DELETE】數據更新行數:" + 
        sqlSession.delete("com.github.logsave.pojo.EmpMapper.removeOne",empno));
    sqlSession.commit();
}
【DELETE】數據更新行數:1

範例:更新數據

public static void update(SqlSession sqlSession) {
    Emp emp = new Emp();
    emp.setEmpno(7369); 
    emp.setEname("Logsave");
    emp.setJob("MANAGER");
//    emp.setMgr(7839);   // 註釋掉數據庫中對應值為null
    
    Calendar c = Calendar.getInstance();
    c.set(2015,10,20);
    Date date = c.getTime();
    emp.setHiredate(date);
    emp.setSal(1600.00);
        
    System.out.println("【UPDATE】數據更新行數:" 
    + sqlSession.update("com.github.logsave.pojo.EmpMapper.updateOne",emp)); sqlSession.commit(); // 事務提交 }
【UPDATE】數據更新行數:1

範例:查詢單條數據

public static void selectByEmpNo(SqlSession sqlSession) {
    int empno = 7369;
    System.out.println("【SELECT】selectByEmpno:" + empno + "\n \t" 
    + sqlSession.selectOne("com.github.logsave.pojo.EmpMapper.selOne", empno)); }
【SELECT】selectByEmpno:7369
     Emp [empno=7369, ename=Logsave, job=MANAGER, mgr=null, hiredate=Fri Nov 20 00:00:00 CST 2015, sal=1600.0]

範例:查詢全部數據

public static void selectAll(SqlSession sqlSession) {
    List<Emp> empList = sqlSession.selectList("com.github.logsave.pojo.EmpMapper.selAll");
    System.out.println("【SELECT】selectAll:");
    for(Emp emp: empList) {
        System.out.println("\t" + emp);
    }    
}
【SELECT】selectAll:
    Emp [empno=7369, ename=Logsave, job=MANAGER, mgr=null, hiredate=Fri Nov 20 00:00:00 CST 2015, sal=1600.0]
    Emp [empno=7521, ename=WARD, job=SALESMAN, mgr=7698, hiredate=Thu Oct 20 00:00:00 CST 1983, sal=1250.0]

現在完成了MyBatis的CRUD操作,已經可以進行簡單的操作了。

2、分頁顯示

實現了CRUD之後,我們就應該實現數據的分頁顯示。分頁顯示所需要的參數:

  • 模糊查詢的列:column;
  • 模糊查詢關鍵字:keyWord;
  • 開始行:start(currentPage *lineSize)
  • 取得數據的長度:lineSize。

註意:MySQL中使用LIMIT進行分頁,在Oracle中使用偽列ROWNUM進行分頁操作。

實現分頁操作需要多個參數,那麽這些參數需要一次性傳遞完成,這個時候就需要設置Map集合,利用Map集合完成參數傳遞。

範例:修改EmpMapper.xml文件

  <!-- 定義分頁查詢,其中所有的參數都利用Map集合傳遞,返回的每行數據類型為Emp -->
  <select id="selAllBySplit" parameterType="java.util.Map" resultType="com.github.logsave.pojo.Emp">
    SELECT empno,ename,job,mgr,hiredate,sal FROM emp
    WHERE ${column} LIKE #{keyWord}
    LIMIT #{start}, #{lineSize}
  </select>
  
  <!-- 查詢全部數據量,參數使用Map集合,返回COUNT()的統計結果  -->
  <select id="count" parameterType="java.util.Map" resultType="java.lang.Integer">
     SELECT COUNT(empno) FROM emp 
     WHERE ${column} LIKE #{keyWord}
  </select>

下面的查詢依然需要的是查詢全部數據,但是需要傳遞參數:

  • 查詢全部數據:public List selectList(String statement)

範例:實現分頁查詢

public static void split(SqlSession sqlSession) {
    // 分頁操作必要的參數
    int currentPage = 1; // 當前所在頁
    int lineSize = 3; // 每頁顯示的長度
    // 需要將參數設置為Map集合後傳遞到調用的方法裏
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("column", "ename");
    map.put("keyWord", "%o%");
    map.put("start", (currentPage - 1) * lineSize);
    map.put("lineSize", lineSize);
    List<Emp> empList = sqlSession.selectList("com.github.logsave.pojo.EmpMapper.selAllBySplit", map);
    System.out.println("【SELECT】分頁操作:");
    for(Emp emp: empList) {
        System.out.println("\t" + emp);
    }    
}
【SELECT】分頁操作:
    Emp [empno=7369, ename=Logsave, job=MANAGER, mgr=null, hiredate=Fri Nov 20 00:00:00 CST 2015, sal=1600.0]
    Emp [empno=7777, ename=Hello, job=work, mgr=8888, hiredate=Tue Jan 01 00:00:00 CST 2019, sal=1800.0]
    Emp [empno=7771, ename=nihao, job=work, mgr=8888, hiredate=Mon Feb 02 00:00:00 CST 2015, sal=1800.0]

範例:統計數據行數

public static void count(SqlSession sqlSession) {
    Map<String, Object> map = new HashMap<String, Object>(); 
    map.put("column", "ename");
    map.put("keyWord", "%o%");
    System.out.println("【COUNT】數據個數:" 
    + sqlSession.selectOne("com.github.logsave.pojo.EmpMapper.count", map) );
}
【COUNT】數據個數:3

程序源碼

【MyBatis】MyBatis實現CRUD操作