Mybatis注解开发

发布时间:2023-05-19

一、实现懒加载

Mybatis可以使用注解来实现懒加载。当需要一个对象时,会根据需要自动查询。使用@ManyToOne@OneToOne@OneToMany@ManyToMany注释实体之间的关系。这些注释也可以通过使用@LazyCollection(LazyCollectionOption)控制懒加载的方式。 下面的代码是一个示例,演示了如何使用@ManyToOne注解:

public class Order {
    private Integer id;
    private String orderNo;
    private Customer customer;//订单对应的客户
    //省略getter、setter
}
public class Customer {
    private Integer id;
    private String username;
    private String password;
    //省略getter、setter
}
//OrderMapper.xml
<resultMap id="orderMap" type="Order">
    <id column="id" property="id"/>
    <result column="orderNo" property="orderNo"/>
    <association property="customer" javaType="Customer" select="com.xxx.mapper.CustomerMapper.getCustomerById" column="customerId"/>
</resultMap>
//OrderMapper.java
public interface OrderMapper {
    @Select("select * from order where id = #{id}")
    @Results({
        @Result(id = true, column = "id", property = "id"),
        @Result(column = "orderNo", property = "orderNo"),
        @Result(column = "customerId", property = "customer", javaType = Customer.class, one = @One(select = "com.xxx.mapper.CustomerMapper.getCustomerById", fetchType = FetchType.LAZY))
    })
    Order getOrderById(Integer id);
}

二、Mybatis注解select

Mybatis中可以使用@Select注解进行查询操作。可以使用@Result注释配置结果映射,使用@Results注释配置映射列表。 下面的代码是一个示例,演示如何使用@Select注解:

//UserMapper.java
public interface UserMapper {
    @Select("select * from user where id = #{id}")
    @Results({
        @Result(id = true, column = "id", property = "id"),
        @Result(column = "username", property = "username"),
        @Result(column = "password", property = "password")
    })
    User getUserById(Integer id);
}

三、Mybatis注解开发需要mapper注解吗

当使用Mybatis注解进行开发时,不需要使用@Mapper注解。Mybatis会自动扫描所有的Mapper接口和注解,并将其注册到容器中。

四、Mybatis注解开发有没有多对多

Mybatis注解开发支持多对多关系。使用@ManyToMany@JoinTable注释实现多对多关系映射。同时,使用@OneToMany@ManyToOne注释实现一对多和多对一关系映射。 下面的代码是一个示例,演示如何使用@ManyToMany注解:

public class Course {
    private Integer id;
    private String name;
    private List<Student> students;//课程对应的学生
    //省略getter、setter
}
public class Student {
    private Integer id;
    private String name;
    private List<Course> courses;//学生选修的课程
    //省略getter、setter
}
//CourseMapper.xml
<resultMap id="courseMap" type="Course">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <collection property="students" javaType="List" column="id" ofType="Student" select="com.xxx.mapper.StudentMapper.getStudentsByCourseId"/>
</resultMap>
//CourseMapper.java
public interface CourseMapper {
    @Select("select * from course where id = #{id}")
    @Results({
        @Result(id = true, column = "id", property = "id"),
        @Result(column = "name", property = "name"),
        @Result(column = "id", property = "students", javaType = List.class, many = @Many(select = "com.xxx.mapper.StudentMapper.getStudentsByCourseId"))
    })
    Course getCourseById(Integer id);
}

五、Mybatis注解开发联表

Mybatis注解开发支持联表查询。使用@Select注释组合多个查询语句,使用@Results注释配置结果映射。 下面的代码是一个示例,演示如何使用联表查询:

//OrderMapper.java
public interface OrderMapper {
    @Select("select o.id as id, o.orderNo as orderNo, c.id as customerId, c.username as customerUsername from `order` o left join customer c on o.customerId = c.id where o.id = #{id}")
    @Results({
        @Result(id = true, column = "id", property = "id"),
        @Result(column = "orderNo", property = "orderNo"),
        @Result(column = "customerId", property = "customer.id"),
        @Result(column = "customerUsername", property = "customer.username")
    })
    Order getOrderById(Integer id);
}

六、Mybatis注解开发update

Mybatis注解开发支持更新操作。使用@Update注释进行更新操作。使用#{}包含属性名,使用${}不进行处理,直接与SQL语句拼接,比如可以使用时间戳函数。 下面的代码是一个示例,演示如何使用@Update注解:

//UserMapper.java
public interface UserMapper {
    @Update("update user set username = #{username}, password = #{password} where id = #{id}")
    void updateUser(User user);
}

七、Mybatis注解开发实验心得

在使用Mybatis注解进行开发时,需要了解Mybatis注解的语法和使用方式。同时,需要了解Mybatis的映射机制和实现方式,以便正确地使用注解进行映射。 在使用Mybatis注解进行开发时,需要注意以下几点:

  1. 使用@Result注释时,必须确保结果列名与属性名一致,否则结果将无法映射。
  2. 使用@One@Many注释时,必须指定javaType属性和select属性,否则将无法自动构建对象。
  3. 在使用联表查询时,必须使用别名,以避免结果列名冲突。

八、Mybatis注解开发报告心得

使用Mybatis注解进行开发,可以更加自由地进行开发。使用注解可以减少Mapper接口和XML文件的编写量,同时也能够简化开发流程,在实际开发中具有一定的优势。

九、Mybatis注解开发乱码

在进行Mybatis注解开发时,可能会遇到中文乱码的问题。这是由于Mybatis默认使用的是UTF-8编码,而数据库中的编码可能与之不兼容所造成。 在解决乱码问题时,可以使用以下两种方法:

  1. 设置JDBC URL参数,指定编码。例如:
    jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT
    
  2. 在Mybatis的配置文件中,添加以下配置项:
    <configuration>
        <!-- 其他配置项 -->
        <properties>
            <property name="autoMappingBehavior" value="FULL"/>
            <property name="jdbcTypeForNull" value="NULL"/>
            <!-- 添加以下配置项 -->
            <property name="useUnicode" value="true"/>
            <property name="characterEncoding" value="UTF-8"/>
        </properties>
    </configuration>
    

十、Mybatis注解开发模糊查询

在进行Mybatis注解开发时,可能需要进行模糊查询。可以通过在select语句中使用like来实现模糊查询,使用%表示通配符。 下面的代码是一个示例,演示如何进行模糊查询:

//UserMapper.java
public interface UserMapper {
    @Select("select * from user where username like '%${username}%'")
    @Results({
        @Result(id = true, column = "id", property = "id"),
        @Result(column = "username", property = "username"),
        @Result(column = "password", property = "password")
    })
    List<User> findUsersByUsernameLike(String username);
}