ORM模型
簡單地說,ORM模型就是數(shù)據(jù)庫的表與簡單Java對象(Plain Ordinary Java Object,簡稱 POJO)的對象關(guān)系映射模型(Object Relational Mapping 簡稱ORM),它主要解決數(shù)據(jù)庫數(shù)據(jù)和POJO對象的相互映射。在本系列教程中,我們將詳細(xì)介紹輕量級的ORM框架MyBatis。
MyBatis概述
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis原本是apache的一個開源項目iBatis, 2010年該項目由apache software foundation 遷移到了google code并改名為MyBatis 。2013年11月MyBatis又遷移到Github。
The MyBatis SQL mapper framework makes it easier to use a relational database with object-oriented applications. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. Simplicity is the biggest advantage of the MyBatis data mapper over object relational mapping tools.
MyBatis對JDBC操作數(shù)據(jù)庫的過程進(jìn)行了封裝,使開發(fā)者只需要關(guān)注SQL本身,而不需要開發(fā)人員花費大量的精力去處理例如注冊驅(qū)動、創(chuàng)建connection、創(chuàng)建statement、手動設(shè)置參數(shù)等JDBC操作。之前,當(dāng)我們使用JDBC持久化的時候,sql語句被硬編碼到j(luò)ava代碼中,耦合度太高代碼不易于維護(hù);一旦我們修改了Java代碼就需要對項目進(jìn)行重新的編譯、打包、發(fā)布。MyBatis將sql語句和java代碼分開,功能邊界清晰;前者專注于數(shù)據(jù),后者側(cè)重于業(yè)務(wù)。
MyBatis入門示例
在此,我們以示例的形式介紹MyBatis的入門示例,詳細(xì)步驟如下:
第一步:數(shù)據(jù)準(zhǔn)備
創(chuàng)建數(shù)據(jù)庫mybatisDatabase和表user
DROP DATABASE IF EXISTS mybatisDatabase;
CREATE DATABASE mybatisDatabase;
use mybatisDatabase;
CREATE TABLE user(
? id INT primary key auto_increment,
? username VARCHAR(50),
? password VARCHAR(50),
? gender VARCHAR(10)
);
INSERT INTO user(username,password,gender) VALUES("lucy","123456","female");
INSERT INTO user(username,password,gender) VALUES("momo","234567","female");
INSERT INTO user(username,password,gender) VALUES("xixi","345678","female");
INSERT INTO user(username,password,gender) VALUES("pepe","456123","female");
SELECT * FROM user;
第二步:創(chuàng)建Java項目
創(chuàng)建普通Java項目并在該項目下新建config和lib文件夾
創(chuàng)建文件完畢后請對config執(zhí)行Build Path,圖示如下:
第三步:User
請在cn.com.pojo創(chuàng)建User類
package cn.com.pojo;
public class User {
private int id;
private String username;
private String password;
private String gender;
public User() {
}
public User(int id, String username, String password, String gender) {
this.id = id;
this.username = username;
this.password = password;
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", gender=" + gender + "]";
}
}
該User類中各屬性值與user表盡量保持一致。
第四步:添加jar包
請?zhí)砑右韵耲ar包并Build Path
log4j-1.2.17.jar
mybatis-3.4.1.jar
mysql-connector-java-5.1.7-bin.jar
第五步:log4j.properties
請在config文件夾中創(chuàng)建log4j.properties并編寫其配置,內(nèi)容如下:
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
第六步:mybatis-config.xml
在config文件夾中創(chuàng)建mybatis的核心配置文件mybatis-config.xml,其內(nèi)容如下:
<?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>
? <!-- 配置數(shù)據(jù)源 -->
? <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/mybatisDatabase"/>
? ? ? ? <property name="username" value="root"/>
? ? ? ? <property name="password" value="root"/>
? ? ? </dataSource>
? ? </environment>
? </environments>
</configuration>
該配置文件environments標(biāo)簽主要用于配置數(shù)據(jù)庫相關(guān)信息。至于,mybatis-config.xml文件中的其它常用配置,我們在后續(xù)的教程中會提到。
第七步:UserMapper.xml
在User的同級目錄中創(chuàng)建映射文件UserMapper.xml,其內(nèi)容如下:
<?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="cn.com.pojo.User">
? <select id="selectUserById" parameterType="int" resultType="cn.com.pojo.User">
? ? select id,username,password,gender from user where id = #{id}
? </select>
</mapper>
該mapper的核心功能為:從數(shù)據(jù)庫中查詢數(shù)據(jù)并將查詢結(jié)果封裝成JavaBean對象。
在該配置文件中:
namespace表示該mapper的命名空間,其取值為JavaBean的全類名或Mapper接口的全類名
select標(biāo)簽表示select語句。其中,id屬性用于為sql語句配置唯一標(biāo)識;parameterType屬性用于表示輸入?yún)?shù)的類型,一般來說可以省略該屬性,但是,如果參數(shù)是pojo建議不省略;resultType屬性用于指定執(zhí)行select查詢語句之后每行記錄對應(yīng)的JavaBean對象的全類名。
在mapper.xml中使用#{ }表示占位符,類似于JDBC中的占位符?
在完成UserMapper.xml的編寫后,再在mybatis-config.xml對其進(jìn)行配置,內(nèi)容如下:
<?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>
? <!-- 配置數(shù)據(jù)源 -->
? <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/mybatisDatabase"/>
? ? ? ? <property name="username" value="root"/>
? ? ? ? <property name="password" value="root"/>
? ? ? </dataSource>
? ? </environment>
? </environments>
? <!-- 配置mapper -->
? <mappers>
? ? <mapper resource="cn/com/pojo/UserMapper.xml"/>
? </mappers>
</configuration>
通過mappers標(biāo)簽配置各mapper。在mapper標(biāo)簽中使用resource屬性指定mapper的路徑,其形式為斜杠形式的全路徑。
第八步:測試
代碼如下:
package cn.com.test;
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 cn.com.pojo.User;
/**
*/
public class MybatisTest {
@Test
public void testMybatis() {
SqlSession sqlSession = null;
try {
// 讀取mybatis的核心配置文件mybatis-config.xml
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 創(chuàng)建SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 通過SqlSessionFactoryBuilder解析配置文件獲取sqlSessionFactory對象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
// 通過SqlSessionFactory對象創(chuàng)建SqlSession對象
sqlSession = sqlSessionFactory.openSession();
// 利用selectOne()執(zhí)行查詢
User user = sqlSession.selectOne("cn.com.pojo.User.selectUserById", 1);
System.out.println(user);
} catch (Exception e) {
} finally {
// 關(guān)閉SqlSession
if (sqlSession != null) {
sqlSession.close();
}
}
}
}
要點概述:
1、通過org.apache.ibatis.io.Resources讀取mybatis的核心配置文件mybatis-config.xml
2、通過SqlSessionFactoryBuilder對象生成sqlSessionFactory對象
3、通過SqlSessionFactory對象創(chuàng)建SqlSession對象。該對象的作用類似于JDBC中的Connection對象,所以在執(zhí)行完數(shù)據(jù)庫操作后需對其進(jìn)行關(guān)閉操作。
4、通過SqlSession的selectOne( )方法執(zhí)行返回結(jié)果只有一條記錄的sql查詢語句。該方法第一個參數(shù)將要執(zhí)行的sql語句,其格式為:命名空間.sql語句的id值;該方法第二參數(shù)為替換sql語句中占位符的參數(shù)值。
5、執(zhí)行完查詢操作后關(guān)閉SqlSession。
結(jié)果如下:
MyBatis入門示例總結(jié)
1、mybatis-config.xml是mybatis的核心配置文件
2、mapper.xml用于定義與數(shù)據(jù)庫相關(guān)的sql語句
3、SqlSession用于執(zhí)行數(shù)據(jù)庫操作
Eclipse中關(guān)聯(lián)MyBatis源碼
為在開發(fā)過程中便捷查看MyBatis源碼,我們需要在Eclipse對其進(jìn)行關(guān)聯(lián)。
第一步
下載源碼并存放至本地,圖示如下:
第二步
在Eclipse的項目中找到mybatis-3.4.1.jar,圖示如下:
第三步
選中mybatis-3.4.1.jar右鍵選擇Properties后再添加剛才下載好的源碼文件mybatis-3.4.1-src.zip,圖示如下:
最后,單擊 Apply and Close即可。