MyBatis-01 初始+環境搭建

MyBatis簡述

概念

MyBatis是一款優秀的半自動化ORM框架(DAO層框架),前身是IBatis,支持動態sql、存儲過程及高級映射。半自動化是指:MyBatis在查詢關聯對象或關聯集合對象時,主要手動編寫sql來完成,所以稱之爲半自動化。ORM:通過業務實體對象和關係數據庫中的字段做映射,將java程序中的對象自動持久化到數據庫中,是一種數據持久化方案。

作用

主要通過封裝JDBC的方法實現簡化數據庫與java之間的連接,幾乎避免了所有JDBC代碼和手動設置參數以及獲取結果集,相比JDBC減少了50%的代碼量。

優點

代碼量減少;最簡單的持久化框架,小巧並簡單易學;sql代碼徹底從程序中分離,可重用;提供xml標籤,支持編寫動態sql;提供映射標籤,支持對象與數據庫的ORM字段映射。

缺點

sql語句編寫工作量大,對開發人員有一定要求;數據庫移植性差,因爲不同的數據庫編寫的sql語句有差異,更換不同的數據庫時sql語句也要做相應更改。

MyBatis框架環境搭建步驟

1、導入MyBatis所需的包

  • mysql-connector-java-5.1.0-bin.jar
  • mybatis-3.2.2.jar
  • log4j-1.2.17.jar (非必須)

2、編寫數據庫連接配置文件database.properties

    driver=com.mysql.jdbc.Driver
   	url=jdbc:mysql://localhost:3306/smbms
    username=root
    password=1998

3、編寫MyBatis系統核心配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration 
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
"mybatis-3-config.dtd" >
<configuration>
	<properties resource="database.properties"/>
	<settings>
		<setting name="logImpl" value="LOG4J"/>
	</settings>
	<typeAliases>	
		<package name="cn.smbms.pojo"/>
	</typeAliases>

	<!--通過default屬性指定一個默認運行環境ID  -->
	<environments default="development">
		<environment id="development">
		<!-- 事務管理器兩種 JDBC/MANAGED-->
			<transactionManager type="JDBC"/>
			<!-- 數據源類型三種UNPOOLED | POOLED | JNDI -->
			<!--  POOLED 使用的是連接池的原理-->
			<dataSource type="POOLED">
				<property name="driver" value="${driver}"/>
				<property name="url" value="${url}"/>
				<property name="username" value="${username}"/>
				<property name="password" value="${password}"/>
			</dataSource>
		</environment>
	</environments>
	
	<!-- 將mapper文件加入到配置文件中 -->
	<mappers>
		<!--  第一種方式:使用類資源路徑獲取資源-->
		<mapper resource="cn/smbms/dao/user/UserMapper.xml"></mapper> 
		<mapper resource="cn/smbms/dao/provider/ProviderMapper.xml"></mapper> 
		<!-- 第二種方式:使用url獲取資源 -->
		<!-- <mapper url="file:///D:/UserMapper.xml"></mapper> -->
	</mappers> 
</configuration>

4、創建獲取SqlSession工具類MyBatisUtil.java

package cn.smbms.utils;

import java.io.IOException;
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;

public class MyBatisUtil {
	
	private static SqlSessionFactory factory;
	
