牛皮了!頭一次看到有大佬把MyBatis框架講的這麼明白,快來看看吧

框架概述:

MyBatis 是一個優秀的基於 java 的持久層框架,它內部封裝了 jdbc,使開發者只須要關注 sql 語句自己,而不須要花費精力去處理加載驅動、建立鏈接、建立 statement 等繁雜的過程。MyBatis 經過 xml 或註解的方式將要執行的各類 statement 配置起來,並經過 java 對象和 statement 中 sql 的動態參數進行映射生成最終執行的 sql 語句,最後由 mybatis 框架執行 sql 並將結果映射爲 java 對象並 返回。採用 ORM 思想解決了實體和數據庫映射的問題,對 jdbc 進行了封裝,屏蔽了 jdbc api 底層訪問細節,使咱們不用與 jdbc api 打交道,就能夠完成對數據庫的持久化操做。java

傳統的 JDBC 操做:

固然,只是前面這段話,還沒法看出優點所在以及掌握 MyBatis 框架的必要性。先回顧一下 jdbc 的建立過程,代碼以下:mysql

public static void main(String[] args) {

	Connection connection = null;
	PreparedStatement preparedStatement = null;
	ResultSet resultSet = null;
	
	try {
		//加載數據庫驅動
		Class.forName("com.mysql.jdbc.Driver");
		//經過驅動管理類獲取數據庫連接
		connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","ro ot", "root");
		//定義 sql 語句 ?表示佔位符
		String sql = "select * from user where username = ?";
		//獲取預處理 statement
		preparedStatement = connection.prepareStatement(sql);
		//設置參數,第一個參數爲 sql 語句中參數的序號(從 1 開始),第二個參數爲設置的參數值
		preparedStatement.setString(1, "王五");
		//向數據庫發出 sql 執行查詢,查詢出結果集
		resultSet = preparedStatement.executeQuery();
		//遍歷查詢結果集
		while(resultSet.next()){
		 System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
		}
	} catch (Exception e) {
		e.printStackTrace();
	}finally{
		//釋放資源
		if(resultSet!=null){
			try {
				resultSet.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} 
		}
		if(preparedStatement!=null){
			try {
				preparedStatement.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} 
		}
		if(connection!=null){
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
		} 
	} 
}
複製代碼

問題分析:

由上面案例能夠發現,傳統的 JDBC 存在的缺點:sql

數據庫連接建立、釋放頻繁形成系統資源浪費從而影響系統性能,若是使用數據庫連接池可解決此問題。 Sql 語句在代碼中硬編碼,形成代碼不易維護,實際應用 sql 變化的可能較大,sql 變更須要改變 java 代碼。 使用 preparedStatement 向佔有位符號傳參數存在硬編碼,由於 sql 語句的 where 條件不必定,可能多也可能少,修改 sql 還要修改代碼,系統不易維護。 對結果集解析存在硬編碼(查詢列名),sql 變化致使解析代碼變化,系統不易維護,若是能將數據庫記錄封裝成 pojo 對象解析比較方便。數據庫

項目搭建:

建立 maven 工程:

參數選擇: Groupid : 公司肯定 ArtifactId : 項目名稱 Packing : jarapi

添加座標:

在 pom.xml 文件中添加各類座標:bash

<dependencies>
	 <dependency>
		 <groupId>org.mybatis</groupId>
		 <artifactId>mybatis</artifactId>
		 <version>3.4.5</version>
	 </dependency>
	 <dependency>
		 <groupId>junit</groupId>
		 <artifactId>junit</artifactId>
		 <version>4.10</version>
		 <scope>test</scope>
	 </dependency>
	 <dependency>
		 <groupId>mysql</groupId>
		 <artifactId>mysql-connector-java</artifactId>
		 <version>5.1.6</version>
		 <scope>runtime</scope>
	 </dependency>
	 <dependency>
		 <groupId>log4j</groupId>
		 <artifactId>log4j</artifactId>
		 <version>1.2.12</version>
	 </dependency>
 </dependencies>
複製代碼

編寫 pojo 類:

public class User implements Serializable {

