MyBatis簡介
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis 。 2013年11月遷移到Github。
iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。 iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)
1.所需jar包
這裡單獨討論MyBatis的使用,只需要放入mybatis-xxxjar包即可。
如果使用maven構建項目,則需要在pom.xml的dependency中放入如下配置:
<dependency><groupid>org.mybatis</groupid>mybatis</artifactid><version>3.2.2</version></dependency>
公司目前用的3.2.2的,可以根據自己的jar包放入版本號。
如果你是與相應的框架一起集成,則需要放入集成包,比如,我們公司用mybatis與spring集成,
則還需要加入mybatis-spring-xxx.jar包,根據實際情況決定。當然了,數據庫驅動jar包也是少不了的。
2.從XML中構建SqlSessionFactory
每個基於MyBatis 的應用都是以一個SqlSessionFactory 的實例為中心的。
SqlSessionFactory 的實例可以通過SqlSessionFactoryBuilder 獲得。
而SqlSessionFactoryBuilder 則可以從XML 配置文件或一個預先定制的Configuration 的實例構建出SqlSessionFactory 的實例。
從XML 文件中構建SqlSessionFactory 的實例非常簡單,建議使用類路徑下的資源文件進行配置。
但是也可以使用任意的輸入流(InputStream)實例,包括字符串形式的文件路徑或者file:// 的URL 形式的文件路徑來配置。
MyBatis 包含一個名叫Resources 的工具類,它包含一些實用方法,可使從classpath 或其他位置加載資源文件更加容易。
例如:
String resource = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
XML 配置文件(configuration XML)中包含了對MyBatis 系統的核心設置,包含獲取數據庫連接實例的數據源(DataSource)
和決定事務範圍和控制方式的事務管理器(TransactionManager)。配置文件詳細往後再說。
例如:
<!--?xml version="1.0" encoding="UTF-8" ?--><configuration><environments default="development"><environment id="development"><transactionmanager type="JDBC"><datasource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"><property name="url" value="jdbc:mysql://192.168.200.12:3306/test_mybatis"><property name="username" value="root"><property name="password" value="root123"></property></property></property></property></datasource></transactionmanager></environment></environments><mappers><!-- 註冊UserMainMapper.xml文件,UserMainMapper.xml位於com.lanhuigu.mybatis.map這個包下,所以resource寫成com/lanhuigu/mybatis/map/UserMainMapper.xml--><mapper resource="com/lanhuigu/mybatis/map/UserMainMapper.xml"></mapper></mappers></configuration>
environment 元素體中包含了事務管理和連接池的配置。 mappers 元素則是包含一組mapper 映射器(這些mapper 的XML 文件包含了SQL 代碼和映射定義信息)。
3.從SqlSessionFactory中獲取SqlSession
既然有了SqlSessionFactory ,我們就可以從中獲得SqlSession 的實例。 SqlSession 完全包含了面向數據庫執行SQL 命令所需的所有方法。
你可以通過SqlSession 實例來直接執行已映射的SQL 語句。例如:
SqlSessionFactory sqlSessionFactory = null;// XML構建SqlSessionFactory工廠實例SqlSession session = null;// 從SqlSessionFactory工廠實例中獲取SqlSession對象try {String resource = "mybatis-config.xml";InputStream is = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);session = sqlSessionFactory.openSession();User user = session.selectOne("com.lanhuigu.mybatis.map.UserMainMapper.queryUserMainById", 1);System.out.println(user.getUsername());} finally {session.close();}用這種方式執行映射沒什麼問題,我們也可以用一種更加簡潔的方式執行映射。
使用對於給定語句能夠合理描述參數和返回值的接口(比如說UserMainMapper.class),
你現在不但可以執行更清晰和類型安全的代碼,而且還不用擔心易錯的字符串字面值以及強制類型轉換。例如:
SqlSession session = sqlSessionFactory.openSession();UserMainMapper userMainMapper = session.getMapper(UserMainMapper.class);User user = userMainMapper .queryUserMainById(1);
4.實例
光看不練容易迷糊,看看實例,在回去讀文檔,或許效果會更好。
準備jar包:
mybatis-3.2.2.jar(mybatis)
mysql-connector-java-5.1.21.jar(數據庫驅動)
junit-4.4.jar(測試,不想用這個junit,用main方法測試也行)
項目結構:
資料庫:
CREATE TABLE `t_user_main` (`f_id` int(11) NOT NULL,`f_username` varchar(20) DEFAULT NULL,`f_age` int(3) DEFAULT NULL,PRIMARY KEY (`f_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;INSERT INTO t_user_main VALUES(1,'testMyBatis',25);
mybatis的xml配置--mybatis-config.xml:
<!--?xml version="1.0" encoding="UTF-8" ?--><configuration><environments default="development"><environment id="development"><transactionmanager type="JDBC"><datasource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"><property name="url" value="jdbc:mysql://192.168.200.12:3306/test_mybatis"><property name="username" value="root"><property name="password" value="root123"></property></property></property></property></datasource></transactionmanager></environment></environments><mappers><!-- 註冊UserMainMapper.xml文件,UserMainMapper.xml位於com.lanhuigu.mybatis.map這個包下,所以resource寫成com/lanhuigu/mybatis/map/UserMainMapper.xml--><mapper resource="com/lanhuigu/mybatis/map/UserMainMapper.xml"></mapper></mappers></configuration>
User.java:
package com.lanhuigu.mybatis.entity;import java.io.Serializable;public class User implements Serializable{private static final long serialVersionUID = -3412068097348759984L;private Integer id;private String username;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}}UserMainMapper.xml:
<!--?xml version="1.0" encoding="UTF-8" ?--> <!-- 為這個mapper指定一個唯一的namespace,namespace的值習慣上設置成包名+去掉sql映射文件後綴的文件名,這樣就能夠保證namespace的值是唯一的,例如namespace="com.lanhuigu.mybatis.map.UserMainMapper"就是com.lanhuigu.mybatis.map(包名)+UserMainMapper(UserMainMapper.xml文件去除後綴)--><mapper namespace="com.lanhuigu.mybatis.map.UserMainMapper"> <!-- 在select標籤中編寫查詢的SQL語句, 設置select標籤的id屬性為queryUserMainById,id屬性值必須是唯一的,不能夠重複使用parameterType屬性指明查詢時使用的參數類型,resultType屬性指明查詢返回的結果集類型resultType="com.lanhuigu.mybatis.entity.User"就表示將查詢結果封裝成一個User類的對象返回User類就是users表所對應的實體類--><select id="queryUserMainById" parametertype="int" resulttype="com.lanhuigu.mybatis.entity.User"> select f_id id, f_username username, f_age age from t_user_main where f_id = #{id} </select> </mapper>MyBatisTest.java測試代碼:
package com.lanhuigu.mybatis;import java.io.IOException;import java.io.InputStream;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 org.junit.Test;import com.lanhuigu.mybatis.entity.User;public class MyBatisTest {@Testpublic void testMyBatis() throws IOException {SqlSessionFactory sqlSessionFactory = null;// XML構建SqlSessionFactory工廠實例SqlSession session = null;// 從SqlSessionFactory工廠實例中獲取SqlSession對象try {//1.mybatis的配置文件路徑,這裡放在classpath下,相當於src下String resource = "mybatis-config.xml";//2.讀取mybatis配置文件,同時創建SqlSessionFactory工廠實例//======2.1使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件)//InputStream is = MyBatisTest.class.getClassLoader().getResourceAsStream(resource);//構建SqlSessionFactory工廠//sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//======2.2使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關聯的映射文件)//Reader reader = Resources.getResourceAsReader(resource); //構建SqlSessionFactory工廠//sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//======2.3 使用MyBatis提供的Resources類加載mybatis的配置文件InputStream is = Resources.getResourceAsStream(resource);//構建SqlSessionFactory工廠sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//3.創建能執行映射文件中sql的sqlSessionsession = sqlSessionFactory.openSession();/*** 映射sql的標識字符串:* com.lanhuigu.mybatis.map.UserMainMapper是UserMainMapper.xml文件中mapper標籤的namespace屬性的值,* queryUserMainById是UserMainMapper.xml文件select標籤的id屬性值,通過select標籤的id屬性值,* 通過這兩個的組合就可以找到要執行的SQL*///執行查詢返回一個唯一user對象的sql,注意:"com.lanhuigu.mybatis.map.UserMainMapper.queryUserMainById"為映射sql的標識字符串User user = session.selectOne("com.lanhuigu.mybatis.map.UserMainMapper.queryUserMainById", 1);System.out.println(user.getUsername());} finally {session.close();}}}控制台輸出:
對於以上實例,在測試代碼中:
User user = session.selectOne("com.lanhuigu.mybatis.map.UserMainMapper.queryUserMainById", 1);System.out.println(user.getUsername());這段代碼使用起來是不是很不爽,我們說過有種更直接的方式:
在項目結構map下加上一個映射接口:
package com.lanhuigu.mybatis.map;import com.lanhuigu.mybatis.entity.User;public interface UserMainMapper {public User queryUserMainById(int id);}同時,將測試的代碼做如下修改:
package com.lanhuigu.mybatis;import java.io.IOException;import java.io.InputStream;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 org.junit.Test;import com.lanhuigu.mybatis.entity.User;import com.lanhuigu.mybatis.map.UserMainMapper;public class MyBatisTest {@Testpublic void testMyBatis() throws IOException {SqlSessionFactory sqlSessionFactory = null;// XML構建SqlSessionFactory工廠實例SqlSession session = null;// 從SqlSessionFactory工廠實例中獲取SqlSession對象try {//1.mybatis的配置文件路徑,這裡放在classpath下,相當於src下String resource = "mybatis-config.xml";//2.讀取mybatis配置文件,同時創建SqlSessionFactory工廠實例//======2.1使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件)//InputStream is = MyBatisTest.class.getClassLoader().getResourceAsStream(resource);//構建SqlSessionFactory工廠//sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//======2.2使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關聯的映射文件)//Reader reader = Resources.getResourceAsReader(resource); //構建SqlSessionFactory工廠//sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//======2.3 使用MyBatis提供的Resources類加載mybatis的配置文件InputStream is = Resources.getResourceAsStream(resource);//構建SqlSessionFactory工廠sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//3.創建能執行映射文件中sql的sqlSessionsession = sqlSessionFactory.openSession();/*** 映射sql的標識字符串:* com.lanhuigu.mybatis.map.UserMainMapper是UserMainMapper.xml文件中mapper標籤的namespace屬性的值,* queryUserMainById是UserMainMapper.xml文件select標籤的id屬性值,通過select標籤的id屬性值,* 通過這兩個的組合就可以找到要執行的SQL*///執行查詢返回一個唯一user對象的sql,注意:"com.lanhuigu.mybatis.map.UserMainMapper.queryUserMainById"為映射sql的標識字符串/*User user = session.selectOne("com.lanhuigu.mybatis.map.UserMainMapper.queryUserMainById", 1);System.out.println(user.getUsername());*/UserMainMapper userMainMapper = session.getMapper(UserMainMapper.class);User user = userMainMapper.queryUserMainById(1);System.out.println(user.getUsername());} finally {session.close();}}}把之前的查詢部分修改成:
UserMainMapper userMainMapper = session.getMapper(UserMainMapper.class);User user = userMainMapper.queryUserMainById(1);
使用對於給定語句能夠合理描述參數和返回值的接口(比如說UserMainMapper.class),
現在不但可以執行更清晰和類型安全的代碼,而且還不用擔心易錯的字符串字面值以及強制類型轉換。
運行測試代碼,效果一樣。
userMainMapper接口位置:
既然我們加完了接口,mybatis-config.xml對於映射器部分可以換一種配置,直接映射UserMainMapper接口所在包文件:
也就是將
修改成
完整配置如下,運行測試代碼即可檢驗,這種做法維護更輕鬆,統一對map進行管理:
<!--?xml version="1.0" encoding="UTF-8" ?--><configuration><environments default="development"><environment id="development"><transactionmanager type="JDBC"><datasource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"><property name="url" value="jdbc:mysql://192.168.200.12:3306/test_mybatis"><property name="username" value="root"><property name="password" value="root123"></property></property></property></property></datasource></transactionmanager></environment></environments><mappers><!-- 註冊UserMainMapper.xml文件,UserMainMapper.xml位於com.lanhuigu.mybatis.map這個包下,所以resource寫成com/lanhuigu/mybatis/map/UserMainMapper.xml--><!-- <mapper resource="com/lanhuigu/mybatis/map/UserMainMapper.xml"></mapper> --><package name="com.lanhuigu.mybatis.map"></package></mappers></configuration>
以上我們可以看到不管我們怎麼玩,sql是不是還在UserMainMapper.xml中映射?
這種方式實現是唯一的嗎?難道我必須要用xml?
當然不是了,如果以上你的代碼是一路修改下來測試成功的,那麼我們再做最後一個修改,
不用UserMainMapper.xml實現映射,我們採用java註解來實現映射。
主要修改的地方是UserMainMapper.java這個接口,新加一個方法queryUserMainByIdNew,用註解實現映射
mybatis自解析接口映射。
修改後的UserMainMapper.java接口:
package com.lanhuigu.mybatis.map;import org.apache.ibatis.annotations.Param;import org.apache.ibatis.annotations.Select;import com.lanhuigu.mybatis.entity.User;public interface UserMainMapper {/*** xml*/public User queryUserMainById(int id);/*** java註解*/@Select("select f_id id,f_username username,f_age age from t_user_main where f_id = ${id} ")public User queryUserMainByIdNew(@Param("id") int id);}修改後的測試代碼,運行感受下:
package com.lanhuigu.mybatis;import java.io.IOException;import java.io.InputStream;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 org.junit.Test;import com.lanhuigu.mybatis.entity.User;import com.lanhuigu.mybatis.map.UserMainMapper;public class MyBatisTest {@Testpublic void testMyBatis() throws IOException {SqlSessionFactory sqlSessionFactory = null;// XML構建SqlSessionFactory工廠實例SqlSession session = null;// 從SqlSessionFactory工廠實例中獲取SqlSession對象try {//1.mybatis的配置文件路徑,這裡放在classpath下,相當於src下String resource = "mybatis-config.xml";//2.讀取mybatis配置文件,同時創建SqlSessionFactory工廠實例//======2.1使用類加載器加載mybatis的配置文件(它也加載關聯的映射文件)//InputStream is = MyBatisTest.class.getClassLoader().getResourceAsStream(resource);//構建SqlSessionFactory工廠//sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//======2.2使用MyBatis提供的Resources類加載mybatis的配置文件(它也加載關聯的映射文件)//Reader reader = Resources.getResourceAsReader(resource); //構建SqlSessionFactory工廠//sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);//======2.3 使用MyBatis提供的Resources類加載mybatis的配置文件InputStream is = Resources.getResourceAsStream(resource);//構建SqlSessionFactory工廠sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//3.創建能執行映射文件中sql的sqlSessionsession = sqlSessionFactory.openSession();/*** 映射sql的標識字符串:* com.lanhuigu.mybatis.map.UserMainMapper是UserMainMapper.xml文件中mapper標籤的namespace屬性的值,* queryUserMainById是UserMainMapper.xml文件select標籤的id屬性值,通過select標籤的id屬性值,* 通過這兩個的組合就可以找到要執行的SQL*///執行查詢返回一個唯一user對象的sql,注意:"com.lanhuigu.mybatis.map.UserMainMapper.queryUserMainById"為映射sql的標識字符串/*User user = session.selectOne("com.lanhuigu.mybatis.map.UserMainMapper.queryUserMainById", 1);System.out.println(user.getUsername());*//*UserMainMapper userMainMapper = session.getMapper(UserMainMapper.class);User user = userMainMapper.queryUserMainById(1);System.out.println(user.getUsername());*/UserMainMapper userMainMapper = session.getMapper(UserMainMapper.class);User user = userMainMapper.queryUserMainByIdNew(1);System.out.println(user.getUsername());} finally {session.close();}}}以上所述是小編給大家介紹的MyBatis入門初體驗之使用大全(2),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!