MyBatis核心概念?+?環(huán)境搭建?+?CRUD實戰(zhàn)詳解
一、簡介
本文適合 Java 開發(fā)初學者,從零梳理 MyBatis 核心知識,包含環(huán)境搭建、配置詳解、CRUD 實戰(zhàn)、常見避坑,可直接用于學習、復習與項目開發(fā)。
二、MyBatis 基礎概念與環(huán)境搭建
1. JDBC 痛點與 MyBatis 優(yōu)勢
在學習 MyBatis 之前,我們先回顧傳統(tǒng)JDBC 開發(fā)的缺陷,這也是 MyBatis 誕生的核心原因。
JDBC 操作缺陷
- 資源頻繁創(chuàng)建與釋放,嚴重影響性能每次操作數(shù)據(jù)庫都需要創(chuàng)建 Connection、Statement,用完直接關閉,頻繁 IO 造成資源浪費。
- SQL 硬編碼,維護成本極高SQL 語句直接寫在 Java 代碼中,修改 SQL 必須重新編譯、打包、部署,無法靈活配置。
- 結果集解析繁瑣,手動封裝冗余查詢返回 ResultSet 后,需要手動
getXxx()取值、手動 set 到實體類,代碼量大且易出錯。 - 代碼冗余,開發(fā)效率低下連接、參數(shù)設置、結果解析大量重復代碼,不符合開發(fā)規(guī)范。
典型 JDBC 冗余代碼:
// 1. 加載驅動、建立連接
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, pwd);
// 2. 編寫SQL(硬編碼)
String sql = "select * from user where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 3. 設置參數(shù)
pstmt.setInt(1, id);
// 4. 執(zhí)行查詢
ResultSet rs = pstmt.executeQuery();
// 5. 手動封裝結果集
User user = null;
if(rs.next()){
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
}MyBatis 優(yōu)勢與解決方案
MyBatis 是一款優(yōu)秀的持久層框架,底層依然基于 JDBC,但做了高度封裝:
- 連接池管理:避免頻繁創(chuàng)建 / 釋放連接,大幅提升性能;
- SQL 與 Java 代碼解耦:SQL 統(tǒng)一寫在 XML 配置文件中,修改無需編譯 Java;
- 自動結果集映射:自動將 ResultSet 封裝為實體對象,無需手動解析;
- 參數(shù)自動映射:支持簡單類型、實體類參數(shù),直接使用
#{}占位符; - 輕量級、學習成本低:相比 Hibernate,MyBatis 更靈活、可控性更強。
2. 項目環(huán)境配置
我們以Maven 項目為例,搭建標準 MyBatis 開發(fā)環(huán)境。
(1)Maven 依賴導入
在pom.xml中導入核心依賴:MyBatis 核心包、MySQL 驅動、日志包、Junit 測試。
<dependencies>
<!-- MyBatis核心依賴 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- MySQL驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
<!-- 日志包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 測試包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>(2)MyBatis 核心配置文件(sqlMapConfig.xml)
在resources目錄下創(chuàng)建核心配置文件,配置數(shù)據(jù)源、事務、加載映射文件。
<?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>
<!-- 環(huán)境配置:默認使用development -->
<environments default="development">
<environment id="development">
<!-- 事務管理:JDBC事務 -->
<transactionManager type="JDBC"/>
<!-- 數(shù)據(jù)源:POOLED連接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="abc123"/>
</dataSource>
</environment>
</environments>
<!-- 加載Mapper映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>(3)項目標準結構
src/main/java
com.qcby
├── dao/ DAO接口層
├── entity/ 實體類
src/main/resources
├── mapper/ Mapper XML映射文件
├── sqlMapConfig.xml MyBatis核心配置三、核心配置與映射關系
1. 實體類與 Mapper 映射
MyBatis 實現(xiàn)自動封裝的前提:數(shù)據(jù)庫表 ↔ 實體類 嚴格映射。
(1)實體類編寫規(guī)范
- 類屬性名 與 數(shù)據(jù)庫表字段名完全一致;
- 必須提供無參構造;
- 必須生成getter/setter;
- 必須重寫toString() 方便測試打印。
User 實體類示例:
public class User {
private Integer id;
private String username;
private String sex;
private Date birthday;
private String address;
// 無參構造
public User(){}
// getter/setter
// toString()
}(2)DAO 接口與 XML 綁定規(guī)則
MyBatis 采用接口代理模式開發(fā),無需編寫實現(xiàn)類:
- 創(chuàng)建 DAO 接口(如
UserDao.java); - XML 文件通過
namespace綁定接口全類名; - XML 中 SQL 標簽的
id必須與 接口方法名完全一致; parameterType/resultType與方法參數(shù)、返回值匹配。
接口示例:
public interface UserDao {
List<User> findAll();
User findUserById(Integer id);
}
XML 綁定示例:
<!-- namespace:綁定接口全限定名 -->
<mapper namespace="com.qcby.dao.UserDao">
<!-- id:與接口方法名一致 -->
<select id="findAll" resultType="com.qcby.entity.User">
select * from user order by id desc
</select>
</mapper>2. 參數(shù)與結果映射
(1)參數(shù)傳遞(parameterType)
用于指定 SQL 入?yún)㈩愋?,支持?/p>
- 基本類型:
Integer、String - 實體類型:
com.qcby.entity.User - 取值語法:
#{屬性名}安全占位符,防 SQL 注入
xml
<select id="findUserById" parameterType="Integer" resultType="com.qcby.entity.User">
select * from user where id = #{id}
</select>(2)結果集封裝(resultType)
指定 SQL 返回值類型:
- 查詢單條數(shù)據(jù):直接寫實體類全類名
- 查詢多條數(shù)據(jù):依然寫實體類,MyBatis 自動封裝為
List<實體>
示例:查詢所有用戶xml
<select id="findAll" resultType="com.qcby.entity.User">
select * from user
</select>四、增刪改查(CRUD)實戰(zhàn)
1. 查詢操作(Select)
查詢是 MyBatis 最常用操作,分為全量查詢、精確查詢、模糊查詢。
(1)全量查詢 findAll
<select id="findAll" resultType="com.qcby.entity.User">
select * from user order by id desc;
</select>接口方法:
List<User> findAll();
(2)條件查詢:根據(jù) ID 查詢(單條結果)
<select id="findUserById" parameterType="Integer" resultType="com.qcby.entity.User">
select * from user where id = #{id};
</select>接口方法:
User findUserById(Integer id);
(3)模糊查詢:根據(jù)用戶名模糊匹配
重點:like 必須使用 concat 拼接,避免 SQL 注入
xml
<select id="findUserByUserName" parameterType="String" resultType="com.qcby.entity.User">
select * from user where username like concat('%', #{username}, '%');
</select>接口方法:
List<User> findUserByUserName(String username);
(4)字段映射異常處理
常見問題:查詢結果部分字段為null根本原因:實體類屬性名 ≠ 數(shù)據(jù)庫列名解決方案:
- 統(tǒng)一名稱(推薦)
- 使用
resultMap手動映射
2. 增刪改操作(Insert/Update/Delete)
增刪改屬于寫操作,必須注意:必須手動提交事務session.commit()。
(1)插入數(shù)據(jù) insert
<insert id="insert" parameterType="com.qcby.entity.User">
insert into user(username,sex,birthday,address)
values(#{username},#{sex},#{birthday},#{address});
</insert>接口方法:
int insert(User user);
(2)修改數(shù)據(jù) update
必須傳入包含 id的實體對象
<update id="update" parameterType="com.qcby.entity.User">
update user
set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address}
where id=#{id};
</update>(3)刪除數(shù)據(jù) delete
<delete id="delete" parameterType="Integer">
delete from user where id=#{id};
</delete>(4)事務提交機制
查詢不需要提交事務;增刪改必須提交!
@Test
public void addUser(){
User user = new User();
user.setUsername("張三");
user.setSex("男");
// 執(zhí)行插入
userDao.insert(user);
// 必須提交事務
session.commit();
}
五、測試工具類(通用版)
為了簡化測試,可封裝 MyBatis 工具類:
public class MyBatisUtil {
private static SqlSessionFactory sqlSessionFactory;
static{
try {
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 獲取SqlSession
public static SqlSession getSession(){
return sqlSessionFactory.openSession(true); // 自動提交事務
}
}到此這篇關于MyBatis核心概念 + 環(huán)境搭建 + CRUD實戰(zhàn)詳解的文章就介紹到這了,更多相關mybatis環(huán)境搭建和crud內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Mybatis使用簡述及環(huán)境搭建
- MyBatis-Plus詳解(環(huán)境搭建、關聯(lián)操作)
- Java MyBatis框架環(huán)境搭建詳解
- 基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA)
- MyBatis-Plus集成Druid環(huán)境搭建的詳細教程
- 詳解SpringMVC和MyBatis框架開發(fā)環(huán)境搭建和簡單實用
- MyBatis快速入門之環(huán)境搭建和單表映射
- Mybatis開發(fā)環(huán)境搭建實現(xiàn)數(shù)據(jù)的增刪改查功能
- mybatis3.3+struts2.3.24+mysql5.1.22開發(fā)環(huán)境搭建圖文教程
- Java+MyBatis+MySQL開發(fā)環(huán)境搭建流程詳解
- Windows下Java+MyBatis框架+MySQL的開發(fā)環(huán)境搭建教程
相關文章
在java8中使用流區(qū)分質數(shù)與非質數(shù)詳解
這篇文章主要介紹了在java8中使用流區(qū)分質數(shù)與非質數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
SpringCloud2020 bootstrap 配置文件失效的解決方法
這篇文章主要介紹了SpringCloud2020 bootstrap 配置文件失效的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
關于Java整合RocketMQ實現(xiàn)生產消費詳解
這篇文章主要介紹了關于Java整合RocketMQ實現(xiàn)生產消費詳解,RocketMQ作為一款純java、分布式、隊列模型的開源消息中間件,支持事務消息、順序消息、批量消息、定時消息、消息回溯等,需要的朋友可以參考下2023-05-05
MyEclipse 2016 CI 4新增BootStrap模板
MyEclipse2016是一款全球使用最為廣泛的企業(yè)級開發(fā)環(huán)境程序,這篇文章主要介紹了MyEclipse 2016 CI 4新增BootStrap模板的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-06-06
MyBatis基礎支持DataSource實現(xiàn)源碼解析
這篇文章主要為大家介紹了MyBatis基礎支持DataSource實現(xiàn)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
JVM性能調優(yōu)實戰(zhàn):讓你的IntelliJ Idea縱享絲滑
這篇文章主要介紹了JVM性能調優(yōu)實戰(zhàn):讓你的IntelliJ Idea縱享絲滑的相關資料,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

