目錄
Mybatis
定義:持久層?
干啥的?作用於哪一方面?
基本配置,基本操作?
- 重點,難點---結果集映射
- 分頁,
- 注解開發(重點)
- 一對多,多對多的處理(難點)
- 動態SQL(重點)
- 緩存(十分重要,極其重要)
mybatis開始
-----環境准備
- JDK 1.8
- mysql 8.0.21
- maven 3.6.1
- mybatis 3.5.3
- IDEA
-
回顧 - JDBC - Mysql - java - Maven - Junit
-
框架,都有配置文件。最好的方式---看官網
-
下載:GitHub : https://github.com/mybatis/mybatis-3/releases
-
maven下載 mybatis 3.5.3
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency>
一.簡介
1.什么是MyBatis
- MyBatis 是一款優秀的持久層框架
- MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集的過程
- MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,
將接口和 Java 的 實體類 【Plain Old Java Objects,普通的 Java對象】映射成數據庫中的記錄。 - MyBatis 本是apache的一個開源項目ibatis, 2010年這個項目由apache 遷移到了google code,並且改名為MyBatis 。
- 2013年11月遷移到Github .
2.持久化
-
1.持久化是將程序數據在持久狀態和瞬時狀態間轉換的機制。
- 1).即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用
是將內存中的對象存儲在數據庫中,或者存儲在磁盤文件中、XML數據文件中等等。 - 2).JDBC就是一種持久化機制。文件IO也是一種持久化機制。
- 3).在生活中 : 將鮮肉冷藏,吃的時候再解凍的方法也是。將水果做成罐頭的方法也是。
- 1).即把數據(如內存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用
-
2.為什么需要持久化服務呢?那是由於內存本身的缺陷引起的(內存斷電即失)
- 1).內存斷電后數據會丟失,但有一些對象是無論如何都不能丟失的,比如銀行賬號等,遺憾的
是,人們還無法保證內存永不掉電。 - 2).內存過於昂貴,與硬盤、光盤等外存相比,內存的價格要高2~3個數量級,而且維持成本也
高,至少需要一直供電吧。所以即使對象不需要永久保存,也會因為內存的容量限制不能一直
呆在內存中,需要持久化來緩存到外存。
- 1).內存斷電后數據會丟失,但有一些對象是無論如何都不能丟失的,比如銀行賬號等,遺憾的
3.持久層
- 什么是持久層?
- 1.完成持久化工作的代碼塊 . ----> dao層 【DAO (Data Access Object) 數據訪問對象】
- 2.大多數情況下特別是企業級應用,數據持久化往往也就意味着將內存中的數據保存到磁盤上加
以固化,而持久化的實現過程則大多通過各種關系數據庫來完成。 - 3.不過這里有一個字需要特別強調,也就是所謂的“層”。對於應用系統而言,數據持久功能大多
是必不可少的組成部分。也就是說,我們的系統中,已經天然的具備了“持久層”概念?也許
是,但也許實際情況並非如此。之所以要獨立出一個“持久層”的概念,而不是“持久模塊”,“持久
單元”,也就意味着,我們的系統架構中,應該有一個相對獨立的邏輯層面,專著於數據持久
化邏輯的實現. - 4.與系統其他部分相對而言,這個層面應該具有一個較為清晰和嚴格的邏輯邊界。 【說白了就
是用來操作數據庫存在的!】
4.為什么需要Mybatis?
- 幫助程序員將數據存到數據庫中
- 方便
- 傳統JDBC代碼台復雜。簡化。框架。自動化
- 不用Mybatis也可以,更容易上手。技術沒有高低之分
- 優點-------主要就是用的人多
二.第一個Mybatis程序
思路:搭建環境-->導入mybatis-->編寫代碼-->測試
1.搭建環境
1).數據庫的
mysql> create database `mybatis`;
Query OK, 1 row affected (0.00 sec)
mysql> use `mybatis`;
Database changed
mysql> create table `user`(
-> `id` int not null,
-> `name` varchar(20) DEFAULT null,
-> `password` varchar(20) DEFAULT null,
-> primary key(`id`)
-> )engine = INNODB DEFAULT charset=utf8;
Query OK, 0 rows affected (0.02 sec)
mysql> insert into `user`(`id`,`name`,`password`) values(0,'zjz0','123456'),(1,'zjz1','123456'),(2,'zjz2','123456');
Query OK, 3 rows affected (0.00 sec)
2).maven項目
- 普通maven項目
- 刪除src
- 導入mysql mybatis junit 包
<dependencies>
<!-- mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- 單元測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--mybatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
</dependencies>
<!-- ex:此處增加的build詳細在maven====太長不加了-->
3).創建一個子類modules

