MyBatis
前身是 apache 基金會下的一個開源項目 iBatis
- 支持自定義 SQL 、存儲過程和高級映射的持久化框架
- 使用 XML 或者注解配置
- 能夠映射基本數(shù)據(jù)元素毅人、接口、Java對象到數(shù)據(jù)庫
MyBatis是一款支持普通SQL查詢缔俄、存儲過程和高級映射的持久層框架蟹略。MyBatis消除了幾乎所有的JDBC代碼挖炬、參數(shù)的設(shè)置和結(jié)果集的檢索。MyBatis可以使用簡單的XML或注解用于參數(shù)配置和原始映射草姻,將接口和Java POJO(普通Java對象)映射成數(shù)據(jù)庫中的記錄。
- 映射方式
- 數(shù)據(jù)庫的每一行映射為每一個對象
- 每一列映射為對象的每一個屬性
工作流程機制
- 根據(jù) XML 或者注解加載 SQL 語句、參數(shù)映射、結(jié)果映射到內(nèi)存
- 應(yīng)用程序調(diào)用 API 傳入?yún)?shù)和 SQL ID.
- MyBatis 自動生成 SQL 語句完成數(shù)據(jù)庫訪問项炼,轉(zhuǎn)換執(zhí)行結(jié)果返回應(yīng)用程序
以查詢操作來對整個過程進行描述
配置
jar 加載
- mybatis-3.2.3
- mysql-connector-java
SQLSessionFactory
每個 MyBatis 應(yīng)用都基于 SqlSessionFactory 實例為中心面褐。通過該實例湃窍,MyBatis 可以獲取對對象的操作轉(zhuǎn)換為對數(shù)據(jù)庫數(shù)據(jù)進行操作的 sql 的 session。
SqlSessionFactory 的全局配置?文件茵休,?文件名為conf.XML俐芯。
該?文件需要放在根目錄下,即src/main/java目錄下
該文件包含了對 MyBatis 的核心配置亏拉。
- transactionManage
- 對后端連接數(shù)據(jù)庫實例的數(shù)據(jù)源莽使,決定數(shù)據(jù)范圍和數(shù)據(jù)管理方式的事務(wù)管理器
- dataSource
- 后端數(shù)據(jù)庫源:driver、url亿笤、username、password
conf.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>
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"/>
<!-- 配置數(shù)據(jù)庫連接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=true"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
</configuration>
Java 對象構(gòu)建(Bean類)
構(gòu)造對象
public class User {
private int id;
private String name;
private String password;
private int sex;
private int account;
public User(int id, String name, String password, int sex, int account) {
this.id = id;
this.name = name;
this.password = password;
this.sex = sex;
this.account = account;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPasswors() {
return password;
}
public int getSex() {
return sex;
}
public int getAccount() {
return account;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPasswors(String password) {
this.password = password;
}
public void setSex(int sex) {
this.sex = sex;
}
public void setAccount(int account) {
this.account = account;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", sex=" + sex +
", account=" + account +
'}';
}
}
構(gòu)建接口
public interface GetUserInfo {
public User getUser(int id);
public void addUser(User user);
public void updateUser(User user);
public void deleteUser(User user);
}
構(gòu)建 Java 對象和 SQL 語句映射關(guān)系配置文件
在 src 目錄下新建 userMapper.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="GetUserInfo">
<select id="getUser" parameterType="int" resultType="User">
select id,name,password,sex,account from user where id = #{id}
</select>
</mapper>
在 conf.xml 文件中注冊 mapper
SqlSessionFactory中添加mapper映射猛蔽。
...
</environments>
<mappers>
<mapper resource="userMapper.xml" />
</mappers>
</configuration>
數(shù)據(jù)查詢操作
工作流程
- 加載配置文件
- 應(yīng)用配置文件
- 關(guān)聯(lián)映射文件
- sqlSession
- 生成 SQLSessionFactory
- 獲取 SQLSession
- 執(zhí)行查詢
- Session 執(zhí)行SQL
測試程序
public class HelloMyBatis {
public static void main(String[] args) {
// 1.聲明配置文件的目錄讀值
String resource = "conf.xml";
// 2. 加載應(yīng)?用配置?文件
InputStream is = HelloMyBatis.class.getClassLoader()
.getResourceAsStream(resource);
// 3. 創(chuàng)建SqlSessonFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
// 4. 獲取Session
SqlSession session = sessionFactory.openSession();
try {
// 5. 獲取操作類
GetUserInfo getUserInfo = session.getMapper(GetUserInfo.class);
// 6. 完成查詢操作
User user = getUserInfo.getUser(2);
System.out.println(user.getId() + " " + user.getName() + " " + user.getAccount());
} finally {
// 7.關(guān)閉Session
session.close();
}
}
}
映射通過注解的方式聲明
不需要添加 接口類的 Mapper.xml 文件,也不用在 SQLSessionFactory 中聲明 mapper.xml 后众。
1. 在接口類的方法上添加 sql 注解
import org.apache.ibatis.annotations.Select;
public interface GetUserInfoAnnotation {
@Select("select id,name,password,sex,account from user where id = #{id}")
public User getUser(int id);
public void addUser(User user);
public void updateUser(User user);
public void deleteUser(User user);
}
2. 在主程序中添加映射關(guān)系到接口對象
3. 創(chuàng)建SqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
// 3.1 添加映射關(guān)系到類對象 注解方式
Configuration conf = sessionFactory.getConfiguration();
conf.addMapper(GetUserInfoAnnotation.class);
其他步驟與文件映射方法一致右锨。
其他 SQL 操作(增刪改)
文件映射方式
在 Mapper 文件中添加 sql 的文件。
<?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="GetUserInfo">
<select id="getUser" parameterType="int" resultType="User">
select id,name,password,sex,account from user where id = #{id}
</select>
<insert id="addUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
insert into user (name,password,sex,account) values(#{name},#{password},#{sex},#{account})
</insert>
<update id="updateUser" parameterType="User">
update user set account = #{account} where id = #{id}
</update>
<delete id="deleteUser" parameterType="User">
delete from user where id = #{id}
</delete>
</mapper>
運行 MyBatis
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class moreMybatis {
public static void main(String[] args) {
// 1. 聲明配置?文件
String resource = "conf.xml";
// 2. 加載應(yīng)?用配置?文件
InputStream is = moreMybatis.class.getClassLoader().getResourceAsStream(resource);
// 3. 創(chuàng)建SqlSessonFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
// 關(guān)閉sql事務(wù)模式
SqlSession session = sessionFactory.openSession(true);
try{
// 5. 獲取操作類
GetUserInfo getUserInfo = session.getMapper(GetUserInfo.class);
// 插?入?用戶
User user = new User(7,"xiaoBai","123456",0,10000);
getUserInfo.addUser(user);
System.out.println(user.getId());
// 查詢?用戶
user = getUserInfo.getUser(user.getId());
System.out.println(user);
// 更新用戶賬戶信息
user.setAccount(800);
getUserInfo.updateUserAccount(user);
// 刪除?用戶
getUserInfo.deleteUser(user.getId());
}finally {
session.close();
}
}
}
MyBatis 的優(yōu)劣
- 優(yōu)勢:
- 入門門檻較低
- 更加靈活,SQL 優(yōu)化
- 劣勢
- 需要自己編寫 SQL ,工作量大
- 數(shù)據(jù)庫移植性差