一,MaBatis是什么?
? ?首先是一個(gè)開源的Java持久化框架,它可以幫助開發(fā)人員簡(jiǎn)化數(shù)據(jù)庫(kù)訪問(wèn)的過(guò)程并提供了一種將SQL語(yǔ)句與Java代碼進(jìn)行解耦的方式,使得開發(fā)人員可以更加靈活地進(jìn)行數(shù)據(jù)庫(kù)操作。
1.1 Mabatis 受歡迎的點(diǎn)
MyBatis不僅是開源框架,也給我們帶來(lái)了許多好處的點(diǎn),如下:
1.1.1簡(jiǎn)化數(shù)據(jù)庫(kù)操作
? ?MyBatis提供了一種簡(jiǎn)單而直觀的方式來(lái)執(zhí)行數(shù)據(jù)庫(kù)操作,開發(fā)人員只需要編寫SQL語(yǔ)句,并通過(guò)映射文件將SQL語(yǔ)句與Java對(duì)象進(jìn)行映射,就可以完成數(shù)據(jù)庫(kù)的增刪改查操作。
1.1.2靈活性:
? ? ?MyBatis允許開發(fā)人員編寫原生的SQL語(yǔ)句,這意味著你可以完全控制SQL語(yǔ)句的編寫和執(zhí)行過(guò)程。這種靈活性使得開發(fā)人員可以根據(jù)具體的需求進(jìn)行優(yōu)化和調(diào)整,從而提高數(shù)據(jù)庫(kù)操作的性能。
1.1.3易于集成:
? ? MyBatis可以與各種主流的Java框架(如Spring)進(jìn)行集成,使得開發(fā)人員可以更加方便地使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)操作。
1.2 優(yōu)缺點(diǎn)
一個(gè)框架當(dāng)然也有優(yōu)點(diǎn)和缺點(diǎn),以下幾點(diǎn)大家可以自行理解
優(yōu)點(diǎn):
提高開發(fā)效率:
? ? MyBatis簡(jiǎn)化了數(shù)據(jù)庫(kù)操作的過(guò)程,使得開發(fā)人員可以更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),從而提高開發(fā)效率。
靈活性和可維護(hù)性:
? ?MyBatis允許開發(fā)人員編寫原生的SQL語(yǔ)句,這使得數(shù)據(jù)庫(kù)操作更加靈活,并且易于維護(hù)和調(diào)試。
性能優(yōu)化:
? MyBatis允許開發(fā)人員對(duì)SQL語(yǔ)句進(jìn)行優(yōu)化,從而提高數(shù)據(jù)庫(kù)操作的性能。
缺點(diǎn):
學(xué)習(xí)曲線較陡:
? ? 相對(duì)于其他ORM框架,MyBatis 的學(xué)習(xí)曲線可能較陡峭。使用 MyBatis 需要熟悉 SQL 語(yǔ)句的編寫和數(shù)據(jù)庫(kù)操作的細(xì)節(jié),對(duì)于沒(méi)有相關(guān)經(jīng)驗(yàn)的開發(fā)人員來(lái)說(shuō)可能需要一些時(shí)間來(lái)適應(yīng)。
配置復(fù)雜:
? ?MyBatis 的配置文件相對(duì)較為復(fù)雜,需要開發(fā)人員手動(dòng)編寫和維護(hù)。這可能增加了一些額外的工作量和出錯(cuò)的可能性。
缺乏自動(dòng)化功能:
? ? 相對(duì)于一些全自動(dòng)化的 ORM 框架,MyBatis 需要開發(fā)人員手動(dòng)編寫 SQL 語(yǔ)句和映射文件。這意味著開發(fā)人員需要更多地關(guān)注數(shù)據(jù)庫(kù)操作的細(xì)節(jié),可能會(huì)增加一些開發(fā)工作量。
不適合簡(jiǎn)單的 CRUD 操作:
?對(duì)于一些簡(jiǎn)單的 CRUD(增刪改查)操作,MyBatis 可能顯得有些繁瑣。相比之下,一些全自動(dòng)化的 ORM 框架可能更適合處理這些簡(jiǎn)單的操作
二,搭建MyBatis的壞境
2.1 創(chuàng)建maven工程
注意:一定要聯(lián)網(wǎng),因?yàn)閯?chuàng)建Maven項(xiàng)目要下載相關(guān)的插件
?
2.2 導(dǎo)入相關(guān)pom依賴
?1 將properties及dependencies標(biāo)簽 替換成以下xml代碼
<properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <!-- ********************** junit單元測(cè)試依賴 ********************** --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- ********************** Java Servlet API ********************** --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <scope>provided</scope> </dependency> <!-- ********************** Mybatis依賴 ********************** --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- ********************** Mysql JDBC驅(qū)動(dòng) ********************** --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> <!-- ********************** 日志配置 ********************** --> <!--記得修改mybatis.cfg.xml添加如下內(nèi)容--> <!--<setting name="logImpl" value="LOG4J2"/>--> <!--核心log4j2jar包--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.9.1</version> </dependency> <!--web工程需要包含log4j-web,非web工程不需要--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <version>2.9.1</version> </dependency> </dependencies>
2 將<build>標(biāo)簽中的</pluginManagement>給刪掉或注釋掉(解除版本鎖定)
3 在<build>標(biāo)簽中添加下述代碼xml
<resources> <!--解決mybatis-generator-maven-plugin運(yùn)行時(shí)沒(méi)有將XxxMapper.xml文件放入target文件夾的問(wèn)題--> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> <!--解決mybatis-generator-maven-plugin運(yùn)行時(shí)沒(méi)有將jdbc.properites文件放入target文件夾的問(wèn)題--> <resource> <directory>src/main/resources</directory> <includes> <include>jdbc.properties</include> <include>*.xml</include> </includes> </resource> </resources>
4 將 <plugins>標(biāo)簽下的<plugin>標(biāo)簽換成以下xml代碼
<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <dependencies> <!--使用Mybatis-generator插件不能使用太高版本的mysql驅(qū)動(dòng) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.44</version> </dependency> </dependencies> <configuration> <overwrite>true</overwrite> </configuration> </plugin>
2.3 Mybatis相關(guān)插件安裝
我們知道Mybatis是一款有關(guān)于數(shù)據(jù)庫(kù)的框架,所以我們還需要導(dǎo)入關(guān)于數(shù)據(jù)庫(kù)連接的配置文件
在resources包中創(chuàng)建File文件,將以下代碼copy上去
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8 jdbc.username=mybatis_ssm jdbc.password=123456
修改web.xml中的文件配置
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>Archetype Created Web Application</display-name> </web-app>
安裝四款插件:
1 MaBatisX
?2 Mybatia Generator
? 3 Mybatis Tools
?
4 Maven helper
安裝完畢插件,接下來(lái)就是Mytatis的相關(guān)配置
2.4 Mybatis.cfg.xml配置
眾所周知,一款框架必定有自己的配置文件,Mybatis也是一樣有配置文件
? Mybatis.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 引入外部配置文件 --> <properties resource="jdbc.properties"/> <settings> <setting name="logImpl" value="LOG4J2"/> </settings> <!-- 別名 --> <typeAliases> <!--<typeAlias type="com.javaxl.model.Book" alias="Book"/>--> </typeAliases> <!-- 配置mybatis運(yùn)行環(huán)境 --> <environments default="development"> <environment id="development"> <!-- type="JDBC" 代表使用JDBC的提交和回滾來(lái)管理事務(wù) --> <transactionManager type="jdbc"/> <!-- mybatis提供了3種數(shù)據(jù)源類型,分別是:POOLED,UNPOOLED,JNDI --> <!-- POOLED 表示支持JDBC數(shù)據(jù)源連接池 --> <!-- UNPOOLED 表示不支持?jǐn)?shù)據(jù)源連接池 --> <!-- JNDI 表示支持外部數(shù)據(jù)源連接池 --> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <!-- <mapper resource="com/javaxl/mapper/BookMapper.xml"/>--> </mappers> </configuration>
?創(chuàng)建 generatorConfig.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="jdbc.properties"/> <!--指定數(shù)據(jù)庫(kù)jdbc驅(qū)動(dòng)jar包的位置--> <classPathEntry location="D:\\initPath\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/> <!-- 一個(gè)數(shù)據(jù)庫(kù)一個(gè)context --> <context id="infoGuardian"> <!-- 注釋 --> <commentGenerator> <property name="suppressAllComments" value="true"/><!-- 是否取消注釋 --> <property name="suppressDate" value="true"/> <!-- 是否生成注釋代時(shí)間戳 --> </commentGenerator> <!-- jdbc連接 --> <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/> <!-- 類型轉(zhuǎn)換 --> <javaTypeResolver> <!-- 是否使用bigDecimal, false可自動(dòng)轉(zhuǎn)化以下類型(Long, Integer, Short, etc.) --> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 01 指定javaBean生成的位置 --> <!-- targetPackage:指定生成的model生成所在的包名 --> <!-- targetProject:指定在該項(xiàng)目下所在的路徑 --> <javaModelGenerator targetPackage="com.javaxl.model" targetProject="src/main/java"> <!-- 是否允許子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> <!-- 是否對(duì)model添加構(gòu)造函數(shù) --> <property name="constructorBased" value="true"/> <!-- 是否針對(duì)string類型的字段在set的時(shí)候進(jìn)行trim調(diào)用 --> <property name="trimStrings" value="false"/> <!-- 建立的Model對(duì)象是否 不可改變 即生成的Model對(duì)象不會(huì)有 setter方法,只有構(gòu)造方法 --> <property name="immutable" value="false"/> </javaModelGenerator> <!-- 02 指定sql映射文件生成的位置 --> <sqlMapGenerator targetPackage="com.javaxl.mapper" targetProject="src/main/java"> <!-- 是否允許子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- 03 生成XxxMapper接口 --> <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper對(duì)象 --> <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相應(yīng)的Mapper對(duì)象 --> <!-- type="XMLMAPPER",生成SQLMap XML文件和獨(dú)立的Mapper接口 --> <javaClientGenerator targetPackage="com.javaxl.mapper" targetProject="src/main/java" type="XMLMAPPER"> <!-- 是否在當(dāng)前路徑下新加一層schema,false路徑com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] --> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 配置表信息 --> <!-- schema即為數(shù)據(jù)庫(kù)名 --> <!-- tableName為對(duì)應(yīng)的數(shù)據(jù)庫(kù)表 --> <!-- domainObjectName是要生成的實(shí)體類 --> <!-- enable*ByExample是否生成 example類 --> <!--<table schema="" tableName="t_book" domainObjectName="Book"--> <!--enableCountByExample="false" enableDeleteByExample="false"--> <!--enableSelectByExample="false" enableUpdateByExample="false">--> <!--<!– 忽略列,不生成bean 字段 –>--> <!--<!– <ignoreColumn column="FRED" /> –>--> <!--<!– 指定列的java數(shù)據(jù)類型 –>--> <!--<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>--> <!--</table>--> <table schema="" tableName="t_mvc_Book" domainObjectName="Book" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false"> <!-- 忽略列,不生成bean 字段 --> <!-- <ignoreColumn column="FRED" /> --> <!-- 指定列的java數(shù)據(jù)類型 --> <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> --> </table> </context> </generatorConfiguration>
修改 generatorConfig.xml文件
①修改Mysql驅(qū)動(dòng)的位置
找到 指定數(shù)據(jù)庫(kù)jdbc驅(qū)動(dòng)jar包的位置?mysql-connector-java\5.1.44 該jar
復(fù)制上面jar路徑,修改generatorConfig.xml中的文件的路徑?<classPathEntry>標(biāo)簽,復(fù)制上去之后要在每個(gè) \斜杠多打一個(gè)斜杠,如果這個(gè)路徑錯(cuò)了不會(huì)給你生成相對(duì)應(yīng)的代碼
?②修改JavaBean生成的位置
?③修改SQL對(duì)應(yīng)的配置文件的生成地址?
?④修改Dao層代碼地址的生成地址?
⑤修改指定需要生成增刪改查代碼對(duì)應(yīng)的表?
?如果你想一次性生成多個(gè)那么你就復(fù)制多個(gè)table出來(lái),修改對(duì)應(yīng)的sql腳本名即可
雙擊我們下載好的插件執(zhí)行生成代碼即可
雙擊之后等待自動(dòng)創(chuàng)建所需要的包和類,自動(dòng)生成如下:
?
三、結(jié)合Mybatis生成代碼完成增刪改查
①創(chuàng)建一個(gè)util包和一個(gè)SessionUtil類
SessionUtil類:
package com.Bing.util; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * @author 小李飛刀 * @site www.javaxl.com * @company xxx公司 * @create 2023-8-21 */ public class SessionUtil { private static SqlSessionFactory sessionFactory; private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); static { sessionFactory = new SqlSessionFactoryBuilder().build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml")); } public static SqlSession openSession() { SqlSession session = threadLocal.get(); if (null == session) { session = sessionFactory.openSession(); threadLocal.set(session); } return session; } public static void main(String[] args) { SqlSession session = openSession(); System.out.println(session.getConnection()); session.close(); // System.out.println(session.getConnection()); } }
②創(chuàng)建biz層和BookBiz接口(直接拷貝mapper生成的即可)
package com.Bing.biz; import com.Bing.model.Book; public interface BookBiz { int deleteByPrimaryKey(Integer bid); int insert(Book record); int insertSelective(Book record); Book selectByPrimaryKey(Integer bid); int updateByPrimaryKeySelective(Book record); int updateByPrimaryKey(Book record); }
③創(chuàng)建impl層用bookbizimpl實(shí)現(xiàn)BookBiz
package com.Bing.biz.impl; import com.Bing.biz.BookBiz; import com.Bing.mapper.BookMapper; import com.Bing.model.Book; /** * @Name BingBing * @company zking cy * @create 2023-08-21-11:30 */ public class BookBizImpl implements BookBiz { private BookMapper bookMapper; @Override public int deleteByPrimaryKey(Integer bid) { return bookMapper.deleteByPrimaryKey(bid); } @Override public int insert(Book record) { return bookMapper.insert(record); } @Override public int insertSelective(Book record) { return bookMapper.insertSelective(record); } @Override public Book selectByPrimaryKey(Integer bid) { return bookMapper.selectByPrimaryKey(bid); } @Override public int updateByPrimaryKeySelective(Book record) { return bookMapper.updateByPrimaryKeySelective(record); } @Override public int updateByPrimaryKey(Book record) { return bookMapper.updateByPrimaryKey(record); } }
④測(cè)試
注釋Junit的
<scope>
標(biāo)簽用于指定依賴的范圍表示該依賴在編譯、測(cè)試和運(yùn)行時(shí)都有效。
?測(cè)試類:
package com.Bing.Demo; import com.Bing.biz.BookBiz; import com.Bing.biz.impl.BookBizImpl; import com.Bing.mapper.BookMapper; import com.Bing.util.SessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @Name BingBing * @company zking cy * @create 2023-08-21-11:37 */ public class demo1 { private SqlSession sqlSession; private BookBiz bookBiz; @Before public void setUp() throws Exception { BookBizImpl bookBiz= new BookBizImpl();//實(shí)例化 System.out.println("初始化方法..."); //工具類中獲取session對(duì)象 sqlSession = SessionUtil.openSession(); //從session對(duì)象中獲取mapper對(duì)象 BookMapper mapper = sqlSession.getMapper(BookMapper.class); bookBiz.setBookMapper(mapper); this.bookBiz=bookBiz; } @After public void tearDown() throws Exception { System.out.println("方法測(cè)試結(jié)束。。"); sqlSession.commit(); } @Test public void deleteByPrimaryKey() { System.out.println("測(cè)試刪除業(yè)務(wù)方法"); bookBiz.deleteByPrimaryKey(32); } @Test public void selectByPrimaryKey() { System.out.println("測(cè)試的查詢業(yè)務(wù)方法。。。"); //System.out.println(bookBiz.getBookMapper()); System.out.println(bookBiz.selectByPrimaryKey(45)); } }
這樣會(huì)運(yùn)行報(bào)錯(cuò),是getMapper沒(méi)有值,這時(shí)候我們想起來(lái),前面因?yàn)檫€沒(méi)生成代碼,為了防止報(bào)錯(cuò)我們將<mappers>里面的配置映射文件內(nèi)容注釋掉了,現(xiàn)在我們更改回來(lái)。
現(xiàn)在我們來(lái)操作將編號(hào)為38刪除
運(yùn)行 deleteByPrimaryKey 方法
數(shù)據(jù)庫(kù)結(jié)果:
運(yùn)行 selectByPrimaryKey 查詢方法
查詢結(jié)果:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-662395.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-662395.html
到了這里,關(guān)于MyBatis的基本入門及Idea搭建MyBatis壞境且如何一步驟實(shí)現(xiàn)增刪改查(CRUD)---詳細(xì)介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!