Java MyBatis映射案例如何配置

wen java案例 27

本文目录导读:

Java MyBatis映射案例如何配置

  1. 基础依赖配置
  2. MyBatis主配置文件
  3. 实体类与数据库表
  4. XML映射配置
  5. 关联映射配置
  6. 注解映射配置
  7. Spring Boot集成配置
  8. 使用示例

我来详细介绍Java MyBatis映射的配置案例,包括XML和注解两种方式。

基础依赖配置

Maven依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.11</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

MyBatis主配置文件

mybatis-config.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>
    <!-- 环境配置 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 注册映射文件 -->
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
        <mapper class="com.example.mapper.UserMapper"/>
    </mappers>
</configuration>

实体类与数据库表

数据库表结构

CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(50) DEFAULT NULL,
    `password` varchar(50) DEFAULT NULL,
    `email` varchar(100) DEFAULT NULL,
    `create_time` datetime DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `order` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `user_id` int(11) DEFAULT NULL,
    `order_no` varchar(50) DEFAULT NULL,
    `total_amount` decimal(10,2) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

实体类

// User.java
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    private Date createTime;
    private List<Order> orders;  // 一对多关联
    // getter和setter方法
}
// Order.java
public class Order {
    private Integer id;
    private Integer userId;
    private String orderNo;
    private BigDecimal totalAmount;
    private User user;  // 多对一关联
    // getter和setter方法
}

XML映射配置

基础CRUD映射

<!-- UserMapper.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 id="userMap" type="com.example.entity.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="email" column="email"/>
        <result property="createTime" column="create_time"/>
    </resultMap>
    <!-- 查询所有用户 -->
    <select id="findAll" resultMap="userMap">
        SELECT * FROM user
    </select>
    <!-- 根据ID查询 -->
    <select id="findById" resultMap="userMap" parameterType="int">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <!-- 插入用户 -->
    <insert id="insert" parameterType="com.example.entity.User" 
            useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user(username, password, email, create_time)
        VALUES(#{username}, #{password}, #{email}, #{createTime})
    </insert>
    <!-- 更新用户 -->
    <update id="update" parameterType="com.example.entity.User">
        UPDATE user 
        SET username = #{username},
            password = #{password},
            email = #{email}
        WHERE id = #{id}
    </update>
    <!-- 删除用户 -->
    <delete id="deleteById" parameterType="int">
        DELETE FROM user WHERE id = #{id}
    </delete>
    <!-- 动态SQL查询 -->
    <select id="findByCondition" resultMap="userMap" 
            parameterType="com.example.entity.User">
        SELECT * FROM user
        <where>
            <if test="username != null and username != ''">
                AND username LIKE CONCAT('%', #{username}, '%')
            </if>
            <if test="email != null and email != ''">
                AND email = #{email}
            </if>
        </where>
    </select>
</mapper>

关联映射配置

一对多关联(User -> Order)

<!-- UserMapper.xml中的关联映射 -->
<resultMap id="userWithOrdersMap" type="com.example.entity.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <result property="password" column="password"/>
    <result property="email" column="email"/>
    <result property="createTime" column="create_time"/>
    <!-- 一对多关联映射 -->
    <collection property="orders" ofType="com.example.entity.Order">
        <id property="id" column="order_id"/>
        <result property="orderNo" column="order_no"/>
        <result property="totalAmount" column="total_amount"/>
    </collection>
</resultMap>
<!-- 连表查询 -->
<select id="findUserWithOrders" resultMap="userWithOrdersMap">
    SELECT u.*, o.id as order_id, o.order_no, o.total_amount
    FROM user u
    LEFT JOIN `order` o ON u.id = o.user_id
    WHERE u.id = #{id}
</select>

多对一关联(Order -> User)

<!-- OrderMapper.xml中的关联映射 -->
<resultMap id="orderWithUserMap" type="com.example.entity.Order">
    <id property="id" column="id"/>
    <result property="userId" column="user_id"/>
    <result property="orderNo" column="order_no"/>
    <result property="totalAmount" column="total_amount"/>
    <!-- 多对一关联映射 -->
    <association property="user" javaType="com.example.entity.User">
        <id property="id" column="user_id"/>
        <result property="username" column="username"/>
        <result property="email" column="email"/>
    </association>
</resultMap>
<select id="findOrderWithUser" resultMap="orderWithUserMap">
    SELECT o.*, u.username, u.email
    FROM `order` o
    JOIN user u ON o.user_id = u.id
    WHERE o.id = #{id}
</select>

注解映射配置

// UserMapper.java 使用注解
public interface UserMapper {
    @Select("SELECT * FROM user")
    @Results(id = "userMap", value = {
        @Result(property = "id", column = "id", id = true),
        @Result(property = "username", column = "username"),
        @Result(property = "password", column = "password"),
        @Result(property = "email", column = "email"),
        @Result(property = "createTime", column = "create_time")
    })
    List<User> findAll();
    @Select("SELECT * FROM user WHERE id = #{id}")
    @ResultMap("userMap")
    User findById(int id);
    @Insert("INSERT INTO user(username, password, email, create_time) " +
            "VALUES(#{username}, #{password}, #{email}, #{createTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(User user);
    @Update("UPDATE user SET username=#{username}, password=#{password}, " +
            "email=#{email} WHERE id=#{id}")
    int update(User user);
    @Delete("DELETE FROM user WHERE id = #{id}")
    int deleteById(int id);
    // 动态SQL使用脚本
    @Select("<script>" +
            "SELECT * FROM user" +
            "<where>" +
            "<if test='username != null and username != \"\"'>" +
            "AND username LIKE CONCAT('%', #{username}, '%')" +
            "</if>" +
            "</where>" +
            "</script>")
    List<User> findByCondition(User user);
}

Spring Boot集成配置

# application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_db?useSSL=false&serverTimezone=UTC
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.entity
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

使用示例

// 测试代码
@SpringBootTest
public class UserMapperTest {
    @Autowired
    private UserMapper userMapper;
    @Test
    public void testCRUD() {
        // 插入
        User user = new User();
        user.setUsername("testuser");
        user.setPassword("123456");
        user.setEmail("test@example.com");
        user.setCreateTime(new Date());
        userMapper.insert(user);
        // 查询
        User foundUser = userMapper.findById(user.getId());
        System.out.println(foundUser.getUsername());
        // 更新
        foundUser.setEmail("newemail@example.com");
        userMapper.update(foundUser);
        // 删除
        userMapper.deleteById(foundUser.getId());
    }
}
  1. 命名空间:XML映射文件的namespace必须与Mapper接口全限定名一致
  2. 结果映射:数据库字段名和Java属性名不一致时使用resultMap
  3. 参数传递:使用进行预编译参数,进行字符串替换
  4. 主键回填:插入操作使用useGeneratedKeys获取自增主键
  5. 关联映射:使用association(一对一)和collection(一对多)处理关联关系
  6. 动态SQL:使用<if><where><foreach>等标签构建动态查询

这个案例覆盖了MyBatis映射的常见配置场景,可以作为实际项目的参考模板。

抱歉,评论功能暂时关闭!