1. 程式人生 > >mybatis框架的總結(一)

mybatis框架的總結(一)


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中載入。

  1. 通過mybatis環境等配置資訊構造SqlSessionFactory即會話工廠
  2. 由會話工廠建立sqlSession即會話,操作資料庫需要通過sqlSession進行。
  3. mybatis底層自定義了Executor執行器介面操作資料庫,Executor介面有兩個實現,一個是基本執行器、一個是快取執行器。
  4. Mapped Statement也是mybatis一個底層封裝物件,它包裝了mybatis配置資訊及sql對映資訊等。mapper.xml檔案中一個sql對應一個Mapped Statement物件,sql的id即是Mapped statement的id。
  5. 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);
	}

}