1. 程式人生 > >在JavaEE中使用Mybatis框架

在JavaEE中使用Mybatis框架

MyBatis 使用簡單的 XML 或註解用於配置和原始對映,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 物件)對映成資料庫中的記錄。每個MyBatis應用程式主要都是使用SqlSessionFactory例項的,一個SqlSessionFactory例項可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置檔案或者一個預定義的配置類的例項獲得。

使用框架就是引用別人封裝好的jar包,按照別人規定好的方式進行配置並呼叫jar包裡的各種方法。那Mybatis需要進行哪些配置呢?我們來看一個例子:

 

一、建立簡單的pojo類

package com.wenji.entity;

public class Employee {
       private int id;
       private String firstName; 
       private String lastName;   
       private int salary;  

       public Employee() {}
       public Employee(int id,String firstName, String lastName, int
salary) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.salary = salary; } //省略getter、setter方法 }
Employee類

二、設定 mybatis 配置檔案: Configure.xml(檔名隨便起), 在 src/config 目錄下建立此檔案,內容如下:

<?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
     <typeAliases>
         <typeAlias type="com.wenji.entity.Employee" alias="Employee"/>
     </typeAliases>
     
     <environments default
="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="oracle.jdbc.driver.OracleDriver"></property> <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property> <property name="username" value="system"></property> <property name="password" value="123456"></property> </dataSource> </environment> </environments> <mappers> <mapper resource="com/wenji/mapping/Employee.xml"></mapper> </mappers> </configuration>

三、設定Mybatis對映檔案

<?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.wenji.UserMapper">
    <select id="GetEmployeeByID" parameterType="int" resultType="Employee">
        select id,first_name firstName,last_name lastName,salary from HTCPP.Employee where id = #{id}
    </select>
</mapper>

下面是對這兩個配置檔案一點解釋說明:
1、配置檔案 Configure.xml 是 mybatis 用來建立 sessionFactory,裡面主要包含了資料庫連線相關內容,還有 java 類所對應的別名,比如:<typeAlias type="com.wenji.entity.Employee" alias="Employee"/> 這個別名非常重要,在具體的類的對映中,比如:Employee.xml中 resultType 就是對應這個。要保持一致,這裡的 resultType 還有另外單獨的定義方式,後面我們再詳細介紹說明。
2、Configure.xml 裡面 的<mapper resource="com/wenji/mapping/Employee.xml"></mapper>是包含要對映的類的 xml 配置檔案。
3、在Employee.xml 檔案裡面主要是定義各種 SQL 語句,以及這些語句的引數,以及要返回的型別等等。

四、測試是否成功

package com.wenji.test;

import java.util.List; 
import java.util.Date;
import java.util.Iterator; 

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.wenji.entity.Employee;

public class ManageEmployee {
    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;

