av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis

瀏覽:86日期:2023-08-20 08:17:06

MyBatis

MyBatis 是一個(gè)基于 Java 的持久層框架。MyBatis 提供的持久層框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了幾乎所有的 JDBC 代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。 MyBatis 使用簡(jiǎn)單的 XML 或注解用于配置和原始映射,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。 目前,Java 的持久層框架產(chǎn)品有許多,常見的有 Hibernate 和 MyBatis。

MyBatis和hibernate的區(qū)別有哪些

首先要知道ORM框架, 簡(jiǎn)單來(lái)說(shuō)就是通過(guò)實(shí)例對(duì)象的語(yǔ)法, 完成關(guān)系型數(shù)據(jù)庫(kù)的操作的一種框架, 是 對(duì)象-關(guān)系 映射, 也就是把數(shù)據(jù)庫(kù)映射成對(duì)象

JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis

開發(fā)方面

MyBatis 是一個(gè)半自動(dòng)映射的框架,因?yàn)?MyBatis 需要手動(dòng)匹配 POJO、SQL 和映射關(guān)系。(半自動(dòng)ORM, 需要寫sql并 配置對(duì)象之間的關(guān)系) Hibernate 是一個(gè)全表映射的框架,只需提供 POJO 和映射關(guān)系即可。(全自動(dòng)ORM 不需要寫sql以java對(duì)象表示數(shù)據(jù)庫(kù)關(guān)系, 自動(dòng)完成sql的包裝 還可以跨數(shù)據(jù)庫(kù) )

sql 優(yōu)化方面

Hibernate 不需要編寫大量的 SQL,就可以完全映射,提供了日志、緩存、級(jí)聯(lián)(級(jí)聯(lián)比 MyBatis 強(qiáng)大)等特性,此外還提供 HQL(Hibernate Query Language)對(duì) POJO 進(jìn)行操作。但會(huì)多消耗性能。 MyBatis 手動(dòng)編寫 SQL,支持動(dòng)態(tài) SQL、處理列表、動(dòng)態(tài)生成表名、支持存儲(chǔ)過(guò)程。工作量相對(duì)大些。 (優(yōu)化工作比較方便)

不同優(yōu)勢(shì)

在技術(shù)選型時(shí)需考慮, 如果數(shù)據(jù)庫(kù)的設(shè)計(jì)上會(huì)有較大的, 頻繁的調(diào)整, 就是有MyBatis 如果需要做很多優(yōu)化工作 MyBatis也是更勝一籌

實(shí)現(xiàn)過(guò)程

JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis

1)讀取 MyBatis 配置文件:mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 MyBatis 的運(yùn)行環(huán)境等信息,例如數(shù)據(jù)庫(kù)連接信息。

2)加載映射文件。映射文件即 SQL 映射文件,該文件中配置了操作數(shù)據(jù)庫(kù)的 SQL 語(yǔ)句,需要在 MyBatis 配置文件 mybatis-config.xml 中加載。mybatis-config.xml 文件可以加載多個(gè)映射文件,每個(gè)文件對(duì)應(yīng)數(shù)據(jù)庫(kù)中的一張表。

3)構(gòu)造會(huì)話工廠:通過(guò) MyBatis 的環(huán)境等配置信息構(gòu)建會(huì)話工廠 SqlSessionFactory。

4)創(chuàng)建會(huì)話對(duì)象:由會(huì)話工廠創(chuàng)建 SqlSession 對(duì)象,該對(duì)象中包含了執(zhí)行 SQL 語(yǔ)句的所有方法。

5)Executor 執(zhí)行器:MyBatis 底層定義了一個(gè) Executor 接口來(lái)操作數(shù)據(jù)庫(kù),它將根據(jù) SqlSession 傳遞的參數(shù)動(dòng)態(tài)地生成需要執(zhí)行的 SQL 語(yǔ)句,同時(shí)負(fù)責(zé)查詢緩存的維護(hù)。

6)MappedStatement 對(duì)象:在 Executor 接口的執(zhí)行方法中有一個(gè) MappedStatement 類型的參數(shù),該參數(shù)是對(duì)映射信息的封裝,用于存儲(chǔ)要映射的 SQL 語(yǔ)句的 id、參數(shù)等信息。

7)輸入?yún)?shù)映射:輸入?yún)?shù)類型可以是 Map、List 等集合類型,也可以是基本數(shù)據(jù)類型和 POJO 類型。輸入?yún)?shù)映射過(guò)程類似于 JDBC 對(duì) preparedStatement 對(duì)象設(shè)置參數(shù)的過(guò)程。

