1. 程式人生 > >MyBatis-3.4.5

MyBatis-3.4.5

eclipse補全程式碼快捷鍵:Alt+/

MyBatis3簡介

  1. 是Apache組織提供的一個輕量級的持久層框架。
  2. 支援普通SQL查詢、儲存過程和高階對映。
  3. 消除了幾乎所有的JDBC程式碼和引數的手工設定過程以及對結果集的檢索封裝。
  4. 使用簡單的XML或註解來進行配置和原始對映,將DAO介面和POJO對映成資料庫中的記錄。

MyBatis3的優勢(Hibernate無法做到)

  1. 出於安全考慮,客戶企業只對僱用的IT公司的開發團隊提供幾條Select SQL(或儲存過程)以獲取所需資料,具體的表結構不予公開。
  2. 開發規範中要求,所有牽涉到service元件的資料庫操作,必須在資料庫層由SP(Stored Procedure,儲存過程)實現(就金融行業而言,這是一條必須執行的開發規範)。
  3. 系統資料處理量巨大,效能要求極為苛刻,這迫使我們必須高度優化SQL語句(或SP),才能達到系統性能的設計指標。

MyBatis3與Hibernate的相同點和不同點

  1. 相同點:都提供ORM機制。
  2. 不同點:MyBatis3提供“半自動ORM機制”, Hibernate提供“全自動ORM機制”。
  3. 總結:相對於Hibernate而言,MyBatis3以SQL開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。

MyBatis開發環境搭建

建立一個java project ,引入jar包到src,包括MyBatis的jar包和MySQL的jar包,右鍵點選jar包–>Build Path–>Add To Build Path:

引入mybatis的主配置檔案到src,建立mybatis-config.xml:

建立資料庫連線資訊文件db.properties,再引入到mybatis-config.xml中:

db.properties:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/users?useUnicode=true&&characterEncoding=UTF8
db.username=root
db.password=root
mybatis-config.xml中<configuration
>
標籤下: <properties resource="db.properties">

建立POJO和資料庫,如:

pojo

public class User {
    private int id;
    private String userName;
    private String userPwd;
    set...get...
}

database

