JavaEE SpringMyBatis是什么? 它和Hibernate的區別及如何配置MyBatis
MyBatis
MyBatis 是一個基于 Java 的持久層框架。MyBatis 提供的持久層框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了幾乎所有的 JDBC 代碼和參數的手工設置以及結果集的檢索。 MyBatis 使用簡單的 XML 或注解用于配置和原始映射,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成數據庫中的記錄。 目前,Java 的持久層框架產品有許多,常見的有 Hibernate 和 MyBatis。MyBatis和hibernate的區別有哪些
首先要知道ORM框架, 簡單來說就是通過實例對象的語法, 完成關系型數據庫的操作的一種框架, 是 對象-關系 映射, 也就是把數據庫映射成對象
開發方面
MyBatis 是一個半自動映射的框架,因為 MyBatis 需要手動匹配 POJO、SQL 和映射關系。(半自動ORM, 需要寫sql并 配置對象之間的關系) Hibernate 是一個全表映射的框架,只需提供 POJO 和映射關系即可。(全自動ORM 不需要寫sql以java對象表示數據庫關系, 自動完成sql的包裝 還可以跨數據庫 )sql 優化方面
Hibernate 不需要編寫大量的 SQL,就可以完全映射,提供了日志、緩存、級聯(級聯比 MyBatis 強大)等特性,此外還提供 HQL(Hibernate Query Language)對 POJO 進行操作。但會多消耗性能。 MyBatis 手動編寫 SQL,支持動態 SQL、處理列表、動態生成表名、支持存儲過程。工作量相對大些。 (優化工作比較方便)不同優勢
在技術選型時需考慮, 如果數據庫的設計上會有較大的, 頻繁的調整, 就是有MyBatis 如果需要做很多優化工作 MyBatis也是更勝一籌實現過程
1)讀取 MyBatis 配置文件:mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 MyBatis 的運行環境等信息,例如數據庫連接信息。
2)加載映射文件。映射文件即 SQL 映射文件,該文件中配置了操作數據庫的 SQL 語句,需要在 MyBatis 配置文件 mybatis-config.xml 中加載。mybatis-config.xml 文件可以加載多個映射文件,每個文件對應數據庫中的一張表。
3)構造會話工廠:通過 MyBatis 的環境等配置信息構建會話工廠 SqlSessionFactory。
4)創建會話對象:由會話工廠創建 SqlSession 對象,該對象中包含了執行 SQL 語句的所有方法。
5)Executor 執行器:MyBatis 底層定義了一個 Executor 接口來操作數據庫,它將根據 SqlSession 傳遞的參數動態地生成需要執行的 SQL 語句,同時負責查詢緩存的維護。
6)MappedStatement 對象:在 Executor 接口的執行方法中有一個 MappedStatement 類型的參數,該參數是對映射信息的封裝,用于存儲要映射的 SQL 語句的 id、參數等信息。
7)輸入參數映射:輸入參數類型可以是 Map、List 等集合類型,也可以是基本數據類型和 POJO 類型。輸入參數映射過程類似于 JDBC 對 preparedStatement 對象設置參數的過程。
8)輸出結果映射:輸出結果類型可以是 Map、 List 等集合類型,也可以是基本數據類型和 POJO 類型。輸出結果映射過程類似于 JDBC 對結果集的解析過程。
MyBatis在Spring Boot中的配置
創建一個SpringBoot項目 配置pom.xml文件<!-- =================要添加的部分開始================== --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency> <!-- Mybatis代碼生成工具 --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.5</version> </dependency> <!-- mysql-connector-java: mysql數據庫驅動包在編譯時沒有直接使用,但是運行時需要,所以使用scope runtime --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> <scope>runtime</scope> </dependency> <!-- druid-spring-boot-starter: 阿里Druid數據庫連接池,同樣的運行時需要 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency><!-- =================要添加的部分結束================== -->
在源代碼路徑下創建Generator
import org.mybatis.generator.api.MyBatisGenerator;import org.mybatis.generator.config.Configuration;import org.mybatis.generator.config.xml.ConfigurationParser;import org.mybatis.generator.internal.DefaultShellCallback;import java.io.File;import java.io.InputStream;import java.util.ArrayList;import java.util.List;public class Generator { private static final boolean OVERWRITE = true; private static final String CONFIG_PATH = 'generator/config.xml'; public static void main(String[] args) throws Exception { System.out.println('--------------------start generator-------------------'); System.out.println(new File('').getAbsolutePath()); List<String> warnings = new ArrayList<>(); ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classloader.getResourceAsStream(CONFIG_PATH); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(is); DefaultShellCallback callback = new DefaultShellCallback(OVERWRITE); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); warnings.forEach(System.err::println); System.out.println('--------------------end generator-------------------'); }}
在resources目錄下配置application.properties
#debug=true# 設置打印日志的級別,及打印sql語句logging.level.root=ERRORlogging.level.druid.sql.Statement=ERRORlogging.level.frank=DEBUG# 美化JSON數據格式spring.jackson.serialization.indent-output=true# 設置JSON數據的日期格式spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8# JSON數據屬性為null時不返回spring.jackson.default-property-inclusion=non_null# 找不到資源404時拋出異常spring.mvc.throw-exception-if-no-handler-found=true# 禁用靜態資源的自動映射,如不禁用,不存在的url將被映射到/**,servlet不有機會拋出異常#spring.resources.add-mappings=false# get請求參數及表單提交數據的日期格式spring.mvc.date-format=yyyy-MM-dd HH:mm:ss# 應用/項目的部署路徑,默認為/#server.servlet.context-path=/lucky-draw# SpringMVC中,DispatcherServlet的映射路徑,默認為/**#spring.mvc.servlet.path=/**# 靜態資源映射:將路徑映射為/,即/static/xxx,映射為/xxx,支持多個字符串,逗號間隔# 默認為/META-INF/resources/, /resources/, /static/, /public/#spring.resources.static-locations=/static/,/public/#====================要根據具體數據庫配置......的部分開始====================#druid數據庫連接池配置spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/......?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=falsespring.datasource.username=rootspring.datasource.password=......spring.datasource.druid.initial-size=1spring.datasource.druid.min-idle=1spring.datasource.druid.max-active=20spring.datasource.druid.test-on-borrow=true#Mybatis配置mybatis.mapper-locations=classpath:mapper/**Mapper.xml#mybatis.type-aliases-package=frank.mappermybatis.configuration.map-underscore-to-camel-case=true#mybatis.config-location=classpath:mybatis/mybatis-config.xml#====================要根據具體數據庫配置......的部分結束====================##mapper##mappers 多個接口時逗號隔開##mapper.mappers=tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.MySqlMapper,tk.mybatis.mapper.common.IdsMapper##mapper.notEmpty=true##mapper.identity=MYSQL###pagehelper##數據庫方言:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby#pagehelper.helperDialect=mysql##默認值為 false,該參數對使用 RowBounds 作為分頁參數時有效。 當該參數設置為 true 時,會將 RowBounds 中的 offset 參數當成 pageNum 使用,可以用頁碼和頁面大小兩個參數進行分頁。##pagehelper.offset-as-page-num=falses##默認值為false,該參數對使用 RowBounds 作為分頁參數時有效。 當該參數設置為true時,使用 RowBounds 分頁會進行 count 查詢。#pagehelper.row-bounds-with-count=true##默認值為 false,當該參數設置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結果(相當于沒有執行分頁查詢,但是返回結果仍然是 Page 類型)。##pagehelper.page-size-zero=false##分頁合理化參數,默認值為false。當該參數設置為 true 時,pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數時),會查詢最后一頁。默認false 時,直接根據參數進行查詢。#pagehelper.reasonable=true##為了支持startPage(Object params)方法,增加了該參數來配置參數映射,用于從對象中根據屬性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值, 默認值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。#pagehelper.params=pageNum=pageNumber;pageSize=pageSize;count=countSql;reasonable=reasonable;##支持通過 Mapper 接口參數來傳遞分頁參數,默認值false,分頁插件會從查詢方法的參數值中,自動根據上面 params 配置的字段中取值,查找到合適的值時就會自動分頁。 使用方法可以參考測試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。##pagehelper.supportMethodsArguments=true##用于控制默認不帶 count 查詢的方法中,是否執行 count 查詢,默認 true 會執行 count 查詢,這是一個全局生效的參數,多數據源時也是統一的行為。#pagehelper.default-count=false
在resources目錄下創建Generator包并且配置config.xml文件
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE generatorConfiguration PUBLIC '-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN' 'http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd'><generatorConfiguration> <properties resource='application.properties' /> <context targetRuntime='MyBatis3' defaultModelType='flat'> <property name='javaFileEncoding' value='UTF-8'/> <commentGenerator> <property name='suppressDate' value='true'/> <property name='suppressAllComments' value='true' /> <property name='addRemarkComments' value='true'/> </commentGenerator> <jdbcConnection driverClass='${spring.datasource.driver-class-name}' connectionURL='${spring.datasource.url}' userId='${spring.datasource.username}' password='${spring.datasource.password}'> <property name='useInformationSchema' value='true' /> </jdbcConnection> <!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時把JDBC DECIMAL 和 NUMERIC 類型解析為java.math.BigDecimal --> <javaTypeResolver> <property name='forceBigDecimals' value='false' /> </javaTypeResolver> <!--MyBatis 生成器只需要生成 Model--> <javaModelGenerator targetProject='修改為自己的項目名/src/test/java' targetPackage='修改為實體類的包(model,在啟動類的根包下)'><!-- <property name='rootClass' value='修改為實體類的父類'/>--> </javaModelGenerator> <!--mybatis 的xml文件地址--> <sqlMapGenerator targetProject='修改為自己的項目名/src/test/resources' targetPackage='修改為xml的包(mapper)'> <property name='enableSubPackages' value='true'/> </sqlMapGenerator> <!--mybatis的mapper接口--> <javaClientGenerator type='XMLMAPPER' targetProject='修改為自己的項目名/src/test/java' targetPackage='修改為mapper的包(在啟動類的根包下)'> <property name='enableSubPackages' value='true'/><!-- <property name='rootInterface' value='修改為mapper的父接口'/>--> </javaClientGenerator> <!-- 需要生成的表,%表示模糊匹配,也可以指定具體的表名 --><!-- <table tableName='%'--><!--enableCountByExample='false'--><!--enableDeleteByExample='false'--><!--enableSelectByExample='false'--><!--enableUpdateByExample='false'--><!-- >--> <table tableName='%'> <!-- insert方法通過自增主鍵插入數據后,主鍵值是否設置到對象屬性中 --> <!-- <generatedKey column='id' sqlStatement='JDBC'/>--> <generatedKey column='id' sqlStatement='Mysql' identity='true' /> </table> <!-- <table tableName='user'>--> <!-- <generatedKey column='id' sqlStatement='Mysql' identity='true' />--> <!-- </table>--> </context></generatorConfiguration>
如果不知道路徑可以自己打印一下當前項目的絕對路徑
import java.io.File;/** * Created with IntelliJ IDEA. * Description: If you don’t work hard, you will a loser. * User: Listen-Y. * Date: 2020-08-21 * Time: 17:41 */public class test { public static void main(String[] args) { //打印當前項目的絕對路徑 System.out.println(new File('').getAbsolutePath()); }}
在test目錄下創建resources包
@MapperScan(basePackages = '啟動類的根包名.mapper')
給mapper的每個文件增加注解
@Mapper
總結
到此這篇關于JavaEE SpringMyBatis是什么? 它和Hibernate的區別及如何配置MyBatis的文章就介紹到這了,更多相關JavaEE Spring MyBatis是什么它和Hibernate的區別內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章: