Mybatis plus,Mybatis從頭學到jio(一)

 2023-10-05 阅读 29 评论 0

摘要:以下所有的示例都將操作user、orders、orderdetail表 | Table | Create Table | user | CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(32) NOT NULL COMMENT '用戶名稱',`sex` char(1) DEFAULT NU

以下所有的示例都將操作user、orders、orderdetail表

| Table | Create Table                                                                                                                                                                                                                                                                                               
| user  | CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(32) NOT NULL COMMENT '用戶名稱',`sex` char(1) DEFAULT NULL COMMENT '性別',`address` varchar(256) DEFAULT NULL COMMENT '地址',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8         |+----+-----------+------+--------------+
| id | username  | sex  | address      |
+----+-----------+------+--------------+
|  1 | 王五      | 1    | NULL         |
| 10 | 張三      | 1    | 北京市       |
| 16 | 張小明    | 1    | 陜西西安     |
| 22 | 陳小明    | 1    | 陜西西安     |
| 24 | 張三豐    | 1    | 陜西西安     |
| 25 | 陳小明    | 1    | 陜西西安     |
| 26 | 王五      | NULL | NULL         |
+----+-----------+------+--------------+| orders | CREATE TABLE `orders` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL COMMENT '下單用戶id',`number` varchar(32) NOT NULL COMMENT '訂單號',`createtime` datetime NOT NULL COMMENT '創建訂單時間',`note` varchar(100) DEFAULT NULL COMMENT '備注',PRIMARY KEY (`id`),KEY `FK_orders_1` (`user_id`),CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8                |+----+---------+---------+---------------------+------+
| id | user_id | number  | createtime          | note |
+----+---------+---------+---------------------+------+
|  3 |       1 | 1000010 | 2015-02-04 13:22:35 | NULL |
|  4 |       1 | 1000011 | 2015-02-03 13:22:41 | NULL |
|  5 |      10 | 1000012 | 2015-02-12 16:13:23 | NULL |
+----+---------+---------+---------------------+------+| orderdetail | CREATE TABLE `orderdetail` (`id` int(11) NOT NULL AUTO_INCREMENT,`orders_id` int(11) NOT NULL COMMENT '訂單id',`items_id` int(11) NOT NULL COMMENT '商品id',`items_num` int(11) DEFAULT NULL COMMENT '商品購買數量',PRIMARY KEY (`id`),KEY `FK_orderdetail_1` (`orders_id`),KEY `FK_orderdetail_2` (`items_id`),CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8           |+----+-----------+----------+-----------+
| id | orders_id | items_id | items_num |
+----+-----------+----------+-----------+
|  1 |         3 |        1 |         1 |
|  2 |         3 |        2 |         3 |
|  3 |         4 |        3 |         4 |
|  4 |         4 |        2 |         3 |
+----+-----------+----------+-----------+

mybatis介紹

什么是mybatis

mybatis是一個半ORM(對象關系映射),優秀的持久性框架。mybatis的出現極大的簡化了JDBC編碼過程中存在的硬編碼、設置參數、獲取結果集。mybatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。

mybatis優缺點

優點:

  • 基于SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便于統一管理;
  • 提供XML標簽,支持編寫動態SQL語句,并可重用與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動開關連接。
  • 很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持),提供映射標簽,支持對象與數據庫的ORM字段關系映射;
  • 提供對象關系映射標簽,支持對象關系組件維護能夠與Spring很好的集成。

缺點:

  • 當字段和關聯表比較多的時候對開發的人員編寫SQL語句的功底要求比較高。
  • SQL語句依賴于數據庫,不可隨意更換數據庫。

mybatis實現原理

mybatis的三層架構

  • API接口層:提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。
  • 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。
  • 基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的數據處理層提供最基礎的支撐。

mybatis原理圖

Mybatis plus?在這里插入圖片描述


執行過程
1)讀取 mabatis 配置文件:mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 mabatis 的數據源、事務、映射

2)加載映射文件。映射文件即 SQL 映射文件,該文件中配置了操作數據庫的 SQL 語句,需要在 mabatis 配置文件 mybatis-config.xml 中加載。mybatis-config.xml 文件可以加載多個映射文件,每個文件對應數據庫中的一張表。

3)構造會話工廠:通過 mabatis 的環境等配置信息構建會話工廠 SqlSessionFactory。

4)創建會話對象:由會話工廠創建 SqlSession 對象,該對象中包含了執行 SQL 語句的所有方法。