	private Integer id;
	private String username;
	private Date birthday;
	private String sex;
	private String address;
	
	public Integer getId() {
		return id; 
	}
	
	public void setId(Integer id) {
		this.id = id; 
	}
	
	public String getUsername() {
		return username; 
	}
	
	public void setUsername(String username) {
		this.username = username; 
	}
	
	public Date getBirthday() {
		return birthday; 
	}
	
	public void setBirthday(Date birthday) {
		this.birthday = birthday; 
	}
	
	public String getSex() {
		return sex; 
	}
	
	public void setSex(String sex) {
		this.sex = sex; 
	}
	
	public String getAddress() {
		return address; 
	}
	
	public void setAddress(String address) {
		this.address = address; 
	}
	
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address=" + address + "]"; 
	} 
}
複製代碼

編寫持久層接口:

public interface IUserDao {
	/**
	* 查詢全部用戶
	* @return
	*/
	List<User> findAll();
}
複製代碼

編寫持久層接口的映射文件:

<?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="com.itheima.dao.IUserDao">
	<!-- 配置查詢全部操做 --> 
	<select id="findAll" resultType="com.itheima.domain.User">
	select * from user
	</select>
</mapper>
複製代碼

其中有兩個注意點:session

映射文件要與接口在相同的包中,若是是使用 IDEA 進行開發的話,接口在 java 文件下,映射文件在 resource 文件夾下,其餘包名要相同。 映射文件的名稱要以接口的名稱命名,加上後綴是xml。mybatis

編寫 mybatis-config.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>
	<!-- 配置 mybatis 的環境 --> 
	<environments default="mysql">
		<!-- 配置 mysql 的環境 --> 
		<environment id="mysql">
			<!-- 配置事務的類型 --> 
			<transactionManager type="JDBC"></transactionManager>
			<!-- 配置鏈接數據庫的信息:用的是數據源(鏈接池) --> 
			<dataSource type="POOLED"> 
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/ee50"/>
				<property name="username" value="root"/>
				<property name="password" value="1234"/>
			</dataSource>
		</environment>
	</environments>
	<!-- 告知 mybatis 映射配置的位置 --> 
	<mappers> 
		<mapper resource="com/itheima/dao/IUserDao.xml"/>
	</mappers>
</configuration>
複製代碼

編寫測試類:

public class MybatisTest {
	public static void main(String[] args)throws Exception {
		//1.讀取配置文件
		InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
		//2.建立 SqlSessionFactory 的構建者對象
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		//3.使用構建者建立工廠對象 SqlSessionFactory
		SqlSessionFactory factory = builder.build(in);
		//4.使用 SqlSessionFactory 生產 SqlSession 對象
		SqlSession session = factory.openSession();
		//5.使用 SqlSession 建立 dao 接口的代理對象
		IUserDao userDao = session.getMapper(IUserDao.class);
		//6.使用代理對象執行查詢全部方法
		List<User> users = userDao.findAll();
		for(User user : users) {
		System.out.println(user);
		}
		//7.釋放資源
		session.close();
		in.close();
	} 
}
複製代碼

基於註解的 MyBatis 項目:

對前面的部份內容進行修改:app

在持久層接口中添加註解框架

public interface IUserDao {
	/**
	* 查詢全部用戶
	* @return
	*/
	@Select("select * from user")
	List<User> findAll();
}
複製代碼

修改 mybatis-config.xml 文件:

標籤中,recource 改成 class,映射文件的路徑沒有改變。

<!-- 告知 mybatis 映射配置的位置 --> 
<mappers> 
	<mapper class="com.itheima.dao.IUserDao"/>
</mappers>
複製代碼

注意事項:

使用註解的時候,不須要配置 xml 文件,否則會被 xml 覆蓋,在 MyBatis 中,xml 的優先級高於註解。

3.3 分析 MyBatis 框架的流程:

最後

感謝你看到這裏,看完有什麼的不懂的能夠在評論區問我,以爲文章對你有幫助的話記得給我點個贊,天天都會分享java相關技術文章或行業資訊,歡迎你們關注和轉發文章!

相關文章
相關標籤/搜索