当前位置:   article > 正文

mybatis注解在方法直接编写SQL@Select@Insert@Update@Delete_mybatis @select script

mybatis @select script

使用mybatis框架在xml文件中编写相应的SQL,正规操作有一个mapper就需要对应一个xml文件,累积下来就有很多文件,处理起来贼繁琐,直接在对应方法上使用注解编写SQL,一定程度上可以减少开发时间,但是有一个很不好的地方,判断语句或者批量操作是需要手动添加<script></script>,这个无法自动生成,需要对这个比较熟悉才能上手

引入类

import org.apache.ibatis.annotations.*;
  • 1

注意:在mapper接口上需要加上两个注解

@Mapper
@Repository
  • 1
  • 2

一、查询 @Select

1. 查询单个对象

/**
* 查询单个对象
*
* @param name 名称
* @return 具体对象
*/
@Select(" select name,age,sex,class_name,nick_name as nickName from table_name where name=#{name}")
@Result(property = "className", column = "class_name")
Student queryOne(@Param("name") String name);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果表中字段定义的是下划线 _ 格式,而java Bean又是驼峰
① 使用@Result( )注解来进行映射
② 或使用as在字段后面重命名(as可省略)

2. 查询对象列表

/**
* 查询对象列表
*
* @return 对象列表
*/
@Select(" select * from table_name ")
@Results({
	@Result(property = "className", column = "class_name"),
	@Result(property = "nickName", column = "nick_name")
})
List<Student> queryList();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

@Results() 可省略

3. 根据条件查询列表(批量查询)


/**
     * 根据编号查询列表
     *
     * @param grade   年级
     * @param numList 编号列表
     * @return 列表对象
     */
    @Select("<script>"
            + "select * from table_name where grade=#{grade} and num in "
            + "<foreach item = 'num' index = 'index' collection = 'numList' open='(' separator=',' close=')'>"
            + "#{num}"
            + "</foreach>"
            + "</script>")
    List<Student> getListByNum(@Param("grade") String grade, @Param("numList") List<String> numList);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上面程序内只创建了一个SQL,通过 in 编号列表去循环匹配,千万不要用去套用整个SQL,那样每一个编号就会创建一个SQL,效率很低,造成没有必要的数据库压力

4. when,字段为空判断

@Select("<script>" +
            "select num from table_name " +
            "<when test='grade != null'>" +
            "where grade = #{grade} " +
            "</when>" +
            "</script>")
    Set<String> getAllNums(@Param("grade") String grade);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5. 分页查询

int pageNow = 1;
int pageSize = 50;
List list = studentMapper.queryListByPage((pageNow - 1) * pageSize, pageSize);

@Select("select * from table_name limit #{pageNow}, #{pageSize}")
List<Student> QueryListByPage(@Param("pageNow") int pageNow, @Param("pageSize") int pageSize);
  • 1
  • 2

6. 模糊查询

@Select(" select * from table_name where age = '18' and (name like '%${match}%' or  nickName like '%${match}%' ) ")
List<Student> match(String match);
  • 1
  • 2

二、插入 @Insert

1. 插入单个

@Insert("insert into table_name (num,grade,name,age,sex)"
            + "values(#{num},#{grade},#{name},#{age},#{sex}")
    void insert(Student student);

  • 1
  • 2
  • 3
  • 4
场景1:插入数据时数据已存在,但是不让他报错。可用 【INSERT IGNORE INTO】 来进行忽略
@Insert("insert ignore into table_name (num,grade,name,age,sex)"
            + "values(#{num},#{grade},#{name},#{age},#{sex}")
void insert(Student student);
  • 1
  • 2
  • 3

依据:主键冲突或者唯一索引冲突(类型:unique)。
出现以上两种异常,会自动忽略当前的插入操作,不会报错。

场景2:插入数据,存在就更新数据。可用 【ON DUPLICATE KEY UPDATE】
@Insert("insert into table_name (num,grade,name,age,sex,insert_time,update_time) "
            + "values(#{num},#{grade},#{name},#{age},#{sex},now(),now() "
            + "ON DUPLICATE KEY UPDATE update_time=now()")
void insert(Student student);
  • 1
  • 2
  • 3
  • 4

这里是如果表中不存在该数据那么正常插入;如果存在,那么就更新时间

2. 批量插入

@Insert("<script>" +
            "insert into table_name (num,grade,name,age,sex) values " +
            "  <foreach collection='list' item='item' separator=',' > " +
            "  (#{item.num}, #{item.grade}, #{item.name}, #{item.age}, #{item.sex})" +
            "  </foreach> " +
            "</script>")
    void batchInsert(@Param("list") List<Student> list);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

三、修改 @Update

1. 修改单个

@Update(" update table_name set grade=#{grade}, name=#{name}, age=#{age}, sex=#{sex}" +
            " where  num=#{num}")
    int updateStudent(Student student);
  • 1
  • 2
  • 3

2. 批量修改

 @Update("<script> " +
            " update table_name set grade = #{grade} where 1=1  and  num in " +
            "  <foreach collection='list' index='index' item='item' separator=',' open=\"(\" close= \")\" > " +
            "  #{item}" +
            "  </foreach> " +
            "</script>")
    void batchUpdate(@Param("list")List<String> list, @Param("grade") String grade);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3. if条件的使用

@Update("<script> update table_name set grade='三年级' " +
            " <if test=\"name != null and name != '' \"> , name = #{name} </if> " +
            " <if test=\"age != null \"> ,  age = #{age}</if>" +
            " <if test=\"sex != null \"> ,  sex = #{sex}</if>" +
            " where num = #{num}</script>")
    void update(Student student);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

四、删除 @Delete

@Delete(" DELETE FROM table_name ")
void deleteAll();
  • 1
  • 2

实体类

public class Student {
	/**
     * 自增主键 
     */
    private Integer id;
	// 编号
	private String num;
	// 年级
	private String grade;
    private String name;
    // 班级名称
    private String className;
    // 绰号
    private String nickName;
    // 年龄
    private Integer age;
    // 性别
    private Boolean sex;
    // 插入时间
    private date insertTime;
    // 更新时间
    private date updateTime;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

这里只展示了我自己常用的方法,更多的标签用法同学们可以去官网或者百度寻找
^ _ ^

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/114940
推荐阅读