Spring boot。5)Executor 執行器:mabatis 底層定義了一個 Executor 接口來操作數據庫,它將根據 SqlSession 傳遞的參數動態地生成需要執行的 SQL 語句,同時負責查詢緩存的維護。

6)MappedStatement 對象:在 Executor 接口的執行方法中有一個 MappedStatement 類型的參數,該參數是對映射信息的封裝,用于存儲要映射的 SQL 語句的 id、參數等信息。

SqlSessionFactoryBuilder
這個類可以被實例化、使用和丟棄,一旦創建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。 你可以重用 SqlSessionFactoryBuilder 來創建多個 SqlSessionFactory 實例,但最好還是不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。
SqlSessionFactory
SqlSessionFactory 一旦被創建就應該在應用的運行期間一直存在,沒有任何理由丟棄它或重新創建另一個實例。 使用 SqlSessionFactory 的最佳實踐是在應用運行期間不要重復創建多次,多次重建 SqlSessionFactory 被視為一種代碼“壞習慣”。 因此 SqlSessionFactory 的最佳作用域是應用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。
SqlSession
每個線程都應該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。 絕對不能將 SqlSession 實例的引用放在一個類的靜態域,甚至一個類的實例變量也不行。 也絕不能將 SqlSession 實例的引用放在任何類型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你現在正在使用一種 Web 框架,考慮將 SqlSession 放在一個和 HTTP 請求相似的作用域中。 換句話說,每次收到 HTTP 請求,就可以打開一個SqlSession,返回一個響應后,就關閉它。 這個關閉操作很重要,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。 下面的示例就是一個確保 SqlSession 關閉的標準模式。

JDBC編程

getConnection方法