	static{
		try {
			//1.獲取mybatis-config.xml輸入流
			InputStream  is = Resources.getResourceAsStream("mybatis-config.xml");
			//2.創建sqlSessionFactory對象 ,完成對配置文件的讀取
			factory=new SqlSessionFactoryBuilder().build(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 創建sqlSession對象
	 * @return
	 */
	public static SqlSession createSqlSession(){
		
		return factory.openSession(false);
	}
	
	
	/**
	 * 關閉sqlSession
	 * @param sqlSession
	 */
	public static void closeSqlSession(SqlSession sqlSession){
		if(null!=sqlSession){
			sqlSession.close();
		}
	}
	
}

5、創建POJO實體類 User.java

package cn.smbms.pojo;

import java.util.Date;

/**
 * 用戶實體類
 * @author 14062
 *
 */
public class User {
	
	private int id;	//主鍵id
	private String userCode;	//用戶編碼
	private String userName;	//用戶姓名	
	private String userPassword;	//用戶密碼
	private int gender;	//性別
	private Date birthday;	//出生日期
	private String phone;	//手機號碼
	private String address;	//地址
	private int userRole;	//用戶角色
	private int createdBy;	//創建者
	private Date createdDate;	//創建時間
	private int modifyBy;	//修改者
	private Date modifyDate;	//修改時間
	//省略get/set方法
}

6、創建sql映射文件 UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd">
 <mapper namespace="cn.smbms.dao.user.UserMapper">
	<select id="count" resultType="int">
		select count(1) as count from smbms_user
	</select>
	<!--查詢用戶列表  -->
	<select id="getUserList" resultType="user">
		select * from smbms_user
	</select> 	
</mapper>

7、創建mapper映射接口 UserMapper.java

package cn.smbms.dao.user;
import java.util.List;
import cn.smbms.pojo.User;

public interface UserMapper {
	//獲取所有用戶
	public List<User> getUserList();
	
	//獲取用戶記錄數
	public int count();
}

8、編寫測試類 Test.java

package cn.smbms.dao.user;

import java.io.*;
import java.util.*;
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.apache.log4j.Logger;
import org.junit.Test;
import cn.smbms.pojo.User;
import cn.smbms.utils.MyBatisUtil;

public class UserMapperTest {
	private Logger logger=Logger.getLogger(UserMapperTest.class);
	
	/**
	 * 查詢用戶記錄數
	 */
	@Test
	public void test() {
		int count=0;
		SqlSession sqlSession=null;
		
		try {
			//3.創建sqlSession
			sqlSession=MyBatisUtil.createSqlSession();
			//4.調用mapper文件對數據進行操作,必須將mapper文件一如mybatis-config.xml
			count=sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
			logger.debug("UserMapperTest count--->"+count);	
		} catch (Exception e) {
			e.printStackTrace();
		}finally
		{
			MyBatisUtil.closeSqlSession(sqlSession);
		}	
	}
	
	/**
	 * 查詢用戶列表
	 */
	@Test
	public void testGetUserList() {
		SqlSession sqlSession=null;
		List<User> ulist=null;
		try {
			//3.創建sqlSession
			sqlSession=MyBatisUtil.createSqlSession();
			//4.調用mapper文件對數據進行操作,必須將mapper文件一如mybatis-config.xml
			//第一種方式:使用selectList()
			/*ulist=sqlSession.selectList("cn.smbms.dao.user.UserMapper.getUserList");*/
			
			//第二種方式 使用getMapper()接口映射  接口中的方法名要與sql映射文件UserMapper中的mapper ID一一對象
			//該接口稱爲:接口映射器
			ulist=sqlSession.getMapper(UserMapper.class).getUserList();
		} catch (Exception e) {
			e.printStackTrace();
		}finally
		{
			MyBatisUtil.closeSqlSession(sqlSession);
		}
		for (User user : ulist) {
			logger.debug("userName:"+user.getUserName());
		}
	}
}

9、運行結果
在這裏插入圖片描述

什麼是數據持久化

狹義的理解:“持久化”僅僅指把域對象永久保存到數據庫中;廣義的理解,“持久化”包括和數據庫相關的各種操作。● 保存:把域對象永久保存到數據庫。● 更新:更新數據庫中域對象的狀態。● 刪除:從數據庫中刪除一個域對象。● 加載:根據特定的OID,把一個域對象從數據庫加載到內存。● 查詢:根據特定的查詢條件,把符合查詢條件的一個或多個域對象從數據庫加載內在存中。2.爲什麼要持久化?持久化技術封裝了數據訪問細節,爲大部分業務邏輯提供面向對象的API。● 通過持久化技術可以減少訪問數據庫數據次數,增加應用程序執行速度;● 代碼重用性高,能夠完成大部分數據庫操作;● 鬆散耦合,使持久化不依賴於底層數據庫和上層業務邏輯實現,更換數據庫時只需修改配置文件而不用修改代碼。(OID[object identifier ]:對象標識,爲了區分對象爲每個對象分配的唯一一個編碼)(域對象:可以在不同的Servlet之間傳遞數據的對象) (該文非原創 侵刪)

ORM(Objetct Relationl Mapping)對象關係映射

ORM是一種爲了解決面向對象 與關係數據庫 存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述對象 和數據庫之間映射的元數據 ,將java程序 中的對象自動持久化到關係數據庫中。本質上就是將數據從一種形式轉換到另外一種形式。詳細瞭解見鏈接(ORM原理) ORM原理 理解ORM和數據持久化

MyBatis的核心接口和類及生命週期

SqlSessionFactoryBuilder(構造器)

作用:根據配置信息或代碼來生成SqlSessionFactory

實現原理:負責構建SqlSessionFactory,該類提供了多個build()方法重載,而真正重載build()方法只有三種,分別是InputStream(字節流)、Reader(字符流)、Configuration(類),字節流和字符流都是通過xml配置文件的形式創建SqlSessionFactory,而Configuration採用的是java代碼方式創建,常用的是讀取配置文件的形式

生命週期:用過即丟,其生命週期只存在於方法體內

SqlSessionFactory(工廠接口)

作用:是每個MyBatis應用的核心,可創建多個SqlSession實例,代碼如下

SqlSession sqlSession=sqlSessionFactory.openSession(boolean autoCommit);
注:autoCommit參數表示是否開啓事務控制,默認爲true表示關閉事務控制開啓自動提交

作用域:Application全局作用域

生命週期:與應用的生命週期相同

特點:單例(設計模式):存在於整個應用運行時,並且只存在一個對象實例

SqlSession(sql會話)

作用:(1)獲取映射器,讓映射器通過命名空間和方法名稱找到對應的sql,發送給數據庫執行後返回結果; (2)通過update、insert、select、delete等方法,帶上SQL的id來操作在XML中配置好的SQL,從而完成工作,與此同時它也支持事務,通過commit、rollback方法提交或者回滾務。

特點:一個SqlSession對應一次數據庫會話,會話結束必須關閉
可以執行多次sql語句,但是一旦關閉就需要重新創建SqlSession線程級,不可共享會話(非線程安全)

作用域:相當request(一次請求)或方法體內的作用域

{}與${}的區別

1、 #{}表示一個佔位符,可以實現preparedStatement向佔位符中設置值,可以有效防止sql注入,#{}可以接受基本數據類型值或pojo屬性值,如果parametreType傳輸的是基本數據類型值,那麼{}中可以放value或其他名稱
2、 ${}表示拼接sql串,通過${}可以將parameterType傳入的內容不進行jdbc類型轉換,可以接受基本數據類型值或pojo屬性值,如果parametreType傳輸的是基本數據類型值,那麼{}中只能放alue,其他情況必須與pojo屬性名相同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章