成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

MyBatis

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

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

首先要知道ORM框架, 簡單來說就是通過實例對象的語法, 完成關(guān)系型數(shù)據(jù)庫的操作的一種框架, 是 對象-關(guān)系 映射, 也就是把數(shù)據(jù)庫映射成對象

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

開發(fā)方面

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

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ù)選型時需考慮, 如果數(shù)據(jù)庫的設(shè)計上會有較大的, 頻繁的調(diào)整, 就是有MyBatis 如果需要做很多優(yōu)化工作 MyBatis也是更勝一籌

實現(xiàn)過程

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

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

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

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

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

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

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

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

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

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ù)據(jù)庫驅(qū)動包在編譯時沒有直接使用,但是運行時需要,所以使用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ù)庫連接池,同樣的運行時需要 --> <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è)置打印日志的級別,及打印sql語句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時不返回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ù)據(jù)的日期格式spring.mvc.date-format=yyyy-MM-dd HH:mm:ss# 應(yīng)用/項目的部署路徑,默認為/#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/#====================要根據(jù)具體數(shù)據(jù)庫配置......的部分開始====================#druid數(shù)據(jù)庫連接池配置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ù)庫配置......的部分結(jié)束====================##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ù)據(jù)庫方言:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby#pagehelper.helperDialect=mysql##默認值為 false,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當(dāng)該參數(shù)設(shè)置為 true 時,會將 RowBounds 中的 offset 參數(shù)當(dāng)成 pageNum 使用,可以用頁碼和頁面大小兩個參數(shù)進行分頁。##pagehelper.offset-as-page-num=falses##默認值為false,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當(dāng)該參數(shù)設(shè)置為true時,使用 RowBounds 分頁會進行 count 查詢。#pagehelper.row-bounds-with-count=true##默認值為 false,當(dāng)該參數(shù)設(shè)置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結(jié)果(相當(dāng)于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是 Page 類型)。##pagehelper.page-size-zero=false##分頁合理化參數(shù),默認值為false。當(dāng)該參數(shù)設(shè)置為 true 時,pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數(shù)時),會查詢最后一頁。默認false 時,直接根據(jù)參數(shù)進行查詢。#pagehelper.reasonable=true##為了支持startPage(Object params)方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值, 可以配置 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ù)值中,自動根據(jù)上面 params 配置的字段中取值,查找到合適的值時就會自動分頁。 使用方法可以參考測試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。##pagehelper.supportMethodsArguments=true##用于控制默認不帶 count 查詢的方法中,是否執(zhí)行 count 查詢,默認 true 會執(zhí)行 count 查詢,這是一個全局生效的參數(shù),多數(shù)據(jù)源時也是統(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ù)據(jù)后,主鍵值是否設(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>

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

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)前項目的絕對路徑 System.out.println(new File('').getAbsolutePath()); }}

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

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

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

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

給mapper的每個文件增加注解

@Mapper

