Mybatis-結構介紹+初級入門程序

        主要是介紹mybatis的相關初級知識,配置文件講解,初級增刪改查的入門程序。

一、簡介

    MyBatis是一個優秀的持久層框架,它對jdbc的操作數據庫的過程進行封裝,使開發者只需要關注SQL本身,而不需要花費精力去處理例如註冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼

Mybatis通過xml或註解的方式將要執行的各種statementstatementpreparedStatementCallableStatement)配置起來,並通過java對象和statement中的sql進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射成java對象並返回。

                   


    
  1. mybatis配置

SqlMapConfig.xml,此文件作爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。

mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。

  1. 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠

  2. 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。

  3. mybatis底層自定義了Executor執行器接口操作數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。

  4. MappedStatement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個MappedStatement對象,sqlid即是Mappedstatementid

  5. MappedStatementsql執行輸入參數進行定義,包括HashMap、基本類型、pojoExecutor通過MappedStatement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。

  6. MappedStatementsql執行輸出結果進行定義,包括HashMap、基本類型、pojoExecutor通過MappedStatement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。

二、入門程序

    1、配置文件

    需要的相關jar

asm-3.3.1.jar

cglib-2.2.2.jar

commons-logging-1.1.1.jar

javassist-3.17.1-GA.jar

junit-4.9.jar

log4j-1.2.17.jar

log4j-api-2.0-rc1.jar

log4j-core-2.0-rc1.jar

mybatis-3.2.7.jar

mysql-connector-java-5.1.38.jar

slf4j-api-1.7.5.jar

slf4j-log4j12-1.7.5.jar

 

        配置文件

SqlMapConfig.xml文件的內容說明


<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEconfiguration

PUBLIC"-//mybatis.org//DTDConfig 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!--和spring整合後environments配置將廢除-->

<environmentsdefault="development">

<environmentid="development">

<!--使用jdbc事務管理-->

<transactionManagertype="JDBC"/>

<!--數據庫連接池-->

<dataSourcetype="POOLED">

<propertyname="driver"value="com.mysql.jdbc.Driver"/>

<propertyname="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>

<propertyname="username"value="root"/>

<propertyname="password"value="123456"/>

</dataSource>

</environment>

</environments>

<mappers>

<--加載映射文件-->

<mapperresource="User.xml"/>

</mappers>

</configuration>

    2、映射文件

<?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="test">
<!-- 
	id:sql語句的唯一標識符
	parameterType:指定傳入的參數的類型
	resultType:指定返回的參數的類型
	#{}:如果是基本數據類型(Integer、String、double...),那麼#{}花括號中的變量可隨意填寫,如果是pojo那麼必須保證
	和pojo的變量名一致
 -->
	<select id="findById" parameterType="int" resultType="org.lier.zz.User">
		select *  from user where id = #{id}
	</select>
</mapper>

    3、入門程序

      查詢

單個
	<select id="findById" parameterType="int" resultType="org.lier.zz.User">
		select *  from user where id = #{id}
	</select>
返回多個結果
			程序中使用selectList返回一個集合,所以映射文件中返回的類型應該是一個集合的泛型的類型——List<User>的User類型
	<select id="findByName" parameterType="string" resultType="org.lier.zz.User">
		select *  from user where username  like '%${value}%'
	</select>
		@Test
	public void  selectUserTest() throws IOException {
		String resource = "SqlMapConfig.xml";
//		通過輸入流加載配置文件創建回話工廠,獲取session
		InputStream is = Resources.getResourceAsStream(resource);
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession  session = factory.openSession();
//		兩個參數:第一個:namespace+sql_id,第二個是參數s
		User user =session.selectOne("test.findById", 1);
						//selectList
		System.out.println(user.toString());
		session.commit();
		session.close();
	}
  問題:

        %${value}%,%是字符串原樣拼接符,如果傳入的基本類型floatdoubleint等包括String,那麼${}花括號中的東西必須的是value


    插入

    

