mybatis框架的總結(一)
阿新 • • 發佈:2018-12-27
MyBatis 是一個開源的資料持久層框架。它內部封裝了通過JDBC訪問資料庫的操作,支援普通的SQL查詢、儲存過程和高階對映,幾乎消除了所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis 作為持久層框架,其主要思想是將程式中的大量SQL語句剝離出來,配置在配置檔案中,實現SQL的靈活配置。這樣做的好處是將SQL 與程式程式碼分離,可以在不修改程式程式碼的情況下,直接配置在檔案中修改SQL,Mybatis是javaweb開發中資料持久層使用的一個框架,它是一個不完全的ORM框架,這是它和Hibernate的區別之一
MyBatis 官網:http://mybatis.org
mybatis的架構圖
解讀上圖中的mybatis配置
SqlMapConfig.xml,此檔案作為mybatis的全域性配置檔案,配置了mybatis的執行環境等資訊。mapper.xml檔案即sql對映檔案,檔案中配置了操作資料庫的sql語句。此檔案需要在SqlMapConfig.xml中載入。
- 通過mybatis環境等配置資訊構造SqlSessionFactory即會話工廠
- 由會話工廠建立sqlSession即會話,操作資料庫需要通過sqlSession進行。
- mybatis底層自定義了Executor執行器介面操作資料庫,Executor介面有兩個實現,一個是基本執行器、一個是快取執行器。
- Mapped Statement也是mybatis一個底層封裝物件,它包裝了mybatis配置資訊及sql對映資訊等。mapper.xml檔案中一個sql對應一個Mapped Statement物件,sql的id即是Mapped statement的id。
- Mapped Statement對sql執行輸入引數進行定義,包括HashMap、基本型別、pojo,Executor通過Mapped Statement在執行sql前將輸入的java物件對映至sql中,輸入引數對映就是jdbc程式設計中對preparedStatement設定引數。Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本型別、pojo,Executor通過Mapped Statement在執行sql後將輸出結果對映至java物件中,輸出結果對映過程相當於jdbc程式設計中對結果的解析處理過程
mybatis的建立步驟:
第一步:建立java工程,加入mybatis核心包、依賴包、資料驅動包。
第二步:log4j.properties ,在classpath下建立log4j.properties如下:
# 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預設使用log4j作為輸出日誌資訊。
第三步:建立SqlMapConfig.xml,在classpath下建立SqlMapConfig.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">
</properties>
<!--設定延遲載入 <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading"
value="false"/> -->
<settings>
<!-- 開啟延遲載入的開關 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 將積極載入改為消極載入 即按需載入 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 開啟二級快取-->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 定義別名 -->
<typeAliases>
<!-- 定義單個別名 <typeAlias type="com.itheima.mybatis.po.User" alias="user"/> -->
<!--批量定義別名,名字預設為類名,首字母可以大寫或者小寫 -->
<package name="com.itheima.mybatis.po" />
</typeAliases>
<!-- 和spring整合後 environments配置將廢除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理 -->
<transactionManager type="JDBC" />
<!-- 資料庫連線池 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 載入對映檔案 -->
<mappers>
<!-- 單個載入對映檔案 <mapper resource="sqlmap/User.xml"/> <mapper resource="mapper/UserMapper.xml"/> -->
<!-- 載入 com.itheima.mybatis.mapper下的所有配置檔案 -->
<package name="com.itheima.mybatis.mapper" />
<!-- -->
</mappers>
</configuration>
第四步:建立實體類pojo
package com.itheima.mybatis.po;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
* 使用者po
*
* @author 45948
*
*/
public class User implements Serializable {
private int id;
private String username;// 使用者姓名
private String sex;// 性別
private Date birthday;// 生日
private String address;// 地址
//使用者建立的訂單列表
private List<Orders> ordersList;
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Orders> getOrdersList() {
return ordersList;
}
public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
+ address + "]";
}
}
第五步:建立mappe和mapper.xml
package cn.itcast.ssm.mapper;
import cn.itcast.ssm.po.User;
/**
* Mapper介面
*
* @author 45948
*
*/
public interface UserMapper {
//根據id查詢客戶
public User findUserById(int id) throws Exception;
}
<?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">
<!-- namespace名稱空間 就是指對sql進行分類化管理 ,在使用mapper開發時,namespace等於mapper介面地址 -->
<mapper namespace="cn.itcast.ssm.mapper.UserMapper">
<select id="findUserById" parameterType="int" resultType="User">
SELECT * FROM USER WHERE id=#{id}
</select>
</mapper>
第六步:建立測試類
package cn.itcast.ssm.mapper;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.itcast.ssm.po.User;
public class UserMapperTest {
private ApplicationContext applicationContext;
@Before
public void setUp() throws Exception {
applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
}
@Test
public void testFindUserById() throws Exception {
UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");
User user = userMapper.findUserById(1);
System.out.println(user);
}
}