What's the Mybatis?
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis 。iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO).
自己使用mybatis有大半年了,相比較厚重的hibernate和其他orm框架,mybatis更加的靈活輕巧,可以更好的配合數據庫和sql語句來開發項目。
這篇開始,我希望可以寫一個關於mybatis的快速教程,除了mybatis,中間還會貫穿一些mysql的資料和mybatis與其他框架的配置,這個系列也算是自己這段時間對使用mybatis框架的一個總結。
環境搭建
我使用的環境有
mysql:mysql5.5.37
jdk:openjdk1.7
eclipse:java ee-Kepler Service Release 2
我們還需要在mysql數據庫中建立一個名字叫做blog的schema,並建立一個user表
1 CREATE TABLE `blog`.`user` ( 2 `id` INT NOT NULL AUTO_INCREMENT, 3 `name` VARCHAR(45) NULL, 4 `age` INT NULL, 5 PRIMARY KEY (`id`));
還要記得給這個表加幾條數據喲
1 INSERT INTO `blog`.`user` (`name`, `age`) VALUES ('Mybatis', '4'); 2 INSERT INTO `blog`.`user` (`name`, `age`) VALUES ('struts2', '7'); 3 INSERT INTO `blog`.`user` (`name`, `age`) VALUES ('hibernate', '13');
接着我們在eclipse中新建一個web項目。
將jdbc的驅動包mysql-connector-java-5.1.30-bin.jar放置到web-inf下的lib文件夾中去。
再到mybatis在github的主頁上下載mybatis的jar包.
https://github.com/mybatis/mybatis-3/releases
我使用的版本是3.2.3(最新的版本是3.2.7)
當然,你也可以使用maven來管理mybatis的包,只需要在項目的pom.xml中添加.
1 <dependency> 2 <groupId>org.mybatis</groupId> 3 <artifactId>mybatis</artifactId> 4 <version>3.2.3</version> 5 </dependency>
第一個CRUD
我們在pro.app下新建一個model包,新建一個user類與數據庫相對應的vo類。
1 package pro.app.model; 2 3 public class User { 4 private int id; 5 private String name; 6 private int age; 7 public User(){} 8 public User(String name, int age) { 9 this.name = name; 10 this.age = age; 11 } 12 public int getId() { 13 return id; 14 } 15 public void setId(int id) { 16 this.id = id; 17 } 18 public String getName() { 19 return name; 20 } 21 public void setName(String name) { 22 this.name = name; 23 } 24 public int getAge() { 25 return age; 26 } 27 public void setAge(int age) { 28 this.age = age; 29 } 30 }
在pro.app.inter下建立UserDAO接口,在這個接口中定義一個根據id找到User的方法selectOne()。
1 package pro.app.inter; 2 import org.apache.ibatis.annotations.Param; 3 4 import pro.app.model.User; 5 6 public interface UserDAO { 7 public User selectOne(@Param("id")Integer id); 8 }
在pro.app.mapper下建立UserMapper.xml文件。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <mapper namespace="pro.app.inter.UserDAO"> 5 <select id="selectOne" parameterType="int" resultType="User"> 6 select * from user where id = #{id,jdbcType=INTEGER} 7 </select> 8 </mapper>
<select></select>標簽對來定義對應UserDAO中的selectOne()方法需要執行的sql語句。這也是mybatis的核心功能。
現在我們還需要在src源目錄下放置一個Configuration.xml文件用於mybatis的配置。
<?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 alias="User" type="pro.app.model.User"/> </typeAliases> <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://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="mybatis"/> <property name="password" value="mybatis"/> </dataSource> </environment> </environments> <mappers> <mapper resource="pro/app/mapper/UserMapper.xml"/> </mappers> </configuration>
在配置文件中通過定義現在的environment , 來指定目前的開發狀態,用jdbc作為事務和連接池的配置與mysql數據庫相鏈接。
在mappers下寫入需要用到的mybatis 需要用到的mapper文件。
現在我們可以建立一個類測試mybatis是不是工作了,在pro.test下建立一個userTest類。
1 package pro.app.test; 2 3 import java.io.Reader; 4 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 10 import pro.app.inter.UserDAO; 11 import pro.app.model.User; 12 13 public class UserTest { 14 private static SqlSessionFactory sqlSessionFactory; 15 private static Reader reader; 16 static{ 17 try{ 18 reader= Resources.getResourceAsReader("Configuration.xml"); 19 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 20 }catch(Exception e){ 21 e.printStackTrace(); 22 } 23 } 24 public static SqlSessionFactory getSession(){ 25 return sqlSessionFactory; 26 } 27 public static void main(String[] args) { 28 SqlSession session = sqlSessionFactory.openSession(); 29 try { 30 UserDAO userDao = session.getMapper(UserDAO.class); 31 User user = userDao.selectOne(1); 32 System.out.println("name : "+user.getName()); 33 System.out.println("age : "+user.getAge()); 34 } finally { 35 session.close(); 36 } 37 } 38 }
在這個程序中,我們通過io類庫中的Reader類來讀取mybatis的相關配置文件,並且使用mybatis里的 SqlSessionFactoryBuilder類構建一個SqlSessionFactory。
這個SqlSessionFactory就相當與mybatis配置文件的化生了,對應各種被操作的類而言,它就是整個項目中的上帝了,上帝不能老是出現吧,所以一般在一個項目中指揮有一個SqlSessionFactory出現。接着我們的程序又通過SqlSessionFactory來獲得一個SqlSession,SqlSession 對象完全包含以數據庫為背景的所有執行 SQL 操作的方法。通過這個SqlSession的實例化對象,可以獲得UserDAO接口的一個實例,接下來就可以執行相應的方法了。
來運行這個程序啦,控制台輸出了以下內容
1 name : mybatis 2 age : 4
bingo!我們如願通過mybatis獲得了數據庫的數據。
接下來我們可以在UserDAO和UserMapper中添加其他的配置完成CRUD的任務。
UserMapper.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 <mapper namespace="pro.app.inter.UserDAO"> 5 <select id="selectOne" parameterType="int" resultType="User"> 6 select * from user where id = #{id,jdbcType=INTEGER} 7 </select> 8 <insert id="insertOne" parameterType="User"> 9 insert into user (name,age) 10 values( 11 #{name,jdbcType=VARCHAR}, 12 #{age,jdbcType=INTEGER} 13 ) 14 </insert> 15 <delete id="deleteOne" parameterType="java.lang.Integer" > 16 delete from user 17 where id = #{id,jdbcType=INTEGER} 18 </delete> 19 <update id="updateOne" parameterType="User">
20 update user
21 set name=#{name,jdbcType=VARCHAR},
22 age=#{age,jdbcType=INTEGER}
23 where id= #{id,jdbcType=INTEGER}
24 </update>
25 </mapper>
UserDAO.java
1 package pro.app.inter; 2 import org.apache.ibatis.annotations.Param; 3 4 import pro.app.model.User; 5 6 public interface UserDAO { 7 public User selectOne(@Param("id")Integer id); 8 9 public void insertOne(User user); 10 11 public void deleteOne(@Param("id")Integer id); 12 13 public void updateOne(User user); 14 }
和select方法一樣,通過update,delete,insert標簽分別對updateOne()、deleteOne(),insertOne()方法,並編寫相應的接口方法來實現對應的CRUD任務。
總結
通過一個簡單的CRUD例子熟悉mybatis的基本實現。