如何使用MyBatis框架實(shí)現(xiàn)增刪改查(CRUD)操作
mybatis 介紹
- mybatis 本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis,
2010年這個(gè)項(xiàng)目由apache遷移到了googlecode,并且改名為MyBatis,2013年11月遷移到Github。 - MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。
- MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。
- MyBatis 可以使用簡(jiǎn)單的 XML 或注解來(lái)配置和映射原生信息,將接口和 Java 的 POJOs(普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄
Mybatis官方文檔 :
http://www.mybatis.org/mybatis-3/zh/index.html
GitHub :https://github.com/mybatis/mybatis-3
代碼演示
- 所需環(huán)境
- jdk1.8.0_91
- mysql-5.7.29
- apache-maven-3.6.3
- 創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(20) NOT NULL, `name` varchar(30) DEFAULT NULL, `pwd` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user`(`id`,`name`,`pwd`) values (1,'張三','123456'),(2,'李四','abcdef'),(3,'王五','987654');
- 使用idea創(chuàng)建項(xiàng)目并導(dǎo)入導(dǎo)入mybatis所需jar包
<dependencies> <!--mysql驅(qū)動(dòng)--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!--mybatis包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!--junit 測(cè)試包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
- 編寫(xiě)mybatis核心配置文件
該配置文件主要是配置連接mysql的基本信息及注冊(cè)mapper(具體配置參考官方文檔)
<?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/xiezhr/Dao/UserMapper.xml"></mapper> </mappers> </configuration>
- 編寫(xiě)mybatis工具類(lèi)
查看官方文檔,我們這里要封裝一個(gè)工具類(lèi)生成SqlSession對(duì)象,SqlSession用于后面的執(zhí)行sql
package com.xiezhr.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MysqlUtil { private static SqlSessionFactory sqlSessionFactory; static { String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }
- 創(chuàng)建對(duì)應(yīng)數(shù)據(jù)庫(kù)表的實(shí)體類(lèi)
各個(gè)屬性得命名必須與數(shù)據(jù)庫(kù)字段一一對(duì)應(yīng),具體如下所示,數(shù)據(jù)庫(kù)對(duì)應(yīng)字段為id,name,pwd
package com.xiezhr.pojo; public class User { private int id; private String name; private String pwd; public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
- 編寫(xiě)Mapper接口
該接口對(duì)應(yīng)原來(lái)的dao,具體代碼如下
package com.xiezhr.dao; import com.xiezhr.pojo.User; import java.util.List; public interface UserMapper { List<User> getUserList(); }
- 編寫(xiě)Mapper.xml 文件
由于我們使用了mybatis,所以這的xml文件相當(dāng)于我們?cè)瓉?lái)dao得實(shí)現(xiàn)類(lèi)daoimpl。namespace屬性對(duì)應(yīng)著接口,不能寫(xiě)錯(cuò),標(biāo)簽表示是個(gè)查詢(xún)語(yǔ)句。id 屬性對(duì)應(yīng)著接口的方法,result Type代表返回得類(lèi)型,即對(duì)應(yīng)這pojo實(shí)體。具體代碼如下
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xiezhr.dao.UserMapper"> <select id="getUserList" resultType="com.xiezhr.pojo.User"> select * from mybatis.user; </select> </mapper>
- 到這一步我們第一個(gè)mybatis實(shí)現(xiàn)查詢(xún)就基本大功告成了,接下來(lái)就要編寫(xiě)測(cè)試類(lèi)測(cè)試我們寫(xiě)得代碼
package com.xiezhr.dao; import com.xiezhr.pojo.User; import com.xiezhr.util.MysqlUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class TestUserDao { @Test public void selectUser(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } } }
經(jīng)過(guò)測(cè)試后輸出測(cè)試結(jié)果
D:\Java\jdk1.8.0_91\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54576:D:\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar;D:\JetBrains\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit5-rt.jar;D:\JetBrains\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit-rt.jar;D:\Java\jdk1.8.0_91\jre\lib\charsets.jar;D:\Java\jdk1.8.0_91\jre\lib\deploy.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_91\jre\lib\javaws.jar;D:\Java\jdk1.8.0_91\jre\lib\jce.jar;D:\Java\jdk1.8.0_91\jre\lib\jfr.jar;D:\Java\jdk1.8.0_91\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_91\jre\lib\jsse.jar;D:\Java\jdk1.8.0_91\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_91\jre\lib\plugin.jar;D:\Java\jdk1.8.0_91\jre\lib\resources.jar;D:\Java\jdk1.8.0_91\jre\lib\rt.jar;F:\workspace_idea\Mybatis-test\mybatis-01\target\test-classes;F:\workspace_idea\Mybatis-test\mybatis-01\target\classes;D:\maven\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;D:\maven\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;D:\maven\repository\junit\junit\4.12\junit-4.12.jar;D:\maven\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.xiezhr.dao.TestUserDao,selectUser Tue Apr 14 22:54:48 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. User{id=1, name='張三', pwd='322334'} User{id=2, name='李四', pwd='123456'} User{id=3, name='王五', pwd='123456'}
擴(kuò)展
- 根據(jù)id查詢(xún)用戶
- 1.在UserMapper接口中添加相應(yīng)的方法selectUserById(id)
public interface UserMapper { //根據(jù)ID查詢(xún)用戶 User selectUserById(int id); }
- 2.在UserMapper.xml 中添加相應(yīng)select 語(yǔ)句
<mapper namespace="com.xiezhr.dao.UserMapper"> <select id="selectUserById" parameterType="int" resultType="com.xiezhr.pojo.User"> select * from mybatis.user where id = #{id} </select> </mapper>
- 3.添加測(cè)試類(lèi)
@Test public void selectUserByid(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.selectUserById(1); System.out.println(user); }
測(cè)試通過(guò)
Wed Apr 15 23:08:00 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. User{id=1, name='張三', pwd='322334'}
- 根據(jù)用戶姓名密碼查詢(xún)用戶信息
- 1.在UserMapper接口中添加方法
public interface UserMapper { //根據(jù)用戶名密碼查詢(xún)用戶信息 User selectUserByNP(@Param("name") String name,@Param("pwd") String pwd); }
- 2.在UserMapper.xml 中添加select語(yǔ)句
<mapper namespace="com.xiezhr.dao.UserMapper"> <select id="selectUserByNP" resultType="com.xiezhr.pojo.User"> select * from mybatis.user where name=#{name} and pwd=#{pwd} </select> </mapper>
- 3.添加測(cè)試類(lèi)
@Test public void selectUserByNP(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.selectUserByNP("張三","322334"); System.out.println(user); }
測(cè)試成功
Wed Apr 15 23:24:02 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. User{id=1, name='張三', pwd='322334'}
以上通過(guò)用戶名和密碼查詢(xún)用戶,傳參還可以通過(guò)萬(wàn)能的map實(shí)現(xiàn),具體代碼如下
- 1.向UserMapper接口中添加方法
public interface UserMapper { //根據(jù)用戶名和密碼查詢(xún)用戶信息 User queryUserByNP(Map<String,Object> map); }
- 2.向UserMapper.xml 中添加select語(yǔ)句,其中參數(shù)類(lèi)型為map
<mapper namespace="com.xiezhr.dao.UserMapper"> <select id="queryUserByNP" parameterType="map" resultType="com.xiezhr.pojo.User"> select * from mybatis.user where name=#{name} and pwd=#{pwd} </select> </mapper>
- 添加測(cè)試,在使用過(guò)程中,map的key對(duì)應(yīng)著UserMapper.xml中取值,map在put值時(shí)候沒(méi)有先后順序
@Test public void queryUserByNp(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String,Object> map = new HashMap<String,Object>(); map.put("name","張三"); map.put("pwd","322334"); User user = mapper.queryUserByNP(map); System.out.println(user); }
- 模糊查詢(xún)實(shí)現(xiàn)
- 1.在Java代碼中添加sql通配符
string wildcardname = “%smi%”; list<name> names = mapper.selectlike(wildcardname); <select id=”selectlike”> select * from foo where bar like #{value} </select>
- 2.在sql語(yǔ)句中拼接通配符,會(huì)引起sql注入
string wildcardname = “smi”; list<name> names = mapper.selectlike(wildcardname); <select id=”selectlike”> select * from foo where bar like "%"#{value}"%" </select>
接下來(lái)我們分別來(lái)實(shí)現(xiàn)insert、update、delete
insert
- 在之前編寫(xiě)的UserMapper 接口中添加增加方法
public interface UserMapper { //添加一條用戶信息 int addUser(User user); }
2.在UserMapper.xml 中寫(xiě)insert 語(yǔ)句
<insert id="addUser" parameterType="com.xiezhr.pojo.User"> insert into mybatis.user values(#{id},#{name},#{pwd}) </insert>
- 添加測(cè)試類(lèi)
insert、update、delete 一定要提交事務(wù),千萬(wàn)千萬(wàn)不能忘記了
@Test public void addUser(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(4, "大頭兒子", "123456"); mapper.addUser(user); sqlSession.commit(); //增刪改一定要提交事務(wù) sqlSession.close(); }
update
- 在之前編寫(xiě)的UserMapper 接口中添加update方法
public interface UserMapper { //修改一條記錄 int updateUserById(int id); }
2.在UserMapper.xml 中寫(xiě)insert 語(yǔ)句
<update id="updateUserById" parameterType="int"> update mybatis.user set name='小頭爸爸' where id=#{id} </update>
- 添加測(cè)試類(lèi)
insert、update、delete 一定要提交事務(wù),千萬(wàn)千萬(wàn)不能忘記了
@Test public void updateUserById(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updateUserById(4); sqlSession.commit(); //增刪改一定要提交事務(wù) sqlSession.close(); }
delete
- 在之前編寫(xiě)的UserMapper 接口中添加delete方法
public interface UserMapper { //根據(jù)ID刪除一條記錄 int deleteUserById(int id); } }
2.在UserMapper.xml 中寫(xiě)insert 語(yǔ)句
<delete id="deleteUserById" parameterType="int"> delete from mybatis.user where id=#{id} </delete>
- 添加測(cè)試類(lèi)
insert、update、delete 一定要提交事務(wù),千萬(wàn)千萬(wàn)不能忘記了
@Test public void deletUserById(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUserById(4); sqlSession.commit(); //增刪改一定要提交事務(wù) sqlSession.close(); }
注意
- 所有的insert、update、delete 必須要提交事務(wù)
- 接口中所有的普通參數(shù)盡量寫(xiě)上@Param 參數(shù),尤其是多個(gè)參數(shù)的時(shí)候一定要寫(xiě)上
- 有些時(shí)候由于業(yè)務(wù)需要需要可通過(guò)map傳值
- 為了規(guī)范在sql配置文件中即本例的UserMapper.xml 中select inset delete update 盡量寫(xiě)上Parameter參數(shù)和resultType
可能出現(xiàn)問(wèn)題說(shuō)明:Maven靜態(tài)資源過(guò)濾問(wèn)題
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
在靜態(tài)資源的過(guò)濾中,基本的元素有三種:
- directory:指定資源所在的目錄,這個(gè)目錄的路徑是相對(duì)于pom.xml文件;
- includes:指定要包含哪些文件,其中包括inlcude子節(jié)點(diǎn)來(lái)指定匹配的模式;
- excludes:指定要排除哪些文件,其中包括exclude子節(jié)點(diǎn)來(lái)指定匹配的模式;
- filtering:指定哪些文件需要過(guò)濾,這個(gè)過(guò)濾的目的是為了替換其中的占位符${},其中的占位符屬性在pom.xml文件中的中指定;
MyBatis是一款優(yōu)秀的持久層框架,它可以幫助我們簡(jiǎn)化數(shù)據(jù)庫(kù)操作的代碼。本文介紹了MyBatis框架的基本概念和使用方法,以及如何使用MyBatis實(shí)現(xiàn)增刪改查操作。在使用MyBatis進(jìn)行開(kāi)發(fā)時(shí),需要注意一些細(xì)節(jié)問(wèn)題,比如如何處理事務(wù)、如何使用Mapper接口等。此外,MyBatis還提供了一些高級(jí)特性,比如動(dòng)態(tài)SQL、緩存等,可以幫助我們更加靈活地進(jìn)行數(shù)據(jù)庫(kù)操作。MyBatis是一款非常優(yōu)秀的持久層框架,值得我們深入學(xué)習(xí)和使用。
到此這篇關(guān)于如何使用MyBatis框架實(shí)現(xiàn)增刪改查(CRUD)操作的文章就介紹到這了,更多相關(guān)mybatis實(shí)現(xiàn)增刪改查CRUD內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot的HTTPS配置實(shí)現(xiàn)
本文主要介紹了SpringBoot的HTTPS配置實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Spring集成MyBatis和PageHelper分頁(yè)插件整合過(guò)程詳解
Spring?整合?MyBatis?是將?MyBatis?數(shù)據(jù)訪問(wèn)框架與?Spring?框架進(jìn)行集成,以實(shí)現(xiàn)更便捷的開(kāi)發(fā)和管理,在集成過(guò)程中,Spring?提供了許多特性和功能,如依賴(lài)注入、聲明式事務(wù)管理、AOP?等,這篇文章主要介紹了Spring集成MyBatis和PageHelper分頁(yè)插件整合,需要的朋友可以參考下2023-08-08Java堆空間爆滿導(dǎo)致宕機(jī)的問(wèn)題分析及解決
團(tuán)隊(duì)有一個(gè)服務(wù),一直運(yùn)行的好好的,突然訪問(wèn)異常了,先是請(qǐng)求超時(shí),然后直接無(wú)法訪問(wèn),本文將給大家介紹Java堆空間爆滿導(dǎo)致宕機(jī)的問(wèn)題分析及解決,需要的朋友可以參考下2024-02-02詳細(xì)講述Java中的對(duì)象轉(zhuǎn)型
在本篇文章里我們給大家詳細(xì)分享了關(guān)于Java中的對(duì)象轉(zhuǎn)型的知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2018-10-10Java語(yǔ)法基礎(chǔ)之運(yùn)算符學(xué)習(xí)筆記分享
這篇文章主要為大家分享了Java語(yǔ)法基礎(chǔ)之運(yùn)算符學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09