JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis
MyBatis
MyBatis 是一個基于 Java 的持久層框架。MyBatis 提供的持久層框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了幾乎所有的 JDBC 代碼和參數(shù)的手工設置以及結果集的檢索。 MyBatis 使用簡單的 XML 或注解用于配置和原始映射,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成數(shù)據庫中的記錄。 目前,Java 的持久層框架產品有許多,常見的有 Hibernate 和 MyBatis。MyBatis和hibernate的區(qū)別有哪些
首先要知道ORM框架, 簡單來說就是通過實例對象的語法, 完成關系型數(shù)據庫的操作的一種框架, 是 對象-關系 映射, 也就是把數(shù)據庫映射成對象
開發(fā)方面
MyBatis 是一個半自動映射的框架,因為 MyBatis 需要手動匹配 POJO、SQL 和映射關系。(半自動ORM, 需要寫sql并 配置對象之間的關系) Hibernate 是一個全表映射的框架,只需提供 POJO 和映射關系即可。(全自動ORM 不需要寫sql以java對象表示數(shù)據庫關系, 自動完成sql的包裝 還可以跨數(shù)據庫 )sql 優(yōu)化方面
Hibernate 不需要編寫大量的 SQL,就可以完全映射,提供了日志、緩存、級聯(lián)(級聯(lián)比 MyBatis 強大)等特性,此外還提供 HQL(Hibernate Query Language)對 POJO 進行操作。但會多消耗性能。 MyBatis 手動編寫 SQL,支持動態(tài) SQL、處理列表、動態(tài)生成表名、支持存儲過程。工作量相對大些。 (優(yōu)化工作比較方便)不同優(yōu)勢
在技術選型時需考慮, 如果數(shù)據庫的設計上會有較大的, 頻繁的調整, 就是有MyBatis 如果需要做很多優(yōu)化工作 MyBatis也是更勝一籌實現(xiàn)過程
1)讀取 MyBatis 配置文件:mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 MyBatis 的運行環(huán)境等信息,例如數(shù)據庫連接信息。
2)加載映射文件。映射文件即 SQL 映射文件,該文件中配置了操作數(shù)據庫的 SQL 語句,需要在 MyBatis 配置文件 mybatis-config.xml 中加載。mybatis-config.xml 文件可以加載多個映射文件,每個文件對應數(shù)據庫中的一張表。
3)構造會話工廠:通過 MyBatis 的環(huán)境等配置信息構建會話工廠 SqlSessionFactory。
4)創(chuàng)建會話對象:由會話工廠創(chuàng)建 SqlSession 對象,該對象中包含了執(zhí)行 SQL 語句的所有方法。
5)Executor 執(zhí)行器:MyBatis 底層定義了一個 Executor 接口來操作數(shù)據庫,它將根據 SqlSession 傳遞的參數(shù)動態(tài)地生成需要執(zhí)行的 SQL 語句,同時負責查詢緩存的維護。
6)MappedStatement 對象:在 Executor 接口的執(zhí)行方法中有一個 MappedStatement 類型的參數(shù),該參數(shù)是對映射信息的封裝,用于存儲要映射的 SQL 語句的 id、參數(shù)等信息。
7)輸入參數(shù)映射:輸入參數(shù)類型可以是 Map、List 等集合類型,也可以是基本數(shù)據類型和 POJO 類型。輸入參數(shù)映射過程類似于 JDBC 對 preparedStatement 對象設置參數(shù)的過程。
8)輸出結果映射:輸出結果類型可以是 Map、 List 等集合類型,也可以是基本數(shù)據類型和 POJO 類型。輸出結果映射過程類似于 JDBC 對結果集的解析過程。
MyBatis在Spring Boot中的配置
創(chuàng)建一個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數(shù)據庫驅動包在編譯時沒有直接使用,但是運行時需要,所以使用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數(shù)據庫連接池,同樣的運行時需要 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency><!-- =================要添加的部分結束================== -->
在源代碼路徑下創(chuàng)建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數(shù)據格式spring.jackson.serialization.indent-output=true# 設置JSON數(shù)據的日期格式spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8# JSON數(shù)據屬性為null時不返回spring.jackson.default-property-inclusion=non_null# 找不到資源404時拋出異常spring.mvc.throw-exception-if-no-handler-found=true# 禁用靜態(tài)資源的自動映射,如不禁用,不存在的url將被映射到/**,servlet不有機會拋出異常#spring.resources.add-mappings=false# get請求參數(shù)及表單提交數(shù)據的日期格式spring.mvc.date-format=yyyy-MM-dd HH:mm:ss# 應用/項目的部署路徑,默認為/#server.servlet.context-path=/lucky-draw# SpringMVC中,DispatcherServlet的映射路徑,默認為/**#spring.mvc.servlet.path=/**# 靜態(tài)資源映射:將路徑映射為/,即/static/xxx,映射為/xxx,支持多個字符串,逗號間隔# 默認為/META-INF/resources/, /resources/, /static/, /public/#spring.resources.static-locations=/static/,/public/#====================要根據具體數(shù)據庫配置......的部分開始====================#druid數(shù)據庫連接池配置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#====================要根據具體數(shù)據庫配置......的部分結束====================##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##數(shù)據庫方言:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby#pagehelper.helperDialect=mysql##默認值為 false,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當該參數(shù)設置為 true 時,會將 RowBounds 中的 offset 參數(shù)當成 pageNum 使用,可以用頁碼和頁面大小兩個參數(shù)進行分頁。##pagehelper.offset-as-page-num=falses##默認值為false,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當該參數(shù)設置為true時,使用 RowBounds 分頁會進行 count 查詢。#pagehelper.row-bounds-with-count=true##默認值為 false,當該參數(shù)設置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結果(相當于沒有執(zhí)行分頁查詢,但是返回結果仍然是 Page 類型)。##pagehelper.page-size-zero=false##分頁合理化參數(shù),默認值為false。當該參數(shù)設置為 true 時,pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數(shù)時),會查詢最后一頁。默認false 時,直接根據參數(shù)進行查詢。#pagehelper.reasonable=true##為了支持startPage(Object params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據屬性名取值, 可以配置 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 接口參數(shù)來傳遞分頁參數(shù),默認值false,分頁插件會從查詢方法的參數(shù)值中,自動根據上面 params 配置的字段中取值,查找到合適的值時就會自動分頁。 使用方法可以參考測試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。##pagehelper.supportMethodsArguments=true##用于控制默認不帶 count 查詢的方法中,是否執(zhí)行 count 查詢,默認 true 會執(zhí)行 count 查詢,這是一個全局生效的參數(shù),多數(shù)據源時也是統(tǒng)一的行為。#pagehelper.default-count=false
在resources目錄下創(chuàng)建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方法通過自增主鍵插入數(shù)據后,主鍵值是否設置到對象屬性中 --> <!-- <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目錄下創(chuàng)建resources包
@MapperScan(basePackages = '啟動類的根包名.mapper')
給mapper的每個文件增加注解
@Mapper
總結
到此這篇關于JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis的文章就介紹到這了,更多相關JavaEE Spring MyBatis是什么它和Hibernate的區(qū)別內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章:
1. CentOS郵件服務器搭建系列—— POP / IMAP 服務器的構建( Dovecot )2. 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法3. django創(chuàng)建css文件夾的具體方法4. jsp網頁實現(xiàn)貪吃蛇小游戲5. ASP中if語句、select 、while循環(huán)的使用方法6. .NET SkiaSharp 生成二維碼驗證碼及指定區(qū)域截取方法實現(xiàn)7. MyBatis JdbcType 與Oracle、MySql數(shù)據類型對應關系說明8. ASP中實現(xiàn)字符部位類似.NET里String對象的PadLeft和PadRight函數(shù)9. 存儲于xml中需要的HTML轉義代碼10. 利用CSS制作3D動畫
