Mybatis注解开发之动态SQL

2021-10-11  本文已影响0人  zhengaoly

Mybatis的开发方式其实有3种:

  1. 原始Dao开发(就是把mapper接口、映射文件和实现类都一并开发)

  2. xml代理(就是只实现mapper接口和映射文件)

3.注解代理(就是只实现mapper接口,把映射文件的内容通过注解来写)

注解开发也分3种:

1.静态SQL

2.动态SQL

3.多表关联

主要注解有:

静态:

@Insert:相当于<insert>标签,实现新增

@Update: 相当于<update>标签,实现更新

@Delete: 相当于<delete>标签,实现删除

@Select: 相当于<select>标签,实现查询

@SelectKey:相当于<selectKey>标签,实现主键返回

动态:

@InsertProvider: 相当于<insert>标签,实现新增

@UpdateProvider: 相当于<update>标签,实现更新

@DeleteProvider: 相当于<delete>标签,实现删除

@SelectProvider: 相当于<select>标签,实现查询

多表关联:

@Results: 相当于<resultMap>标签,需要和@Result注解一起使用。

@Result: 相当于<result>和<id>标签,实现结果集中某一列的数据映射

@One: 相当于<association>标签,实现一对一关系映射

@Many:相当于<collection>标签,实现一对多关系映射

@One和@Many注解的属性:

使用格式:
1.@Results({@Result(),@Result()})或@Results(@Result())
2.@Result(column=" ",property="",one=@One(select=""))

具体例子:

public interface AnnotationUserMapper {
    // 查询
    @Select("SELECT * FROM user WHERE id = #{id}")
    public User findUserById(int id);

    // 模糊查询用户列表
    @Select("SELECT * FROM user WHERE username LIKE '%${value}%'")
    public List<User> findUserList(String username);

    // 添加并实现主键返回
    @Insert("INSERT INTO user (username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})")
    @SelectKey(before=false,statement="SELECT LAST_INSERT_ID()",keyProperty="id",resultType=int.class)
    public void insertUser(User user);

    // 动态SQL
    @SelectProvider(type=UserSqlBuilder.class,method="getDynamicSQL")
    public List<User> dynamicSQL(UserQueryVO vo);
    
    // 使用Results注解完成结果映射
    @Results({
        @Result(column="id",property="id"),
        @Result(column="username",property="username"),
        @Result(column="sex",property="sex"),
        @Result(column="address",property="address")
    })
    @Select("SELECT * FROM user WHERE id = #{id}")
    public User findUserByIdWithResultMap(int id);

    // 演示延迟加载
    @Results({
        @Result(column="id",property="id"),
        @Result(column="user_id",property="user_id"),
        @Result(column="number",property="number"),
        @Result(column="note",property="note"),
        @Result(property="user",javaType=User.class,column="user_id",
           one=@One(select="com.kkb.mybatis.anno.AnnotationUserMapper.findUserById",fetchType=FetchType.LAZY))
    })
    @Select("SELECT * FROM orders")
    public List<OrdersExt> lazyLoading();

    
 public  class UserSqlBuilder {
        public String getDynamicSQL(final UserQueryVO vo) {
            return new SQL() {
                {
                    SELECT("*");
                    FROM("user");
                    User user = vo.getUser();
                    if (user != null) {
                        if(user.getUsername() != null && !user.equals("")) {
                            WHERE("username like '%"+user.getUsername()+"%'");
                        }
                    }
                    ORDER_BY("id");
                }
            }.toString();
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读