MyBatis07:MyBatis注解

系列文章目录

MyBatis01:创建、运行、测试一个mybatis项目
MyBatis02:使用MyBatis查询数据
MyBatis03:嵌套查询、嵌套结果、延迟加载
MyBatis04:动态SQL
MyBatis05:类型转换器
MyBatis06:分页插件、MyBatis配置文件中的标签
MyBatis07:MyBatis注解



前言

MyBatis接口绑定有两种实现方式,一种是之前学习的使用xml文件绑定;第二种就是今天我们要讲解的使用注解来绑定。


一、注解绑定

根据注解名确定要执行的功能,注解里面写需要执行的SQL语句

1. 注解和xml文件的适用情况

当SQL语句比较简单时,使用注解绑定比较方便一点。当SQL语句比较复杂时,用xml文件绑定比较方便一点。一般来说,使用xml文件绑定的比较多。注解里写SQL语句,使用注解后就不需要使用映射文件了,注解和配置文件不能共用

二、使用步骤

1. 配置数据访问层的包

采用注解绑定接口时,需要在Mappers里使用package标签配置数据访问层的包。

	<mappers>
       <!-- <mapper resource="com/mapping/StudentMapper.xml"></mapper>
        <mapper resource="com/mapping/ClazzMapper.xml"></mapper>
        <mapper resource="com/mapping/ScoresMapper.xml"></mapper>-->
        <package name="com.dao"/>
    </mappers>

2. 添加、修改、删除

2.1 StudentMapper

注解功能
@Insert增加功能
@Update修改功能
@Delete删除功能
	@Insert("insert into student(name, age, sex, classid) values(#{name}, #{age}, #{sex}, #{classid})")
    int insert(Student student);
    @Update("update student set name=#{name}, age=#{age}, sex=#{sex}, classid=#{classid} where id=#{id}")
    int update(Student student);
    @Delete("delete from student where id=#{id}")
    int delete(int id);

2.2 StudentTest

这里给出可以参考的测试用例:

	@Test
    public void insert() {
        Student student = new Student();
        student.setId(10);
        student.setName("Tom");
        student.setSex("man");
        student.setClassid(2);
        System.out.println(this.studentService.insert(student));
    }
    @Test
    public void update() {
        Student student = new Student();
        student.setId(19);
        student.setName("Tom2");
        student.setSex("man");
        student.setClassid(1);
        System.out.println(this.studentService.update(student));
    }
    @Test
    public void delete() {
        System.out.println(this.studentService.delete(19));
    }

3. 查询对象属性、查询集合属性

注解功能
@Select查询功能
@Results设置结果集
@Result设置属性和字段的对应关系
@ResultMap通过value="id"来设置结果集
@One嵌套查询对象
@Many嵌套查询集合

3.1 StudentMapper

	// 通过主键查询学生
    @Select("select * from student where id = #{id,jdbcType=INTEGER}")
    // id用来标识这个结果集,value用来添加映射关系
    @Results(id = "baseMap", value = {
    		// id用来标识主键列,column指定数据库字段,property用来指定Java属性
            @Result(id = true, column = "id", property = "id"),
            // jdbcType是数据库的数据类型,可以不写
            @Result(column = "name", property = "name", jdbcType = JdbcType.VARCHAR),
            @Result(column = "sex", property = "sex"),
            @Result(column = "birthday", property = "birthday"),
            // fetchType是获取类型,可以用来添加懒加载
            @Result(property = "clazz", column = "classid", one = @One(select = "com.dao.ClazzMapper.selectByPrimaryKey",fetchType = FetchType.LAZY)),
            @Result(property = "scores", column = "id", many = @Many(select = "com.dao.ScoresMapper.selectByStuid",fetchType = FetchType.LAZY))
    })
    Student selectByPrimaryKey(Integer id);

    // 查询全部学生
    @Select("select * from student")
    @ResultMap(value = "baseMap")
    List<Student> selectAll();

3.2 ClazzMapper

	// 通过主键查询班级
    @Select("select * from clazz where id = #{classid}")
    Clazz selectByPrimaryKey(Integer id);

3.3 ScoresMapper

	// 通过学生编号查询结果集
    @Select("select * from scores where stuid = #{id}")
    List<Scores> selectByStuid(Integer id);

3.4 StudentTest

	@Test
    public void selectByPrimaryKey() {
        Student student = this.studentService.selectByPrimaryKey(1);
        System.out.println(student.getId() + "\t" + student.getName());
        if (student.getClazz() != null) {
            System.out.println("所在班级名称" + student.getClazz().getClassname());
        }
        if (student.getScores() != null) {
            List<Scores> scores = student.getScores();
            for (Scores score : scores) {
                System.out.println(score.getCourse() + "\t" + score.getScore());
            }
        }
    }

    @Test
    public void selectAll() {
        List<Student> students = this.studentService.selectAll();
        for (int i=0; i<students.size(); i++) {
            Student student = students.get(i);
            System.out.println(student.getId() + "\t" + student.getName());
            if (student.getClazz() != null) {
                System.out.println(student.getClazz().getClassname());
            }
            if (student.getScores() != null) {
                List<Scores> scores = student.getScores();
                for (Scores score : scores) {
                    System.out.println(score.getCourse() + "\t" +score.getScore() + "\t" + score.getExamdate());
                }
            }
        }
    }

4. 动态SQL

动态SQL最好还是使用xml文件,使用注解写,没有错误提醒,代码容易写错。

4.1 StudentMapper

	//如果SQL语句需要使用动态SQL元素标签,需要将整个SQL语句括在script元素内
    @Select("<script>select * from student <where>" +
            "<if test='id != null and id > 0'> id = #{id} </if>" +
            "<if test='name != null'> name like concat('%',#{name},'%') </if> " +
            "</where> </script>")
    @ResultMap(value = "baseMap")
    List<Student> select(Student student);

4.2 StudentTest

	@Test
    public void select() {
        Student student = new Student();
        //student.setName("t");
        student.setId(5);

        List<Student> students = this.studentService.select(student);
        for (int i=0; i<students.size(); i++) {
            Student student1 = students.get(i);
            System.out.println(student1.getId() + "\t" + student1.getName());
        }
    }

总结

以上就是使用注解实现MyBatis接口绑定的全部介绍。重点讲了增删改如何使用主键实现,查询对象属性和查询集合属性如何使用注解实现。以及动态SQL如何使用注解实现。最后说明,注解主要适用于SQL语句比较简单的情况下使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员_动次动次

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值