4).編寫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核心配置文件--> <configuration> <environments default="development"> <environment id="development"> <!-- 事務管理--> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis? useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--每一個mapper.xml都需要在mybatis核心配置文件中注冊--> <mappers> <mapper resource="com/zjz/dao/UserMapper.xml"/> </mappers> </configuration>- 編寫mybatis工具類
- sqlSessionFactory -- 構建sqlSession
// sqlSessionFactory -產生-> sqlSession public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { // 第一步--獲取sqlSessionFactory對象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } }//獲取SqlSession連接 public static SqlSession getSqlSession() { SqlSession sqlSession = sqlSessionFactory.openSession(); // sqlSession 不是線程安全的 return sqlSession; } } - 編寫mybatis工具類
5).編寫代碼
-
UserMapper接口
public interface UserMapper { List<User> getUserList(); } -
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,綁定一個Dao/Mapper接口-->
<mapper namespace="com.zjz.dao.UserMapper">
<!--id要與mapper的方法對應-->
<!--resultType返回類型-->
<select id="getUserList" resultType="com.zjz.pojo.User">
select * from user
</select>
</mapper>
6).測試
-
Junit測試
@Test public void test(){ // 第一步,獲得SqlSession對象 SqlSession sqlSession = MybatisUtils.getSqlSession(); // 執行sql UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); System.out.println(userList.toString()); // 關閉SqlSession sqlSession.close(); }
三個核心接口


注意
- org.apache.ibatis.binding.BindingException:
Type interface com.zjz.dao.UserMapper is not known to the MapperRegistry. - MapperRegistry
- 問題
- 1.配置文件沒有注冊(mybatis-config沒配置)
- UserMapper.xml--2.綁定接口錯誤 3.方法名不對 4.返回類型不對
- pom.xml 5.Maven導出資源錯誤 MapperRegistry
總:

三,基本CRUD
操作DML一定要提交事務 sqlSession.commit();
1.namespace
- namespace中的包名要和Mapper接口的包名一致
2.Mapper.xml
- 語句
- 1.id:對應的namesapce中的方法名
- 2.resultType:
- Sql語句執行的返回值(對應對象則為對象類型)-單表返回對應的對象,多表返回
- 在resultType中:參數1.一個是com.zjz.pojo.bean 2.一個是設置別名,要不就報錯
- --如果select,必須有,其它可以沒有
- 3.parameterType 參數類型
- 4.語句中傳參使用
#{XXX}XXX 要對應 parameterType里面的東西
問題 sqlSession 是如何控制全局的,中途關閉它,有什么影響?(或者只讓它有初始值)
- 查詢時,可以依據參數查找對象---入參parameterType 出參 resultType
- 插入時,入參parameterType--一般就是對象了 ,出參不寫
代碼
-
1.接口Mapper
public interface UserMapper { // 查詢全部用戶 List<Object> getUserList(); // list中可以指定POJO,也可以指定Object(多表) // 根據id查詢 User getUserById(int id); // 插入insert int addUser(User user); // 修改用戶 int updateUser(User user); // 刪除用戶 int deleteUser(int id); } -
2.Mapper.xml
<!--namespace,綁定一個Dao/Mapper接口--> <mapper namespace="com.zjz.dao.UserMapper"> <!--id要與mapper的方法對應--> <!--resultType返回類型--> <!--resultType返回類型 select中,如果指定,那么返回指定對象,不指定報錯 多表應該怎么寫?? --> <select id="getUserList" resultType="com.zjz.pojo.User" > select * from user </select> <select id="getUserById" parameterType="int" resultType="com.zjz.pojo.User"> select * from mybatis.user where id = #{id} </select> <insert id="addUser" parameterType="com.zjz.pojo.User"> insert into mybatis.user(id,name,password) values (#{id},#{name},#{password}); </insert> <update id="updateUser" parameterType="com.zjz.pojo.User"> update mybatis.user set name = #{name},password = #{password} where id = #{id}; </update> <delete id="deleteUser" parameterType="int"> delete from mybatis.user where id = #{id}; </delete> </mapper> -
3.Test
@Test public void TestGetUserById(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User userById = mapper.getUserById(1); System.out.println(userById); sqlSession.close(); } @Test public void TestAddUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.addUser(new User(5, "zjz05", "123456")); // 提交事務 sqlSession.commit(); sqlSession.close(); } @Test public void TestUpdateUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updateUser(new User(4,"zjz04","123456")); sqlSession.commit(); sqlSession.close(); }
模糊查詢 切記防止sql注入
-
方式一:安全的
- XXXMappper.xml
<!--like '%zjz%'--> <select id="getUserLike" resultType="com.zjz.pojo.User" > select * from user where name like #{value} </select>- test語句
List<User> list = mapper.getUserLike("%zjz%");
-
方式二:可sql注入
- XXXMappper.xml
<!--like '%zjz%'--> <select id="getUserLike" resultType="com.zjz.pojo.User" > select * from user where name like "%"#{value}"%" </select>- test語句
List<User> list = mapper.getUserLike("zjz");
一些錯誤
- 1.標簽。。各對各的 select……
- 2.resource綁定mapper,需要使用路徑
- 3.程序配置文件符合規范
- 4.NullPointException 沒找到資源
- 5.輸出的xml文件有亂碼。。。
- 6.maven資源導出問題