<!-- 如果#{}中傳入的是pojo,那麼#{}中的名字必須和pojo的屬性名一致 -->
	<insert id="insertUser" parameterType="org.lier.zz.User">
		<!-- 
			1、keyProperty:關鍵屬性,一般是主鍵
			2、order:BEFOR、AFTER 表示這個查詢實在sql之前還是之後進行操作
			3、		
		 -->
		<selectKey keyProperty="id" order="AFTER" resultType="int">
			select last_insert_id()/ select UUID()
		</selectKey>
		insert into user(username,sex,birthday,address) values(#{username},#{sex},#{birthday},#{address})
	</insert>
    

遇見的問題:

        1、連接問題,不管是查詢還是插入總是會提示連接所悟,提示要使用SSL連接,這個問題很怪因爲之前我並沒有使用SSL連接也能正常使用,mysql5.7的,網上說是要SSL連接的,解決辦法是修改連接的URL連接中補上useSSL=true/false.但是如果將這個拼接到最後面,會提示UnSupportcharacter encoding 'utf-8;useSSL=false,真是奇怪的問題。最終是這樣的

jdbc:mysql://localhost:3306/mybatis?usessl=true;characterEncoding=utf-8

        2sql書寫問題如果在sql#{}不寫入相關的東西也是回報錯,這個是個人的粗心引起的。

        3、主鍵selectlast_insert_id()返回的是自增加的主鍵,如果要返回id則需要ORDER=”AFTER”selectUUID()返回的是32的字符串,所以一定要保證表中的字段一致才行。

    修改

<update id="updateUser" parameterType="org.lier.zz.User" >
		update user set username = #{username},sex = #{sex} ,birthday = #{birthday},address = #{address} where id = #{id};
	</update>
	相對簡單沒什麼好說的……

    刪除

<delete id="delUserById" parameterType="int">
		delete from user where id =#{id}
	</delete>
	沒什麼好說的

    4、原生dao整合Mybatis開發

Dao層:
	public interface UserDao {
	
	public List<User> selectUsersByName(String username);
}

	IMPL層:
	private SqlSessionFactory factory = null;
	
	public UserDaoImpl(SqlSessionFactory factory) {
		this.factory = factory;
	}
	
	@Override
	public List<User> selectUsersByName(String username) {
//		session線程不安全,放入放入方法體中,隨用隨毀
		SqlSession session = factory.openSession();
		List<User> users =session.selectList("test.findByName", "王五");
		session.commit();
		session.close();
		return users;
	}
	
	這個方法也是進行簡單的封裝,還是有大量的重複是代碼產生。需要自行寫實現類,不夠簡潔。

    5、動態代理方式(Mapper代理)

    1、創建MapperDao文件

public interface UserDaoMapper {
	public List<User> findByName(String username);
}
<!-- 
	mapper文件的編寫規則:mapperdao和mapper.xml除了擴展名之外別的都要相同。
		1、namespace等於dao接口的全路徑
		2、sql中的id等於dao接口的方法名
		3、paramterType等於方法的參數類型
		4、resultType要與方法的返回類型一織
 -->
<mapper namespace="org.lier.usermapper.UserDaoMapper">
	<select id="findByName" parameterType="string" resultType="org.lier.zz.User">
		select *  from user where username  like '%${value}%'
	</select>
</mapper>
	
在SqlMapConfig.xml中引入mapper文件

	<mappers>
		<mapper resource="User.xml"/>
		<mapper class="org.lier.usermapper.UserDaoMapper"/>
	</mappers>
測試:
	@Test
	public void mapperDaoTest() {
		SqlSession session = factory.openSession();
		UserDaoMapper mapper = session.getMapper(UserDaoMapper.class);
		List<User> users = mapper.findByName("王五");
		System.out.println(users);
	}

    6、SqlMapConfig.xml內容

    properties(屬性)

    settings(全局配置參數)

    typeAliases(類型別名)

    typeHandlers(類型處理器)

    objectFactory(對象工廠)

    plugins(插件)

    environments(環境集合屬性對象)

    environment(環境子屬性對象)

    transactionManager(事務管理)

    dataSource(數據源)

     mappers(映射器)

        

    qlMapConfig.xml可以引用java屬性文件中的配置信息如下:

在classpath下定義db.properties文件,
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

    SqlMapConfig.xml引用如下:

<properties resource="db.properties"/>
	<environments default="development">
		<environment id="development">
			<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>
    

注意: MyBatis將按照下面的順序來加載屬性:

  • properties元素體內定義的屬性首先被讀取。

  • 然後會讀取properties元素中resourceurl加載的屬性,它會覆蓋已讀取的同名屬性。

    7、別名

    

常用數據類型別名


別名

映射的類型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

map

Map

    在SqlMapConfig.xml中配置別名

<typeAliases>
	<!-- 單個別名定義 -->
	<typeAlias alias="user" type="cn.itcast.mybatis.po.User"/>
	<!-- 批量別名定義,掃描整個包下的類,別名爲類名(首字母大寫或小寫都可以) -->
	<package name="cn.itcast.mybatis.po"/>
	<package name="其它包"/>
</typeAliases> 

8、映射器

      1. <mapperresource=" " />

        使用相對於類路徑的資源

        如:<mapperresource="sqlmap/User.xml" />

   2、<mapperclass=" " />

        使用mapper接口類路徑

      如:<mapperclass="cn.lier.mybatis.mapper.UserMapper"/>

      注意:此種方法要求mapper接口名稱和mapper映射文件名稱相同,且放在同一個目錄中。

        3、<packagename=""/>

    

        註冊指定包下的所有mapper接口

        如:<packagename="cn.lier.mybatis.mapper"/>

        注意:此種方法要求mapper接口名稱和mapper映射文件名稱相同,且放在同一個目錄中。



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