8)輸出結(jié)果映射:輸出結(jié)果類型可以是 Map、 List 等集合類型,也可以是基本數(shù)據(jù)類型和 POJO 類型。輸出結(jié)果映射過(guò)程類似于 JDBC 對(duì)結(jié)果集的解析過(guò)程。

MyBatis在Spring Boot中的配置

創(chuàng)建一個(gè)SpringBoot項(xiàng)目 配置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ù)據(jù)庫(kù)驅(qū)動(dòng)包在編譯時(shí)沒有直接使用,但是運(yùn)行時(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ù)據(jù)庫(kù)連接池,同樣的運(yùn)行時(shí)需要 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency><!-- =================要添加的部分結(jié)束================== -->

在源代碼路徑下創(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# 設(shè)置打印日志的級(jí)別,及打印sql語(yǔ)句logging.level.root=ERRORlogging.level.druid.sql.Statement=ERRORlogging.level.frank=DEBUG# 美化JSON數(shù)據(jù)格式spring.jackson.serialization.indent-output=true# 設(shè)置JSON數(shù)據(jù)的日期格式spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8# JSON數(shù)據(jù)屬性為null時(shí)不返回spring.jackson.default-property-inclusion=non_null# 找不到資源404時(shí)拋出異常spring.mvc.throw-exception-if-no-handler-found=true# 禁用靜態(tài)資源的自動(dòng)映射,如不禁用,不存在的url將被映射到/**,servlet不有機(jī)會(huì)拋出異常#spring.resources.add-mappings=false# get請(qǐng)求參數(shù)及表單提交數(shù)據(jù)的日期格式spring.mvc.date-format=yyyy-MM-dd HH:mm:ss# 應(yīng)用/項(xiàng)目的部署路徑,默認(rèn)為/#server.servlet.context-path=/lucky-draw# SpringMVC中,DispatcherServlet的映射路徑,默認(rèn)為/**#spring.mvc.servlet.path=/**# 靜態(tài)資源映射:將路徑映射為/,即/static/xxx,映射為/xxx,支持多個(gè)字符串,逗號(hào)間隔# 默認(rèn)為/META-INF/resources/, /resources/, /static/, /public/#spring.resources.static-locations=/static/,/public/#====================要根據(jù)具體數(shù)據(jù)庫(kù)配置......的部分開始====================#druid數(shù)據(jù)庫(kù)連接池配置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#====================要根據(jù)具體數(shù)據(jù)庫(kù)配置......的部分結(jié)束====================##mapper##mappers 多個(gè)接口時(shí)逗號(hào)隔開##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ù)據(jù)庫(kù)方言:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby#pagehelper.helperDialect=mysql##默認(rèn)值為 false,該參數(shù)對(duì)使用 RowBounds 作為分頁(yè)參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為 true 時(shí),會(huì)將 RowBounds 中的 offset 參數(shù)當(dāng)成 pageNum 使用,可以用頁(yè)碼和頁(yè)面大小兩個(gè)參數(shù)進(jìn)行分頁(yè)。##pagehelper.offset-as-page-num=falses##默認(rèn)值為false,該參數(shù)對(duì)使用 RowBounds 作為分頁(yè)參數(shù)時(shí)有效。 當(dāng)該參數(shù)設(shè)置為true時(shí),使用 RowBounds 分頁(yè)會(huì)進(jìn)行 count 查詢。#pagehelper.row-bounds-with-count=true##默認(rèn)值為 false,當(dāng)該參數(shù)設(shè)置為 true 時(shí),如果 pageSize=0 或者 RowBounds.limit = 0 就會(huì)查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁(yè)查詢,但是返回結(jié)果仍然是 Page 類型)。##pagehelper.page-size-zero=false##分頁(yè)合理化參數(shù),默認(rèn)值為false。當(dāng)該參數(shù)設(shè)置為 true 時(shí),pageNum<=0 時(shí)會(huì)查詢第一頁(yè), pageNum>pages(超過(guò)總數(shù)時(shí)),會(huì)查詢最后一頁(yè)。默認(rèn)false 時(shí),直接根據(jù)參數(shù)進(jìn)行查詢。#pagehelper.reasonable=true##為了支持startPage(Object params)方法,增加了該參數(shù)來(lái)配置參數(shù)映射,用于從對(duì)象中根據(jù)屬性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認(rèn)值, 默認(rèn)值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。#pagehelper.params=pageNum=pageNumber;pageSize=pageSize;count=countSql;reasonable=reasonable;##支持通過(guò) Mapper 接口參數(shù)來(lái)傳遞分頁(yè)參數(shù),默認(rèn)值false,分頁(yè)插件會(huì)從查詢方法的參數(shù)值中,自動(dòng)根據(jù)上面 params 配置的字段中取值,查找到合適的值時(shí)就會(huì)自動(dòng)分頁(yè)。 使用方法可以參考測(cè)試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。##pagehelper.supportMethodsArguments=true##用于控制默認(rèn)不帶 count 查詢的方法中,是否執(zhí)行 count 查詢,默認(rèn) true 會(huì)執(zhí)行 count 查詢,這是一個(gè)全局生效的參數(shù),多數(shù)據(jù)源時(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> <!-- 默認(rèn)false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時(shí)把JDBC DECIMAL 和 NUMERIC 類型解析為java.math.BigDecimal --> <javaTypeResolver> <property name='forceBigDecimals' value='false' /> </javaTypeResolver> <!--MyBatis 生成器只需要生成 Model--> <javaModelGenerator targetProject='修改為自己的項(xiàng)目名/src/test/java' targetPackage='修改為實(shí)體類的包(model,在啟動(dòng)類的根包下)'><!-- <property name='rootClass' value='修改為實(shí)體類的父類'/>--> </javaModelGenerator> <!--mybatis 的xml文件地址--> <sqlMapGenerator targetProject='修改為自己的項(xiàng)目名/src/test/resources' targetPackage='修改為xml的包(mapper)'> <property name='enableSubPackages' value='true'/> </sqlMapGenerator> <!--mybatis的mapper接口--> <javaClientGenerator type='XMLMAPPER' targetProject='修改為自己的項(xiàng)目名/src/test/java' targetPackage='修改為mapper的包(在啟動(dòng)類的根包下)'> <property name='enableSubPackages' value='true'/><!-- <property name='rootInterface' value='修改為mapper的父接口'/>--> </javaClientGenerator> <!-- 需要生成的表,%表示模糊匹配,也可以指定具體的表名 --><!-- <table tableName='%'--><!--enableCountByExample='false'--><!--enableDeleteByExample='false'--><!--enableSelectByExample='false'--><!--enableUpdateByExample='false'--><!-- >--> <table tableName='%'> <!-- insert方法通過(guò)自增主鍵插入數(shù)據(jù)后,主鍵值是否設(shè)置到對(duì)象屬性中 --> <!-- <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>

如果不知道路徑可以自己打印一下當(dāng)前項(xiàng)目的絕對(duì)路徑

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) { //打印當(dāng)前項(xiàng)目的絕對(duì)路徑 System.out.println(new File('').getAbsolutePath()); }}

在test目錄下創(chuàng)建resources包

JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis

將application.properties和config.xml自己配置完畢就可以在Generator中運(yùn)行 最后把test目錄下生成的model和mapper復(fù)制到源文件的啟動(dòng)目錄的包下 把resources目錄下生成的mapper復(fù)制到源文件的resources目錄下 在啟動(dòng)文件中加

@MapperScan(basePackages = '啟動(dòng)類的根包名.mapper')

給mapper的每個(gè)文件增加注解

@Mapper

總結(jié)

到此這篇關(guān)于JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis的文章就介紹到這了,更多相關(guān)JavaEE Spring MyBatis是什么它和Hibernate的區(qū)別內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 最新中文字幕久久 | 亚洲精品第一 | 欧美美女一区二区 | 99视频免费在线观看 | 国产精品视频免费观看 | 日韩精品一区二区三区 | 日韩在线一区二区三区 | 一区二区免费 | 亚洲精品影院 | 在线观看亚洲 | 岛国av免费观看 | 97精品超碰一区二区三区 | 日韩www | 精品一区二区三区在线视频 | 国产视频观看 | 视频一区二区在线观看 | 成人精品国产 | 91精品国产欧美一区二区 | 亚洲精品亚洲人成人网 | 久久国产精品-国产精品 | 羞羞视频在线观看 | 成人亚洲片 | 午夜影院在线免费观看视频 | 日韩伦理一区二区 | 久久精品国产亚洲 | 一区二区视频免费观看 | 日日欧美 | 欧美精品片 | 国产无人区一区二区三区 | 一级毛片免费 | 国产精品一二三区在线观看 | 国产精品国色综合久久 | 国产精品爱久久久久久久 | 久久久精品一区二区三区 | 精品免费国产一区二区三区四区 | 精品久久久久久亚洲精品 | 精品国产精品国产偷麻豆 | 亚洲欧美日韩激情 | 亚洲国产一区二区三区在线观看 | 中文字幕一区二区三区四区五区 | 亚洲精品久久久一区二区三区 |