目錄
一.Mybatis特性
二.常見持久層技術(shù)的比較
三.搭建Mybaits環(huán)境
四.使用Mybatis
?五.通過Mybatis實現(xiàn)增刪改
?六.實現(xiàn)數(shù)據(jù)庫的查詢操作
一.Mybatis特性
-
定制化SQL:MyBatis允許開發(fā)人員編寫、優(yōu)化和管理自定義的SQL語句,可以滿足復(fù)雜查詢和存儲過程等高級操作的需求。
-
避免JDBC代碼:MyBatis抽象了JDBC底層的繁瑣操作,開發(fā)人員無需手動設(shè)置參數(shù)和獲取結(jié)果集,通過配置文件或注解即可完成數(shù)據(jù)庫操作。
-
靈活的映射配置:MyBatis通過簡單的XML配置文件或者注解來實現(xiàn)對象與數(shù)據(jù)庫記錄之間的映射關(guān)系,將接口和Java的POJO對象映射到數(shù)據(jù)庫表中的記錄。
-
高度可定制:MyBatis提供了豐富的配置選項和插件機制,可以按照項目需求進行靈活的定制和擴展。開發(fā)人員可以根據(jù)具體情況選擇合適的配置方式。
二.常見持久層技術(shù)的比較
JDBC:
- 優(yōu)點:JDBC是Java連接數(shù)據(jù)庫的標(biāo)準(zhǔn)接口,具有廣泛的適應(yīng)性和靈活性??梢灾苯泳帉慡QL語句,對數(shù)據(jù)庫操作更為直觀。
- 缺點:需要在代碼中編寫和管理SQL語句,導(dǎo)致代碼與SQL耦合度高,難以維護和修改。開發(fā)效率較低,代碼冗長。
Hibernate和JPA:
- 優(yōu)點:操作簡便,開發(fā)效率高。通過對象關(guān)系映射(ORM)實現(xiàn)數(shù)據(jù)庫操作,屏蔽了底層SQL細(xì)節(jié),減少了手動編寫SQL的工作量。
- 缺點:對于復(fù)雜的SQL查詢,可能需要繞過框架,使用特定的查詢語言。自動生成的SQL語句可能不容易進行特殊優(yōu)化。在處理大量字段的POJO進行部分映射時會比較困難。反射操作較多可能導(dǎo)致數(shù)據(jù)庫性能下降。
MyBatis:
- 優(yōu)點:輕量級且性能出色,具有很高的執(zhí)行效率。SQL和Java代碼相分離,功能邊界清晰,Java代碼專注于業(yè)務(wù)邏輯,SQL語句專注于數(shù)據(jù)操作??梢造`活地編寫和優(yōu)化SQL語句。
- 缺點:相對于Hibernate,開發(fā)效率稍遜一些,需要手動編寫和管理SQL語句。
三.搭建Mybaits環(huán)境
使用工具Maven idea Mysql
1.配置
在maven的pom.xml中需要配置三個模塊,mysql-connect-java、mabatis、junit
配置如下:
<!-- mysql驅(qū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- mybatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
2.構(gòu)建連接數(shù)據(jù)庫的xml
?在resources中(如果沒有resource則創(chuàng)建一個)創(chuàng)建名稱為mybatis-config.xml的配置文件
配置內(nèi)容如下
<?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><!-- 配置 -->
<!-- 配置連接數(shù)據(jù)庫的環(huán)境-->
<environments default="development">
<!-- 設(shè)置環(huán)境id-->
<environment id="development">
<!-- 事務(wù)管理模式-->
<transactionManager type="JDBC"/>
<!-- 數(shù)據(jù)源類型-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- 配置url時候記得jdbc:mysql://localhost:3306后面加上的是選擇的具體數(shù)據(jù)庫-->
<!-- 我這里選擇我創(chuàng)建的mysqltest數(shù)據(jù)庫-->
<property name="url" value="jdbc:mysql://localhost:3306/mysqltest"/>
<!-- 輸入連接你的數(shù)據(jù)庫的名稱和密碼-->
<property name="username" value="mysql"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件-->
<mappers>
<!-- 這個暫時不需要設(shè)置默認(rèn)為空就行,在后面具體操作的時候再進行配置-->
<mapper resource=""/>
</mappers>
</configuration>
四.使用Mybatis
1.創(chuàng)建實體類
?在完成了搭建環(huán)境后,在Java下的com下創(chuàng)建目錄pojo,創(chuàng)建一個需要與數(shù)據(jù)庫映射對應(yīng)的類,比如創(chuàng)建一個用戶類
?創(chuàng)建好后設(shè)置好構(gòu)造函數(shù)、getter、toString,如下
package com.alphamilk.mybatis.pojo;
public class User {
// 設(shè)置名字
private String name;
// 設(shè)置年齡
private int age;
// 設(shè)置郵箱地址
private String email;
// 設(shè)置身份id
private int id;
public User(String name, int age, String email, int id) {
this.name = name;
this.age = age;
this.email = email;
this.id = id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getEmail() {
return email;
}
public int getId() {
return id;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
", id=" + id +
'}';
}
}
?2.在數(shù)據(jù)庫中創(chuàng)建同樣創(chuàng)建一樣的表
Sql語言如下:
create table table_user
(
name varchar(10) null,
age int null,
email varchar(20) null,
id int null
);
?3.創(chuàng)建業(yè)務(wù)接口類
首先在com下創(chuàng)建一個mapper包,里面再創(chuàng)建一個接口 創(chuàng)建映射接口(User對應(yīng)的就是UserMapper)
?4.創(chuàng)建接口實現(xiàn)映射
創(chuàng)建接口后,為了實現(xiàn)接口的功能,又需要實現(xiàn)java與sql的分離,則需要用xml配置實現(xiàn),在resource包下創(chuàng)建一個mappers包,寫一個對應(yīng)的xml
<?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">
<!--此處的namespace修改為對應(yīng)的接口-->
<mapper namespace="com.alphamilk.mybatis.mapper.UserMapper">
<!-- 配置實體類映射接口-->
<!-- 通過標(biāo)簽的設(shè)置就可以實現(xiàn)對應(yīng)的操作,insert標(biāo)簽對應(yīng)插入操作-->
<!-- 注意id需要與其作用的方法名稱對應(yīng),該方法在接口中名稱為public int insertUser();-->
<!-- 內(nèi)部寫對應(yīng)的sql語句-->
<insert id="insertUser">
insert into table_user value ('何生',20,'915@qq.com',001)
</insert>
</mapper>
5.實現(xiàn)接口映射后,就需要將映射的xml導(dǎo)入到mybatis-config.xml中
<mappers>
<!-- 這個暫時不需要設(shè)置默認(rèn)為空就行,在后面具體操作的時候再進行配置-->
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
5.最后創(chuàng)建測試類,測試Mybatis是否能夠正常運行
創(chuàng)建MybatisTest類
?內(nèi)容如下:
package com.alphamilk.mybatis;
import com.alphamilk.mybatis.mapper.UserMapper;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class MybatisTest {
@Test
public void Test() throws IOException {
// 創(chuàng)建核心輸入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 創(chuàng)建SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取SqlSessionFactory對象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 獲取Session會話對象,會話對象用以提供
SqlSession sqlSession = sqlSessionFactory.openSession();
// 創(chuàng)建動態(tài)代理對象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 通過代理對象調(diào)用方法insertUser
int result = mapper.insertUser();
// 執(zhí)行完后需要記得提交事務(wù),才會保留內(nèi)容到數(shù)據(jù)庫
sqlSession.commit();
// 執(zhí)行完后關(guān)閉會話對象
System.out.println(result);
sqlSession.close();
}
}
注意用的Resource是包org.aphache.ibatis.io
?執(zhí)行后可以在數(shù)據(jù)庫中查看表
可以看到正常插入進去了
?五.通過Mybatis實現(xiàn)增刪改
增刪查改,除了查,其他操作跟上述一樣。
這里展示其源碼
由于Test測試類中有太復(fù)雜的操作,所以在com目錄下創(chuàng)建了一個util工具類,類中實現(xiàn)一個方法就是給我們返回SqlSession操作數(shù)據(jù)庫對象。
代碼如下
package com.alphamilk.mybatis.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.InputStream;
public class MybatisUtil {
public static SqlSession getSession(){
SqlSession sqlSession =null;
try {
// 配置核心配置輸入流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 獲取SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 獲取sqlSessionFactory對象
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 獲取sqlSession對象
sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}catch (Exception e){
e.printStackTrace();
}
return sqlSession;
}
}
由于需要實現(xiàn)刪該的方法,所以在接口中需要實現(xiàn)方法增加
package com.alphamilk.mybatis.mapper;
public interface UserMapper {
// 實現(xiàn)用戶插入
public int insertUser();
// 實現(xiàn)用戶信息修改
public int UpdateUser();
// 實現(xiàn)用戶信息消除
public int DeleteUser();
}
對應(yīng)的映射也需要增加
<?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">
<!--此處的namespace修改為對應(yīng)的接口-->
<mapper namespace="com.alphamilk.mybatis.mapper.UserMapper">
<!-- 配置實體類映射接口-->
<!-- 方法insertUser() -->
<insert id="insertUser">
insert into table_user value ('何生',20,'915@qq.com',001)
</insert>
<!-- 方法UpdateUser()-->
<update id="UpdateUser">
update table_user set name ='黃小龍'where id=1
</update>
<!-- 方法DeleteUser()-->
<delete id="DeleteUser">
delete from table_user where name='黃小龍'
</delete>
</mapper>
最后測試類實現(xiàn)
package com.alphamilk.mybatis;
import com.alphamilk.mybatis.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class MybatisTest {
@Test
public void Test(){
SqlSession sqlSession = null;
sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 執(zhí)行insert方法
// mapper.insertUser();
// 執(zhí)行修改方法
mapper.UpdateUser();
// 執(zhí)行刪除方法
// mapper.DeleteUser();
}
}
實現(xiàn)數(shù)據(jù)修改效果
?實現(xiàn)數(shù)據(jù)刪除效果
?六.實現(xiàn)數(shù)據(jù)庫的查詢操作
由于數(shù)據(jù)庫查詢的操作需要返回的是數(shù)據(jù)的結(jié)果
在設(shè)置xml時候,需要而外設(shè)置參數(shù)resultType 或者 resultMap
- ?resultType:設(shè)置結(jié)果類型,即查詢的數(shù)據(jù)要轉(zhuǎn)換的java類型
- ?resultMap,處理一對一或者一對多的映射關(guān)系
<!-- getUserById()-->
<!-- resultType:設(shè)置結(jié)果類型,即查詢的數(shù)據(jù)要轉(zhuǎn)換的java類型
resultMap,處理一對一或者一對多的映射關(guān)系
這里使用returnType設(shè)置為pojo包內(nèi)的User類型(注意一定要明確詳細(xì)的類名),即返回結(jié)果是User對象
-->
<select id="getgetUserById" resultType="com.alphamilk.mybatis.pojo.User" >
select name from table_user where id =2
</select>
測試類內(nèi)容
package com.alphamilk.mybatis;
import com.alphamilk.mybatis.mapper.UserMapper;
import com.alphamilk.mybatis.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class MybatisTest {
@Test
public void Test(){
SqlSession sqlSession = null;
sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 執(zhí)行insert方法
// mapper.insertUser();
// 執(zhí)行修改方法
// mapper.UpdateUser();
// 執(zhí)行刪除方法
// mapper.DeleteUser();
// 執(zhí)行通過id查詢
User user = mapper.getUserById();
System.out.println(user);
sqlSession.commit();
sqlSession.close();
}
}
?如果有多個結(jié)果則返回時候需要用集合接收
當(dāng)前xml配置
<?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">
<!--此處的namespace修改為對應(yīng)的接口-->
<mapper namespace="com.alphamilk.mybatis.mapper.UserMapper">
<!-- 配置實體類映射接口-->
<!-- 方法insertUser() -->
<insert id="insertUser">
insert into table_user value ('何生',20,'915@qq.com',001)
</insert>
<!-- 方法UpdateUser()-->
<update id="UpdateUser">
update table_user set name ='黃小龍'where id=1
</update>
<!-- 方法DeleteUser()-->
<delete id="DeleteUser">
delete from table_user where name='黃小龍'
</delete>
<!-- getUserById()-->
<!-- resultType:設(shè)置結(jié)果類型,即查詢的數(shù)據(jù)要轉(zhuǎn)換的java類型
resultMap,處理一對一或者一對多的映射關(guān)系
這里使用returnType設(shè)置為pojo包內(nèi)的User類型(注意一定要明確詳細(xì)的類名),即返回結(jié)果是User對象
-->
<select id="getUserById" resultType="com.alphamilk.mybatis.pojo.User" >
select * from table_user where id =2
</select>
<!-- 對應(yīng)接口內(nèi)方法public User getUserAll();-->
<select id="getUserAll">
select * from table_user
</select>
</mapper>
?測試類內(nèi)容
package com.alphamilk.mybatis;
import com.alphamilk.mybatis.mapper.UserMapper;
import com.alphamilk.mybatis.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.Iterator;
import java.util.List;
public class MybatisTest {
@Test
public void Test(){
SqlSession sqlSession = null;
sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 執(zhí)行insert方法
// mapper.insertUser();
// 執(zhí)行修改方法
// mapper.UpdateUser();
// 執(zhí)行刪除方法
// mapper.DeleteUser();
// 執(zhí)行通過id查詢
// User user = mapper.getUserById();
// System.out.println(user);
// 查詢所有用戶的信息
List<User> list = mapper.getUserAll();
Iterator<User> iterator = list.listIterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
sqlSession.commit();
sqlSession.close();
}
}
深度了解Mybatis的核心配置文章來源:http://www.zghlxwxcb.cn/news/detail-660253.html
Mybatis的核心配置_Alphamilk的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-660253.html
到了這里,關(guān)于認(rèn)識Mybatis并實現(xiàn)增刪查改的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!