總結(jié)

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

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
蜜臀精品一区二区三区在线观看| 久久99国产精品麻豆| 一区二区三区91| 欧美一区二区三区在线免费观看| 制服视频三区第一页精品| 日韩成人免费电影| 国产中文一区二区| 26uuu精品一区二区三区四区在线| 国产自产视频一区二区三区| 色婷婷综合久久久中文一区二区| 亚洲综合偷拍欧美一区色| 欧美日本二区| 久久精品欧美一区二区三区麻豆| 国产精品一区二区91| 欧美日韩国产一二三| 美女爽到高潮91| 在线视频欧美精品| 日韩电影在线观看电影| 久久久久久九九九九| 亚洲成a人v欧美综合天堂| 一本综合精品| 亚洲精品国产成人久久av盗摄| 国产在线视频欧美一区二区三区| 久久久电影一区二区三区| 成人三级伦理片| 欧美成人精精品一区二区频| 成人午夜在线视频| 欧美一级久久久| 岛国精品在线播放| 精品粉嫩aⅴ一区二区三区四区| 丰满少妇久久久久久久| 精品久久久久久久久久久久久久久| 丁香婷婷综合激情五月色| 欧美一级生活片| 国产成人午夜视频| 日韩免费一区二区| 国产超碰在线一区| 欧美一区二区三区免费大片| 国产成人免费视频网站高清观看视频 | 国产超碰在线一区| 精品国产伦一区二区三区观看体验| 丁香激情综合国产| 久久久久久久久久久久久久久99| 91麻豆视频网站| 日韩不卡一二三区| 色婷婷综合久久久中文一区二区| 青青草国产精品亚洲专区无| 一本到三区不卡视频| 蜜臀99久久精品久久久久久软件 | 在线观看免费亚洲| 国内精品视频一区二区三区八戒| 欧美一区二区三区在线看| 成人性生交大合| 欧美激情艳妇裸体舞| 亚洲无线视频| 亚洲国产精品人人做人人爽| 色婷婷av一区二区三区gif| 久久se精品一区精品二区| 日韩一级片在线观看| 91污在线观看| 国产精品嫩草影院av蜜臀| 91久久中文| 日本成人在线电影网| 在线综合亚洲欧美在线视频| 99视频精品全部免费在线| 国产精品国产自产拍高清av王其| 国产一区成人| 美女诱惑一区二区| 精品国产凹凸成av人导航| 国内自拍一区| 亚洲福利视频三区| 欧美精品乱码久久久久久按摩| av电影天堂一区二区在线观看| 国产精品欧美一级免费| 9色精品在线| 水野朝阳av一区二区三区| 欧美日韩国产综合视频在线观看| 波多野结衣一区二区三区 | 羞羞视频在线观看欧美| 国产综合色精品一区二区三区| 久久久五月婷婷| 国产精品视区| 久久99精品网久久| 久久欧美中文字幕| 亚洲女同同性videoxma| 久久国产精品无码网站| 国产视频在线观看一区二区三区| 在线观看的日韩av| 久久精品噜噜噜成人88aⅴ | 国产目拍亚洲精品99久久精品| 亚洲综合丁香| 国产精品性做久久久久久| 国产精品欧美久久久久无广告| 久久精品成人一区二区三区蜜臀| 高清久久久久久| 亚洲激情五月婷婷| 宅男在线国产精品| 亚洲精品在线二区| 国产精品911| 亚洲一区二区三区小说| 欧美电影在哪看比较好| 极品av少妇一区二区| 国内精品视频666| 亚洲男人天堂一区| 欧美一区二区三区视频在线观看| 激情欧美丁香| 国产尤物一区二区在线| 亚洲欧洲av色图| 91精品在线一区二区| 亚洲精品美女91| 懂色av一区二区三区免费观看| 亚洲制服丝袜一区| 久久久五月婷婷| 欧美日韩精品一区二区| av成人黄色| av成人动漫在线观看| 欧美a级一区二区| 综合中文字幕亚洲| 精品免费一区二区三区| 老司机精品视频网站| 欧美日韩国产欧| 国产乱码精品一区二区三区五月婷| 亚洲欧美激情插| 久久这里只有精品6| 欧美性高清videossexo| 亚洲综合欧美| 亚洲无线视频| a级高清视频欧美日韩| 久久成人免费网站| 亚洲国产日韩综合久久精品| xnxx国产精品| 欧美嫩在线观看| 麻豆av福利av久久av| 在线播放不卡| gogo大胆日本视频一区| 久久国产生活片100| 性做久久久久久免费观看| 中文字幕av免费专区久久| 日韩限制级电影在线观看| 久久久久久久欧美精品| 亚洲五月婷婷| 91丨porny丨最新| 国产精品996| 美国三级日本三级久久99| 亚洲国产欧美日韩另类综合| 国产色91在线| 日韩欧美一二三四区| 欧美日韩国产高清一区| 亚洲欧美电影在线观看| 好吊视频一区二区三区四区| 国产91在线看| 黄网站免费久久| 男女性色大片免费观看一区二区| 一区二区三区久久| 91美女视频网站| 成人黄色国产精品网站大全在线免费观看 | 成人激情校园春色| 国产精品影视在线| 久久99精品国产麻豆婷婷| 午夜精品久久久久久久99樱桃| 亚洲美腿欧美偷拍| 亚洲三级小视频| 成人欧美一区二区三区1314| 国产日韩欧美制服另类| 精品国产乱码久久久久久牛牛| 91精品啪在线观看国产60岁| 欧美日韩在线直播| 欧美亚日韩国产aⅴ精品中极品| 久久av最新网址| 一区二区国产日产| 亚洲精品在线视频观看| 亚洲精品色图| 日韩视频在线播放 | 欧美蜜桃一区二区三区| 在线精品视频小说1| 在线精品视频一区二区| 91福利视频网站| 欧美最新大片在线看| 欧美在线你懂得| 一本一道综合狠狠老| 久久婷婷国产综合尤物精品| 美女视频一区免费观看| 羞羞视频在线观看欧美| 六月婷婷久久| 在线免费观看日本欧美| 欧美午夜影院一区| 欧美三级蜜桃2在线观看| 欧美色综合影院| 欧美日韩精品一区二区天天拍小说 | 一区二区三区四区蜜桃| 亚洲乱码国产乱码精品精98午夜| 一区精品在线播放| 一区二区三区在线视频观看| 亚洲图片欧美色图| 午夜日韩在线观看| 美女视频黄 久久| 一区二区三区高清| 日韩中文欧美在线| 精品在线一区二区三区| 国产高清在线观看免费不卡|