public static Connection connection;public static Connection getConnection(){try {//加載驅動程序Class.forName("com.mysql.jdbc.Driver");System.out.println("數據庫驅動加載成功!");connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/stuscore","root","123456");if (connection != null){System.out.println("數據庫連接成功");return connection;}} catch (Exception e) {e.printStackTrace();}return null;}

查詢過程

//查詢操作public static void search(){Connection connection = ConnectionDemo.getConnection();String sql = "select *from student where SID = ?";try {PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,2);ResultSet resultSet = preparedStatement.executeQuery();while(resultSet.next()){int sid = resultSet.getInt("SID");String sname = resultSet.getString("Sname");int sage = resultSet.getInt("Sage");String ssex = resultSet.getString("Ssex");System.out.println("SID:"+sid+" Sname:"+sname+" Sage:"+sage+" Ssex:"+ssex);}preparedStatement.close();resultSet.close();} catch (SQLException e) {e.printStackTrace();}finally {try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}}

JDBC編碼過程中存在的問題

MybatisPlus?在這里插入圖片描述

解決方法

  1. 使用連接池概念每次啟動都不用去加載類和驅動包路徑、只需要獲取一個connection對象
  2. 將SQL和java代碼解耦合、將SQL語句放進xml文件之中,只需要在xml文件之中修改SQL語句
  3. mybatis 自動將java對象映射
  4. 將數據庫中的字段映射java對象

mybatis 具體操作

查詢id = 1的字段

1.Maven中需要引入的依賴

<!--mysql操作--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.40</version></dependency><!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version></dependency>

2.配置主配置文件 并引入依賴(mybatis-config.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--根標簽-->
<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"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments></configuration>

Tip1:3306后面需要跟的是操作表所在庫名
Tip2:這里需要注意在配置的過程不要將屬性名與value值打錯否則會報錯

3.POJO對象(user.java)

public class user{private Integer id;private String username;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 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;}@Overridepublic String toString() {return "User7{" +"id=" + id +", username='" + username + '\'' +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}
}

java priorityqueue?4.mapper接口文件(UserMapper.java)

public interface UserMapper{user getUserById(Integer id);
}

5.配置映射文件 (UserMapper.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace: 一般為接口的全限定類名當不使用的時候:id不能重復,當使用namespace使用的時候:id可以重復 --><mapper namespace="com.pojo.StudentMapper"><!--查詢標簽:select   id:接口中的方法名  返回值resultType返回指定結果集的類型--><select id="selectStudentById" resultType="com.pojo.user" >select * from student where SID = #{sid}</select>
</mapper>

6.在主配置文件之中配置映射關系

<!--配置映射--><mappers><!-- resource:單個mapper映射,xml和接口可以不再一個目錄下在StudentMapper.xml中定義namespace為mapper接口的地址,映射文件通過namespace來找到mapper接口文件 --><!--以下兩種不使用本例只使用第一種--><mapper resource="mapper/UserMapper.xml"></mapper><!--單個mapper映射:單個mapper映射,指定mapper接口的地址遵循規則將mapper.xml和mapper.java放在同一個目錄下,且文件名相同--><mapper class="com.dao.UserMapper"></mapper><!--package方式:批量的mapper映射遵循的規則:將mapper.xml和mapper.java 放在同一個目錄下,且文件名相同--><package name="com.tulun.dao"/></mappers>

映射文件之中還有以下標簽

以上三種標簽不一一演示我直接貼出之前打過的代碼

	<!--插入標簽 : insert id:接口方法名  輸入參數parameterType值可以忽略useGenerateKeys:true為自增--><insert id="insertUser" parameterType="user">insert into user(id,username,sex,address) values (#{id},#{username},#{sex},#{adress})</insert><!--修改標簽resultType不是必須存在的parameterType也可以省略--><update id="updateUser">update user set username= #{username} where id= #{id}</update><!--刪除標簽resultType、parameterType可以被忽略--><delete id="deleteStudent">delete from user where id = #{id}</delete>

resultType與resultMap

resultType:只能在映射過程之中java對象和數據庫的字段必須一致,否則映射不成功。
resultMap:高級映射:當發現java對象的屬性名和數據庫的字段名不一致的時候可以在xml中定義一個resultMap與之java對象一一對應即可。resultMap還可以實現一對一單表查詢以及一對多多表聯合查詢。

resultMap的使用

<!--處理顯性的結果集映射id=作為結果集的標識type指定要映射的Java結果集的全限定類名--><resultMap id="userMap" type="user"><!--column:數據庫表對應的行property:Java對象對應的屬性--><id column="id" property="id"></id><result column="username" property="name"></result><result column="sex" property="sex"></result><result column="adress" property="adress"></result></resultMap><!--查詢標簽:select   id:接口中的方法名  返回值resultType返回指定結果集的類型--><select id="selectStudentById" resultMap="userMap" >select * from student where SID = #{sid}</select>

java sequence?Tip:注意上面代碼username部分的變化

一對一映射 association

將user表映射到order表

<resultMap type="com.pojo.Orders" id="OrdersUserResultMap"><!-- 配置映射的訂單信息 --><!-- id:指定查詢列中的唯 一標識,訂單信息的中的唯 一標識,如果有多個列組成唯一標識,配置多個idcolumn:訂單信息的唯 一標識 列property:訂單信息的唯 一標識 列所映射到Orders中哪個屬性--><id column="id" property="id"/><result column="user_id" property="userId"/><result column="number" property="number"/><result column="createtime" property="createtime"/><result column="note" property=note/><!-- 配置映射的關聯的用戶信息 --><!-- association:用于映射關聯查詢單個對象的信息property:要將關聯查詢的用戶信息映射到Orders中哪個屬性--><association property="user"  javaType="com.pojo.user"><!-- id:關聯查詢用戶的唯 一標識column:指定唯 一標識用戶信息的列javaType:映射到user的哪個屬性--><id column="user_id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><result column="address" property="address"/></association>
</resultMap>

一對多映射 collection

<resultMap type="com.pojo.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap"><!-- 訂單信息 --><!-- 用戶信息 --><!-- 使用extends繼承,不用在中配置訂單信息和用戶信息的映射 --><!-- 訂單明細信息一個訂單關聯查詢出了多條明細,要使用collection進行映射collection:對關聯查詢到多條記錄映射到集合對象中property:將關聯查詢到多條記錄映射到cn.itcast.mybatis.po.Orders哪個屬性ofType:指定映射到list集合屬性中pojo的類型--><collection property="orderdetails" ofType="com.pojo.Orderdetail"><!-- id:訂單明細唯 一標識property:要將訂單明細的唯 一標識 映射到cn.itcast.mybatis.po.Orderdetail的哪個屬性--><id column="orderdetail_id" property="id"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/></collection>
</resultMap>

半夜寫出來的東西 可能有的地方知識不夠齊全。后面會寫一篇自定義mybatis的文章。(跟著B站大佬搞出來的東西)還有好多知識沒寫出來。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/120687.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息