目錄
一、什么是 MyBatis?為什么要用它?
二、MyBatis 核心概念(通俗理解)
1.SqlSessionFactory
2.SqlSession
3.Mapper接口
4.映射文件(XML)
三、手把手搭建第一個 MyBatis 項目
1. 準備工作
2. 核心配置文件(mybatis-config.xml)
3. 編寫實體類(User.java)
4. 編寫 Mapper 接口(UserMapper.java)
5. 編寫映射文件(UserMapper.xml)
6. 編寫測試類(MyBatisTest.java)
四、核心知識點總結
1.參數傳遞
2.結果映射
一、什么是 MyBatis?為什么要用它?
MyBatis 是一款 Java 半自動化映射框架,核心作用是簡化數據庫操作。
對比傳統 JDBC:
- 無需手動寫 Connection、Statement、ResultSet 等重復代碼 SQL 語句,減少了50%以上的代碼量。
- 與 Java 代碼分離,便于維護和優化 自動完成數據庫字段與 Java 實體類的映射。
- 提供映射標簽,支持對象與數據庫的 ORM 字段關系映射。
簡單說:用 MyBatis 寫數據庫操作,更簡單、更靈活
二、MyBatis 核心概念(通俗理解)
1.SqlSessionFactory
- 數據庫連接的 “工廠”,通過核心配置文件創建
- 作用:生產SqlSession(類似生產 “數據庫連接”,同樣也需要關閉資源)
2.SqlSession
- 數據庫會話對象,相當于“數據庫連接”
- 作用:獲取Mapper接口,執行SQL操作
3.Mapper接口
- 定義數據庫操作方法(如 selectUserById、insertUser)
- 無需實現類,MyBatis 會自動生成代理對象
4.映射文件(XML)
- 存放 SQL 語句,與 Mapper 接口一一對應
- 通過標簽(select/insert 等)綁定接口方法
三、手把手搭建第一個 MyBatis 項目
1. 準備工作
數據庫:MySQL,創建 user 表(附建表 SQL):
CREATE TABLE `user` (`id` int(11) PRIMARY KEY AUTO_INCREMENT,`username` varchar(50) NOT NULL,`age` int(3) DEFAULT NULL,`create_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
項目:Maven 工程,引入依賴(pom.xml):
<!-- MyBatis 核心包 -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version>
</dependency>
<!-- MySQL 驅動 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version>
</dependency>
2. 核心配置文件(mybatis-config.xml)
放在 resources 目錄下,配置數據庫連接和映射文件路徑:
<?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"><!-- 事務管理:JDBC 方式 --><transactionManager type="JDBC"/><!-- 數據源:連接池方式 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false"/><property name="username" value="root"/> <!-- 你的數據庫用戶名 --><property name="password" value="123456"/> <!-- 你的數據庫密碼 --></dataSource></environment></environments><!-- 映射文件路徑:指定 Mapper XML 位置 --><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>
3. 編寫實體類(User.java)
屬性與表字段對應(建議用駝峰命名,如 createTime 對應表 create_time):
public class User {private Integer id;private String username;private Integer age;private LocalDateTime createTime;// 省略 getter、setter、toString 方法
}
4. 編寫 Mapper 接口(UserMapper.java)
定義數據庫操作方法:
public interface UserMapper {//查詢所有用戶List<User> selectAllUser();// 根據 ID 查詢用戶User selectById(Integer id);// 新增用戶int insert(User user);// 根據 ID 修改用戶int updateById(User user);// 根據 ID 刪除用戶int deleteById(Integer id);
}
5. 編寫映射文件(UserMapper.xml)
放在 resources/mapper 目錄下,綁定 Mapper 接口并寫 SQL:
<?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 必須與 Mapper 接口全類名一致 -->
<mapper namespace="com.example.mapper.UserMapper"><!-- 查詢:id 與接口方法名一致,resultType 是返回類型 --><select id="selectById" resultType="com.example.pojo.User">select * from user where id = #{id}</select><!-- 新增:useGeneratedKeys 獲取自增主鍵,keyProperty 綁定實體類屬性 --><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into user(username, age, create_time)values(#{username}, #{age}, #{createTime})</insert><!-- 修改 --><update id="updateById">update user setusername = #{username},age = #{age}where id = #{id}</update><!-- 刪除 --><delete id="deleteById">delete from user where id = #{id}</delete>
</mapper>
#{}是一種常見的占位符語法, 用于將變量或表達式的結果嵌入到雙引號/單引號字符串中,自動轉換為字符串類型。(能夠有效防止sql注入問題)
6. 編寫測試類(MyBatisTest.java)
通過SqlSession執行操作:
public class MyBatisTest {public static void main(String[] args) throws IOException {// 1. 讀取核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");// 2. 創建 SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);// 3. 獲取 SqlSession(true 表示自動提交事務)SqlSession session = factory.openSession(true);// 4. 獲取 Mapper 接口代理對象UserMapper userMapper = session.getMapper(UserMapper.class);// 5. 執行 SQL 操作// 新增用戶User user = new User();user.setUsername("張三");user.setAge(20);user.setCreateTime(LocalDateTime.now());int insert = userMapper.insert(user);System.out.println("新增成功,影響行數:" + insert);System.out.println("新增的用戶 ID:" + user.getId()); // 自增 ID 會回顯// 查詢用戶(用上面新增的 ID)User queryUser = userMapper.selectById(user.getId());System.out.println("查詢結果:" + queryUser);// 修改用戶queryUser.setAge(21);int update = userMapper.updateById(queryUser);System.out.println("修改成功,影響行數:" + update);// 刪除用戶int delete = userMapper.deleteById(user.getId());System.out.println("刪除成功,影響行數:" + delete);// 6. 關閉會話session.close();}
}
四、核心知識點總結
1.參數傳遞
- 單個參數:直接用 #{參數名}(如 #{id})
- 多個參數:有兩種方法:(1)傳入參數時放入Map鍵值對,通過鍵名訪問值,達到傳入多個參數的目的;(2)傳入參數時將要傳入的值封裝到實體類中,通過訪問實體類屬性名傳入多個參數
- 實體類參數:用 #{屬性名}(如 #{username} 對應 user.getUsername())
2.結果映射
- 表字段與實體屬性名一致:用 resultType 直接指定實體類
- 符合Mybatis定義映射規則:用 resultType 直接指定實體類,并且在mybatis-config.xml里面配置駝峰映射
- 不一致:用 resultMap 手動映射
<settings><!--將數據庫中的下劃線映射為駝峰--><setting name="mapUnderscoreToCamelCase" value="true"/> </settings>位置放于mybatis-config.xml中<environments>前
<resultMap id="userMap" type="com.example.pojo.User"><id column="id" property="id"/> <!-- 主鍵 --><result column="username" property="username"/><result column="age" property="age"/><result column="create_time" property="createTime"/> <!-- 字段與屬性映射 -->
</resultMap>