CREATE SCHEMA users;
USE users;
CREATE TABLE user (
  id  INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  userName  VARCHAR(40) NOT NULL,
  userPwd   VARCHAR(40) NOT NULL
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

在POJO所在包下建立一個POJO對映檔案:XXMapper.xml

如:

<?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.orm.UserMapper">
<!-- id="儲存過程名",resultType="返回型別" -->
  <select id="selectUser" resultType="com.orm.User">
    select * from User where id = #{id}
  </select>
</mapper>

再將POJO對映檔案引用到mybatis-config.xml中:

如:

<mappers>
    <mapper resource="com/orm/UserMapper.xml"/>
</mappers>

最終mybatis-config.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>
<properties resource="db.properties"/>
  <environments default="development">
 <!--  一個environment連線一個數據庫 -->
    <environment id="users">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${db.driver}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/orm/UserMapper.xml"/>
  </mappers>
</configuration>

建立一個載入類來載入配置檔案:

public class MyBatisUtils {
          //靜態方法,無需new,可直接被呼叫
    public  static  SqlSession  openSession()  throws  IOException{
             String resource = "mybatis-config.xml";
             InputStream in = Resources.getResourceAsStream(resource);  
             SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
             return ssf.openSession();
    }
}
  1. 每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的例項為中心的。SqlSessionFactory 的例項可以通過 SqlSessionFactoryBuilder 獲得。
    SqlSessionFactoryBuilder 則可以從 XML 配置檔案或一個預先定製的 Configuration 的例項構建出 SqlSessionFactory 的例項。
  2. MyBatis 包含一個名叫 Resources 的工具類,它包含一些實用方法,可使從 classpath 或其他位置載入資原始檔更加容易。

右鍵點選src–>new–>JUnit Test Case,來建立一個測試類,再右鍵–>Run as–>JUnit Test:

/*1.必須繼承TestCase類
 *2.類名格式必須為XXTest
 *3.方法名格式必須為testXX
 */
public class MyTest extends TestCase {
     public void testSelect() throws IOException{
         SqlSession ss=MyBatisUtils.openSession(); //從載入類中獲取SqlSession物件
         String statement="com.orm.UserMapper.selectUser"; //sql語句集的全限定名
         User user=new User(); 
         user.setId(1);
         user=(User)ss.selectOne(statement, user); //selectOne(完全限定名, 物件例項)表示返回一條記錄,一個物件。
         System.out.println("資訊:"+user);
         ss.close(); //關閉持久層
     }
}
  1. 名稱空間(Namespaces)(自定義)必選
  2. 命名解析(即XXMapper.xml中標籤的namespace屬性值+標籤的id屬性值,直指MyBatis的sql語句集)
    為了減少輸入量,MyBatis 對所有的命名配置元素(包括語句,結果對映,快取等)使用瞭如下的命名解析規則。
    完全限定名(比如“com.mypackage.MyMapper.selectAllThings”)將被直接查詢並且找到即用。
    短名稱(比如“selectAllThings”)如果全域性唯一也可以作為一個單獨的引用。如果不唯一,有兩個或兩個以上的相同名稱(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings”),那麼使用時就會收到錯誤報告說短名稱是不唯一的,這種情況下就必須使用完全限定名。

通過介面的方式訪問增刪改查方法

  1. 先根據pojo的對映檔案建立一個介面類,如:
pojo的對映檔案:
<?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.orm.UserMapper">
<!-- id="儲存過程名",resultType="返回型別" parameterType="引數型別" useGeneratedKeys="是否返回主鍵"-->
  <select id="selectUser" parameterType="int" resultType="com.orm.User">
    select * from User where id = #{id}
  </select>
  <select id="selectAllUser" resultType="com.orm.User">
    select * from User 
  </select>
  <insert id="insertUser" parameterType="com.orm.User" useGeneratedKeys="true">
     insert into User (userName,userPwd) values (#{userName},#{userPwd})
  </insert>
  <delete id="deleteUser" parameterType="int">
     delete from User where id=#{id}
  </delete>
  <update id="updateUser" parameterType="com.orm.User">
     update User set userName=#{userName},userPwd=#{userPwd} where id=#{id}
  </update>
</mapper>
這是介面類:
import java.util.List;
/*1.介面名稱必須是  類名+Mapper
 *2.方法名稱必須與UserMapper.xml中的sql語句集ID一致
 *3.在mybatis-config.xml中
 *將<mapper resource="com/orm/UserMapper.xml"/>
 *改為<mapper class="com.orm.UserMapper"/>
 */
public interface UserMapper {
    public User selectUser(int id);
    public List<User> selectAllUser();
    public void insertUser(User user);
    public void deleteUser(int id);
    public void updateUser(User user);
}
Junit3測試類:
/*1.必須繼承TestCase類
 *2.類名格式必須為XXTest
 *3.方法名格式必須為testXX
 */
public class mapperTest extends TestCase {
    public void testSelectAll() throws IOException{
        SqlSession ss=MyBatisUtils.openSession();
        UserMapper mapper=ss.getMapper(UserMapper.class);
        List<User> list=mapper.selectAllUser();
        ss.close();
        System.out.println(list);
    }
    public void testInsert() throws IOException{
        SqlSession ss=MyBatisUtils.openSession();
        UserMapper mapper=ss.getMapper(UserMapper.class);
        User user=new User("王昭君","123456");
        mapper.insertUser(user);
        ss.commit(); //提交
        ss.close();
        testSelectAll(); //呼叫
    }
    public void testselectOne() throws IOException{
        SqlSession ss=MyBatisUtils.openSession();
        UserMapper mapper=ss.getMapper(UserMapper.class);
        User user=mapper.selectUser(10);
        ss.commit(); //提交
        ss.close();
        System.out.println(user);
    }

    public void testUpdate() throws IOException{
        SqlSession ss=MyBatisUtils.openSession();
        UserMapper mapper=ss.getMapper(UserMapper.class);
        User user=new User(1,"吳冠宇","202653");
        mapper.updateUser(user);
        ss.commit(); //提交
        ss.close();
        testSelectAll(); //呼叫
    }

}