    static {
        try {
            reader = Resources.getResourceAsReader("configure.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static SqlSessionFactory getSession() {
        return sqlSessionFactory;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SqlSession session = sqlSessionFactory.openSession();
        try {
            Employee employee = (Employee) session.selectOne(
                    "com.wenji.UserMapper.GetEmployeeByID", 2);
            if(employee!=null){
                System.out.println("First Name: " + employee.getFirstName()); 
                System.out.println("Last Name: " + employee.getLastName()); 
                System.out.println("Salary: " + employee.getSalary()); 
            }
        } finally {
            session.close();
        }
    }
}

 

Mybatis也提供了註解的方式來定義對映,來看下面這個示例

Employee類不變,Employee.xml檔案不見了,取而代之的是IEmployee.java介面

package com.wenji.dao;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.wenji.entity.Employee;

public interface IEmployee {
    @Select("select id,first_name firstName,last_name lastName,salary from Employee where id = #{id3}")
    public Employee getEmployeeByID(int id2);
    
    @Select("select id,first_name firstName,last_name lastName,salary from Employee ")
    public List<Employee> getEmployeeList();
    
    @Insert(" INSERT INTO Employee(id,first_name, last_name,salary) VALUES(#{id}, #{firstName}, #{lastName}, #{salary})")
    public void insertEmployee(Employee ee);

    @Update("UPDATE Employee SET id=#{id},first_name = #{firstName},last_name = #{lastName},salary = #{salary} WHERE id =#{id}")
    public void updateEmployee(Employee ee);
    
    @Delete("DELETE FROM Employee WHERE id = #{id}")
    public void  deleteEmployee(int id);
}

因為不存在Employee.xml,所以配置檔案只是註釋掉一行

<?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
         <typeAlias type="com.wenji.entity.Employee" alias="Employee"/>
<!--         <package name="entity"></package> -->
     </typeAliases>
     
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="oracle.jdbc.driver.OracleDriver"></property>
                 <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
                 <property name="username" value="developer"></property>
                 <property name="password" value="developer"></property>
             </dataSource>
         </environment>
     </environments>
     <mappers>
<!--          <mapper resource="com/wenji/mapping/Employee.xml"></mapper> -->
    </mappers>
</configuration>

測試方法有很大的不同

package com.wenji.test;

import java.util.List; 
import java.util.Date;
import java.util.Iterator; 

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.wenji.dao.IEmployee;
import com.wenji.entity.Employee;

public class ManageEmployee {
    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;
    static {
        try {
            reader = Resources.getResourceAsReader("configure.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            sqlSessionFactory.getConfiguration().addMapper(IEmployee.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getSession() {
        return sqlSessionFactory;
    }

    public static void main(String[] args) {
        getEmployeeByID(1);
//        getEmployeeList();
//        testInsert();
//        testUpdate();
//        testDelete();
    }
    
    private static void getEmployeeByID(int id){
         SqlSession session = sqlSessionFactory.openSession();
         try {
             IEmployee iEmployee = session.getMapper(IEmployee.class);
             Employee employee = iEmployee.getEmployeeByID(id);
             System.out.print("First Name: " + employee.getFirstName()); 
             System.out.print("  Last Name: " + employee.getLastName()); 
             System.out.println("  Salary: " + employee.getSalary()); 
         } finally {
             session.close();
         }
    }
    
    private static void  getEmployeeList(){
        SqlSession session = sqlSessionFactory.openSession();
        try {
            IEmployee iEmployee = session.getMapper(IEmployee.class);
            List<Employee> employees = iEmployee.getEmployeeList();
            printEmployees(employees);
        } finally {
            session.close();
        }
    }
    
    public static void testInsert(){
        try{
            // 獲取Session連線
            SqlSession session = sqlSessionFactory.openSession();
            // 獲取Mapper
            IEmployee eMapper = session.getMapper(IEmployee.class);
            System.out.println("Test insert start...");
            // 執行插入
            Employee ee = new Employee();
            ee.setId(5);
            ee.setFirstName("zhang");
            ee.setLastName("san");
            ee.setSalary(100);
            eMapper.insertEmployee(ee);
            // 提交事務
            session.commit();

            // 顯示插入之後Employee資訊
            System.out.println("After insert");
            getEmployeeList();
            System.out.println("Test insert finished...");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void testUpdate(){
        try{
            SqlSession session = sqlSessionFactory.openSession();
            IEmployee eMapper = session.getMapper(IEmployee.class);
            System.out.println("Test update start...");
            printEmployees(eMapper.getEmployeeList());
            // 執行更新
            Employee ee = eMapper.getEmployeeByID(5);
            ee.setFirstName("New name");
            eMapper.updateEmployee(ee);
            // 提交事務
            session.commit();
            // 顯示更新之後Employee資訊
            System.out.println("After update");
            getEmployeeList();
            System.out.println("Test update finished...");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    // 刪除使用者資訊
    public static void testDelete(){
        try{
            SqlSession session = sqlSessionFactory.openSession();
            IEmployee eMapper = session.getMapper(IEmployee.class);
            System.out.println("Test delete start...");
            // 顯示刪除之前Employee資訊
            System.out.println("Before delete");
            getEmployeeList();
            // 執行刪除
            eMapper.deleteEmployee(5);
            // 提交事務
            session.commit();
            // 顯示刪除之後User資訊
            System.out.println("After delete");
            getEmployeeList();
            System.out.println("Test delete finished...");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    
    /**
     * 
     * 列印使用者資訊到控制檯
     * 
     * @param users
     */
    private static void printEmployees(final List<Employee> employees) {
        for (Employee employee : employees) {
            System.out.print("id: " + employee.getId()); 
            System.out.print("First Name: " + employee.getFirstName()); 
            System.out.print("  Last Name: " + employee.getLastName()); 
            System.out.println("  Salary: " + employee.getSalary()); 
        }
    }
}