目录
mybatis注解开发(以及动态sql)
/  

mybatis注解开发(以及动态sql)

常用的注解

  • @Select
  • @Insert
  • @Delete
  • @Update
  • @SelectKey("statement = "select last_insert_id() 或者(@@identify) ", keyProperty = "id", before = false, resultType = int.class) // 查询插入数据之后的, 当前主键的值
    • statement SQL语句
    • keyProperty 将查询的结果封装到属性
    • before 如果为false , 在插入之后, 进行查询, 否则, 在插入之前查询
    • resultType 将查询的结果封装成的类型
  • @ResultMap
  • @Results
  • @Result

动态sql

通过自定义一个类, 在方法中写动态sql, 然后返回.

  • @SelectProvider(type = MySqlProvider.class, method = 方法名)
public class MySqlProvider{
    public String mysql01(Student student){
        if (student.getAge() == null){
        	return "select * from student";
        }else{
            return "select * from user where age > #{age}";
        }
    }
}

模糊查询

public String mysql01(Student student){
	if (student.getName() != null){
        return "select * from student where name like '%' #{name} '%'";
    }else{
        return "select * from student";
    }
}
  • 按照复合条件查询, 单个传输多个参数时,并且需要用@Param(“name" String name), 需要用map去接收
// 模糊查询
    @SelectProvider(type = MySqlUtils.class, method = "selectByName")
    List<Student> selectByName(@Param("name") String name);
// 当 传来的 是单个参数 或 多个参数时, 可以用map接收
    public String selectByName(Map map){
        if (map.get("name") != null && map.get("name") != ""){
            return "select * from student where sname like '%' #{name} '%'";
        }else{
            return "select * from student";
        }
    }

KpucOf.png

  • @InsertProvider
    • @DeleteProvider
  • @UpdateProvider
// 添加数据 动态sql
    @UpdateProvider(type = MySqlUtils.class, method = "studentUpdate")
    void studentUpdate(Student student);
    // 修改数据 动态sql
    public String studentUpdate(Student student){
        StringBuffer sql = new StringBuffer();
        sql.append("update student set sno = #{sno}");  // 这里设置sno = #{sno}是为了更好的拼接sql语句, 不影响最后结果
        if (student.getSname() != "" && student.getSname() != null){
            sql.append(", sname = #{sname}");
        }
        if (student.getGender() != "" && student.getGender() != null){
            sql.append(", gender = #{gender}");
        }
        if (student.getSage() > 0){
            sql.append(", sage = #{sage}");
        }
        sql.append(" where sno = #{sno}");
        return sql.toString();
    }

动态sql的另一种实现方式

public String getUpdateSql03(Student student){
    // mybatis提供好的sql类 
    // new SQL()表示创建一个SQL类的对象
    // new SQL(){}表示创建一个SQL类的子类对象, 只不过这个子类叫什么名字  不知道, 没有指定
    // 这种写法叫做 匿名内部类
    String sql = new SQL(){
        {
            this.UPDATE("student");
            this.SET("id = #{id}");
            if (student.getName != null && student.getName != ""){
                this.SET("name = #{name}");
            }
            if (student.getAge > 0){
                this.SET("age = #{age}");
            }
            if (student.getScore > 0){
                this.SET("score = #{score}");
            }
            this.SET("where id = #{id}");
        }
    }.toString();
    return sql;
}
  • 模糊查询 动态sql的另外一种方式

        // 模糊查询 的另一种方式
        @Test
        public void test03(){
            StudentDao dao = session.getMapper(StudentDao.class);
            List<Student> students = dao.selectByName01("二");
            for (Student student : students){
                System.out.println(student);
            }
        }
    
        // 模糊查询的另一种方式
        @SelectProvider(type = MySqlUtils.class, method = "selectByName01") // 这里的selcetByName是 类MySqlUtils中的方法名.
    
        List<Student> selectByName01(@Param("name") String name);
    
        // 动态sql的另外一种方式
        public String selectByName01(Map map){
            final String name = (String) map.get("name");
             String sql = new SQL(){
                {
                    this.SELECT("*");
                    this.FROM("student");
                    if (name != null && name != ""){
                        this.WHERE("sname like '%' #{name} '%'");  // % 和#{name}之间的空格不能少
                    }
                }
            }.toString();
    
             return sql;
        }
    

    KpNSOJ.png


标题:mybatis注解开发(以及动态sql)
作者:gitsilence
地址:https://blog.lacknb.cn/articles/2019/10/15/1577974155240.html