1. 簡介
1.1 為什么使用Mybatis
java服務(wù)器需要與數(shù)據(jù)庫操作,java傳統(tǒng)的數(shù)據(jù)庫操作通過JDBC實(shí)現(xiàn)。JDBC提供了java與數(shù)據(jù)庫連接及操作的接口,但與數(shù)據(jù)庫交互時(shí)需要==編寫JDBC文件==,同時(shí)SQL語句也會出現(xiàn)在java中,導(dǎo)致==java與SQL的耦合==,為了解決這兩個(gè)問題,引入了Mybatis解決java JDBC實(shí)現(xiàn)數(shù)據(jù)庫操作帶來的問題。
1.2 什么是Mybatis
MyBatis 是一款優(yōu)秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。
- <font color="red">持久層框架</font>;
- 支持自定義SQL、存儲過程和高級映射;
- 免除JDBC代碼,設(shè)置參數(shù)及獲取結(jié)果集的工作;
- <font color="red">XML</font>或<font color="red">注解</font>進(jìn)行配置;
1.3 持久層
易失性存儲:指存儲在內(nèi)存中,數(shù)據(jù)隨著系統(tǒng)掉電會丟失,為非持久化數(shù)據(jù)。
持久化:對應(yīng)于“易失性存儲”,將易失性存儲的數(shù)據(jù)轉(zhuǎn)變?yōu)槌志脿顟B(tài)。
為什么持久化:有些數(shù)據(jù)需要長久保存,不能斷電即失。
持久化的方式:數(shù)據(jù)庫;IO文件;...
持久層:處理持久化過程的代碼塊,實(shí)現(xiàn)持久化數(shù)據(jù)與內(nèi)存數(shù)據(jù)的相互轉(zhuǎn)化。
1.4 Mybatis的特點(diǎn)
Mybatis的作用:==幫助程序操作數(shù)據(jù)庫。==
Mybatis的特點(diǎn):
- sql與代碼的分離,提高可維護(hù)性;
- 提供映射標(biāo)簽,支持對象與數(shù)據(jù)庫的orm字段關(guān)系映射;
- 提供對象關(guān)系映射標(biāo)簽,支持對象關(guān)系組建維護(hù);
- 提供xml標(biāo)簽,支持編寫動態(tài)sql。
1.5 如何學(xué)習(xí)Mybatis
maven倉庫中查找Mybatis依賴包: https://mvnrepository.com/
Mybatis文檔:https://mybatis.org/mybatis-3/zh/index.html
2. Mybatis環(huán)境搭建與第一個(gè)Mybaits程序(基于Maven)
2.1 環(huán)境搭建
基于Maven項(xiàng)目中使用Mybatis,只需要在.pom文件中引入Mybatis對應(yīng)的包即可。
<dependencies>
<!--java的Mysql包,用于連接Mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!--Mybatis依賴-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--junit依賴,用于測試,可以使用@Tset注解實(shí)現(xiàn)模塊的測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.2 第一個(gè)Mybatis程序
一個(gè)Mybatis程序構(gòu)建完成后的示例結(jié)構(gòu)如下圖。
其具體構(gòu)建步驟如下:
準(zhǔn)備數(shù)據(jù)庫;
-
新建一個(gè)maven項(xiàng)目,并在項(xiàng)目的main目錄下的resource文件夾中新建mybatis-config.xml文件,結(jié)構(gòu)如下:
<!--文件名: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> <!--default通過id選擇對應(yīng)的environment,即可支持不止一種環(huán)境,如dev/pub/test環(huán)境等--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!-- manager默認(rèn)選擇JDBC --> <dataSource type="POOLED"> <!-- 數(shù)據(jù)源,即需要連接的數(shù)據(jù)庫--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!-- 數(shù)據(jù)庫驅(qū)動 --> <!-- url,服務(wù)器地址+數(shù)據(jù)庫名稱+配置參數(shù)(useSSL(安全驗(yàn)證登錄), useUnicode(UTF統(tǒng)一編碼), characterCoding=UTF-8(UTF-8編碼,用于識別中文字符),有時(shí)還需要設(shè)置時(shí)區(qū)) --> <property name="url" value="jdbc:mysql://【你的服務(wù)器地址】/【你的數(shù)據(jù)庫名】?useSSL=false&useUnicode=true&characterCoding=UTF-8"/> <property name="username" value="[yourusername]"/> <!-- 數(shù)據(jù)庫用戶名 --> <property name="password" value="[yourpasswrod]"/> <!-- 數(shù)據(jù)庫密碼 --> </dataSource> </environment> </environments> <!-- 項(xiàng)目中配置的Mapper對應(yīng)的xml文件 --> <mappers> <mapper resource="com/hy/dao/UserMapper.xml" /> </mappers> </configuration>
-
構(gòu)建Mybatis工具類:在utils文件夾中新建MybatisUtil.java工具類,用于讀取xml構(gòu)建sqlSession實(shí)例,作為程序與數(shù)據(jù)庫的連接。
//文件名:MybatisUtils.java public class MybatisUtils { //新建靜態(tài)sqlSessionFactory對象,該對象只需要在項(xiàng)目初始化時(shí)生成一次; private static SqlSessionFactory sqlSessionFactory; static { try { //定義xml文件地址,默認(rèn)地址在resources文件夾中; String resource = "mybatis-config.xml"; InputStream inputStream = null; //對過inputSteam流解析xml中的數(shù)據(jù)庫及項(xiàng)目信息; inputStream = Resources.getResourceAsStream(resource); //sqlSessionFactory對象由sqlSessionFactoryBuilder對象的build方法實(shí)例化; sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //定義一個(gè)getSqlSession方法來構(gòu)建一個(gè)sqlSession實(shí)例,通過sqlSessionFactory的openSession()方法實(shí)現(xiàn)。 //sqlSession完全包含了面向數(shù)據(jù)庫執(zhí)行SQL命令所需的所有方法! //參數(shù)true指打開了sqlSession的自動提交,即更改數(shù)據(jù)庫后無需手動commit。 public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(true); } }
-
編寫數(shù)據(jù)庫
數(shù)據(jù)定義一般放入pojo文件夾,一般一個(gè)數(shù)據(jù)表與一個(gè)類對應(yīng),類的屬性為表中的字段,同時(shí)構(gòu)建出get/set方法,tostring方法,有參/無參構(gòu)造方法。
//文件名:User.java package com.hy.pojo; public class User { private int id; private String name; private String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
-
編寫數(shù)據(jù)庫交互接口
數(shù)據(jù)庫交互的接口一般放在dao文件夾,定義數(shù)據(jù)庫的基本操作(CRUD),一般命名為XxxMapper,定義為接口文件。
//文件名:UserMapper.java public interface UserMapper { //獲取全部用戶; List<User> getUserList(); //根據(jù)id查詢用戶; User getUserById(int id); //根據(jù)name查詢用戶; List<User> getUserListByName(String name); //insert一個(gè)用戶; void addUser(User user); //按id更新一個(gè)用戶; void updateUserById(User user); //按id刪除一個(gè)用戶; Integer deleteUserById(int id); //利用map適配查詢內(nèi)容; int addUserPartly(Map<String,Object> map); //模糊查詢; List<User> getUserLike(String value); }
-
編寫XxxMapper.xml文件
上一步中的接口的實(shí)現(xiàn)在此xml文件中定義,當(dāng)然也可以直接用java編寫實(shí)現(xiàn)類。而Mybatis的作用即在此步驟中,通過xml配置文件替換了java的實(shí)現(xiàn)類,免去了實(shí)現(xiàn)類中連接數(shù)據(jù)庫等基礎(chǔ)操作的代碼,簡化代碼并實(shí)現(xiàn)了java和SQL的解耦。
<!--文件名: UserMapper.xml--> <?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指向?qū)?yīng)的接口文件,需要使用全路徑的地址--> <mapper namespace="com.hy.dao.UserMapper"> <select id="getUserList" resultType="com.hy.pojo.User"> select * from db_hy.user </select> <!--id為對應(yīng)接口文件定義的方法--> <!--parameterType為傳入?yún)?shù)的類型,基本類型和String類型可省略,其他對象必須寫包的全路徑名稱--> <!--resultType為返回參數(shù)的類型,基本類型和String類型可省略,其他對象必須寫包的全路徑名稱--> <!--如果傳入或返回參數(shù)不止一個(gè),可以使用map對象傳參,也有其他方法--> <select id="getUserLike" parameterType="java.lang.String" resultType="com.hy.pojo.User"> select * from db_hy.user where name like "%"#{value}"%" </select> <select id="getUserById" parameterType="int" resultType="com.hy.pojo.User"> select * from db_hy.user where id = #{id} </select> <select id="getUserListByName" parameterType="String" resultType="com.hy.pojo.User"> select * from db_hy.user where name = #{name} </select> <insert id="addUser" parameterType="com.hy.pojo.User"> insert into db_hy.user (id,name,pwd) values (#{id}, #{name}, #{pwd}) </insert> <!--通過map對象,可以自定義傳入的內(nèi)容, --> <insert id="addUserPartly" parameterType="map"> insert into db_hy.user (id,name,pwd) values (#{userid}, #{userName}, #{passWORD}) </insert> <update id="updateUserById" parameterType="com.hy.pojo.User"> update db_hy.user set name=#{name}, pwd=#{pwd} where id=#{id} </update> <delete id="deleteUserById" parameterType="int"> delete from db_hy.user where id=#{id} </delete> </mapper>
-
將Mapper.xml引入項(xiàng)目
要使上一步中的Mapper.xml文件在項(xiàng)目中起作用,需要將xml文件引入項(xiàng)目。具體實(shí)現(xiàn)分為2步。
首先,需要將該文件引入mybatis的核心配置文件中,即引入mybatis-config.xml文件中。
image-20201205122248564.png
其次,需要在maven中將xml文件所在地址定義為maven搜索配置文件掃描的地址,否則maven在編譯程序時(shí)不會讀取該文件。
<dependencies>
<!-- xxx -->
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
-
編寫測試類進(jìn)行測試
在test文件夾中新建對應(yīng)接口文件相同位置的建立對應(yīng)的測試類,測試測試方法驗(yàn)證。
//文件名: UserMapperTest.java public class UserMapperTest { @Test public void test(){ //新建sqlSession連接。 SqlSession sqlSession = MybatisUtils.getSqlSession(); try{ //通過sqlSession的getMapper方法獲取UserMapper對象; //該對象就是對應(yīng)UserMapper接口的實(shí)例化對象。 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //UserMapper對象可以直接使用接口定義的方法,方法的實(shí)現(xiàn)來自Mapper.xml配置文件。 List<User> userList = userMapper.getUserList(); for (User user : userList) { System.out.println(user); } } finally { //測試完畢要記得關(guān)閉連接,釋放內(nèi)存。 sqlSession.close(); System.out.println("====================="); } } }