MyBatis-3.4.5
阿新 • • 發佈:2019-02-19
eclipse補全程式碼快捷鍵:Alt+/
MyBatis3簡介
- 是Apache組織提供的一個輕量級的持久層框架。
- 支援普通SQL查詢、儲存過程和高階對映。
- 消除了幾乎所有的JDBC程式碼和引數的手工設定過程以及對結果集的檢索封裝。
- 使用簡單的XML或註解來進行配置和原始對映,將DAO介面和POJO對映成資料庫中的記錄。
MyBatis3的優勢(Hibernate無法做到)
- 出於安全考慮,客戶企業只對僱用的IT公司的開發團隊提供幾條Select SQL(或儲存過程)以獲取所需資料,具體的表結構不予公開。
- 開發規範中要求,所有牽涉到service元件的資料庫操作,必須在資料庫層由SP(Stored Procedure,儲存過程)實現(就金融行業而言,這是一條必須執行的開發規範)。
- 系統資料處理量巨大,效能要求極為苛刻,這迫使我們必須高度優化SQL語句(或SP),才能達到系統性能的設計指標。
MyBatis3與Hibernate的相同點和不同點
- 相同點:都提供ORM機制。
- 不同點:MyBatis3提供“半自動ORM機制”, Hibernate提供“全自動ORM機制”。
- 總結:相對於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();
}
}
- 每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的例項為中心的。SqlSessionFactory 的例項可以通過 SqlSessionFactoryBuilder 獲得。
SqlSessionFactoryBuilder 則可以從 XML 配置檔案或一個預先定製的 Configuration 的例項構建出 SqlSessionFactory 的例項。 - 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(); //關閉持久層
}
}
- 名稱空間(Namespaces)(自定義)必選
- 命名解析(即XXMapper.xml中標籤的namespace屬性值+標籤的id屬性值,直指MyBatis的sql語句集)
為了減少輸入量,MyBatis 對所有的命名配置元素(包括語句,結果對映,快取等)使用瞭如下的命名解析規則。
完全限定名(比如“com.mypackage.MyMapper.selectAllThings”)將被直接查詢並且找到即用。
短名稱(比如“selectAllThings”)如果全域性唯一也可以作為一個單獨的引用。如果不唯一,有兩個或兩個以上的相同名稱(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings”),那麼使用時就會收到錯誤報告說短名稱是不唯一的,這種情況下就必須使用完全限定名。
通過介面的方式訪問增刪改查方法
- 先根據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(); //呼叫
}
}