Mybatis基础操作
Mybatis基础使用
Mybatis编程式开发
- mybatis和MySQL jar包依赖
xml
<dependencies> <!-- 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.33</version> </dependency> <!-- 连接池(可选,推荐) --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> </dependencies>
- 全局配置文件mybatis-config.xml
配置文件对应标签可以看官方文档:MyBatis 3 | Configuration – mybatis
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> <!-- 1. 加载外部属性文件 --> <properties resource="jdbc.properties"/> <!-- 2. 全局设置 --> <settings> <!-- 开启下划线到驼峰命名自动映射 --> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"/> <!-- 延迟加载的触发方法 --> <setting name="lazyLoadTriggerMethods" value=""/> <!-- 查询时,关闭关联对象即时加载 --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 设置超时时间 --> <setting name="defaultStatementTimeout" value="3000"/> <!-- 使用列标签代替列名 --> <setting name="useColumnLabel" value="true"/> <!-- 允许JDBC支持自动生成主键 --> <setting name="useGeneratedKeys" value="true"/> </settings> <!-- 3. 类型别名配置 --> <typeAliases> <!-- 扫描包,自动注册别名 --> <package name="com.example.entity"/> <!-- 也可以单独配置 --> <!-- <typeAlias type="com.example.entity.User" alias="User"/> --> </typeAliases> <!-- 4. 环境配置(可配置多个,通过default属性切换) --> <environments default="development"> <!-- 开发环境 --> <environment id="development"> <!-- 事务管理器 --> <transactionManager type="JDBC"> <property name="closeConnection" value="false"/> </transactionManager> <!-- 数据源配置 --> <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}"/> <!-- 连接池配置 --> <property name="poolMaximumActiveConnections" value="20"/> <property name="poolMaximumIdleConnections" value="10"/> <property name="poolMaximumCheckoutTime" value="20000"/> <property name="poolTimeToWait" value="20000"/> </dataSource> </environment> <!-- 测试环境 --> <environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.test.url}"/> <property name="username" value="${jdbc.test.username}"/> <property name="password" value="${jdbc.test.password}"/> </dataSource> </environment> </environments> <!-- 5. 映射器配置 --> <mappers> <!-- 方式1:通过resource指定XML文件 --> <mapper resource="com/example/mapper/UserMapper.xml"/> <!-- 方式2:通过class指定接口(需要接口和XML同名同路径) --> <!-- <mapper class="com.example.mapper.UserMapper"/> --> <!-- 方式3:扫描包下所有mapper接口 --> <!-- <package name="com.example.mapper"/> --> </mappers> </configuration>- 映射器 Mapper.xml
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"> <mapper namespace="com.example.mapper.UserMapper"> <!-- 基础ResultMap映射 --> <resultMap id="BaseResultMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="email" column="email"/> <result property="age" column="age"/> <result property="status" column="status"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> <!-- 枚举类型处理 --> <result property="gender" column="gender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/> </resultMap> <!-- 包含订单的ResultMap(一对多) --> <resultMap id="UserWithOrdersResultMap" type="User" extends="BaseResultMap"> <!-- 一对多关联:用户的订单 --> <collection property="orders" ofType="Order" column="id" select="com.example.mapper.OrderMapper.selectByUserId"/> </resultMap> <!-- 插入用户 --> <insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users (username, password, email, age, status, create_time, update_time, gender) VALUES (#{username}, #{password}, #{email}, #{age}, #{status}, #{createTime}, #{updateTime}, #{gender, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}) </insert> <!-- 批量插入用户 --> <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id"> INSERT INTO users (username, password, email, age, status, create_time, update_time) VALUES <foreach collection="list" item="user" separator=","> (#{user.username}, #{user.password}, #{user.email}, #{user.age}, #{user.status}, #{user.createTime}, #{user.updateTime}) </foreach> </insert> <!-- 根据ID删除 --> <delete id="deleteById" parameterType="Long"> DELETE FROM users WHERE id = #{id} </delete> <!-- 根据用户名删除 --> <delete id="deleteByUsername" parameterType="String"> DELETE FROM users WHERE username = #{username} </delete> <!-- 更新用户 --> <update id="update" parameterType="User"> UPDATE users <set> <if test="username != null">username = #{username},</if> <if test="password != null">password = #{password},</if> <if test="email != null">email = #{email},</if> <if test="age != null">age = #{age},</if> <if test="status != null">status = #{status},</if> <if test="updateTime != null">update_time = #{updateTime},</if> </set> WHERE id = #{id} </update> <!-- 更新用户状态 --> <update id="updateStatus"> UPDATE users SET status = #{status} WHERE id = #{id} </update> <!-- 根据ID查询 --> <select id="selectById" parameterType="Long" resultMap="BaseResultMap"> SELECT * FROM users WHERE id = #{id} </select> <!-- 查询所有用户 --> <select id="selectAll" resultMap="BaseResultMap"> SELECT * FROM users ORDER BY create_time DESC </select> <!-- 根据用户名查询(模糊查询) --> <select id="selectByUsername" parameterType="String" resultMap="BaseResultMap"> SELECT * FROM users WHERE username LIKE CONCAT('%', #{username}, '%') </select> <!-- 条件查询(动态SQL) --> <select id="selectByCondition" parameterType="map" resultMap="BaseResultMap"> SELECT * FROM users <where> <if test="username != null and username != ''"> AND username LIKE CONCAT('%', #{username}, '%') </if> <if test="email != null and email != ''"> AND email = #{email} </if> <if test="minAge != null"> AND age >= #{minAge} </if> <if test="maxAge != null"> AND age <= #{maxAge} </if> <if test="status != null"> AND status = #{status} </if> <if test="startTime != null"> AND create_time >= #{startTime} </if> <if test="endTime != null"> AND create_time <= #{endTime} </if> </where> ORDER BY id DESC </select> <!-- 分页查询 --> <select id="selectByPage" resultMap="BaseResultMap"> SELECT * FROM users ORDER BY id DESC LIMIT #{offset}, #{pageSize} </select> <!-- 统计数量 --> <select id="count" resultType="int"> SELECT COUNT(*) FROM users </select> <!-- 查询用户及其订单(关联查询) --> <select id="selectUserWithOrders" parameterType="Long" resultMap="UserWithOrdersResultMap"> SELECT * FROM users WHERE id = #{userId} </select> </mapper>- Mapper接口
java
package com.example.mapper; import com.example.entity.User; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.util.List; import java.util.Map; /** * User 数据访问接口 * 注意:不使用Spring时,这个接口不需要添加@Repository等注解 */ public interface UserMapper { // ========== 增 ========== /** * 插入用户 */ int insert(User user); /** * 批量插入用户 */ int batchInsert(List<User> users); // ========== 删 ========== /** * 根据ID删除用户 */ int deleteById(Long id); /** * 根据用户名删除用户 */ int deleteByUsername(String username); // ========== 改 ========== /** * 更新用户 */ int update(User user); /** * 更新用户状态 * 使用@Param注解指定参数名 */ int updateStatus(@Param("id") Long id, @Param("status") Integer status); // 使用注解定义SQL(不需要在XML中配置) @Update("UPDATE users SET age = #{age} WHERE id = #{id}") int updateAge(@Param("id") Long id, @Param("age") Integer age); // ========== 查 ========== /** * 根据ID查询用户 */ User selectById(Long id); /** * 查询所有用户 */ List<User> selectAll(); /** * 根据用户名查询 */ List<User> selectByUsername(String username); /** * 条件查询 * @param condition 查询条件 */ List<User> selectByCondition(Map<String, Object> condition); /** * 分页查询 * @param pageNum 页码 * @param pageSize 每页大小 */ List<User> selectByPage(@Param("offset") int offset, @Param("pageSize") int pageSize); /** * 统计用户数量 */ int count(); /** * 使用注解定义查询 */ @Select("SELECT * FROM users WHERE email = #{email}") User selectByEmail(String email); /** * 关联查询:查询用户及其订单(一对多) * 需要在XML中配置resultMap */ User selectUserWithOrders(Long userId); }- mybatis工具类
java
package com.example.app; 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; /** * MyBatis 工具类 - 手动管理 SqlSessionFactory */ public class MyBatisUtil { private static SqlSessionFactory sqlSessionFactory; // 静态代码块,在类加载时初始化 static { try { // 1. 加载 MyBatis 配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); // 2. 创建 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); System.out.println("MyBatis SqlSessionFactory 初始化成功!"); } catch (IOException e) { System.err.println("MyBatis 初始化失败: " + e.getMessage()); throw new RuntimeException("MyBatis 初始化失败", e); } } /** * 获取 SqlSession 对象 */ public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } /** * 获取 SqlSession 对象(自动提交事务) */ public static SqlSession getSqlSessionWithAutoCommit() { return sqlSessionFactory.openSession(true); } /** * 关闭 SqlSession */ public static void closeSession(SqlSession session) { if (session != null) { session.close(); } } /** * 获取 SqlSessionFactory */ public static SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } /** * 获取 Mapper 接口的代理对象 */ public static <T> T getMapper(Class<T> type) { try (SqlSession session = getSqlSession()) { return session.getMapper(type); } } }- 编程式使用示例
java
package com.example.app; import com.example.entity.User; import com.example.mapper.UserMapper; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; import java.time.LocalDateTime; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 不使用 Spring 时,MyBatis 编程式使用示例 */
