注解开发、注解多表操作、构建SQL语句

本文介绍了MyBatis中常用的注解如@Select、@Insert等,展示了如何通过注解实现一对一和一对多、多对多的映射关系,并探讨了如何使用@SelectProvider构建SQL语句。通过实例讲解,帮助开发者提升开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 注解开发
  • 注解可以简化开发操作,省略映射配置文件的编写
  • 常用注解

@Select(“查询的 SQL 语句”):执行查询操作注解

@Insert(“查询的 SQL 语句”):执行新增操作注解

@Update(“查询的 SQL 语句”):执行修改操作注解

@Delete(“查询的 SQL 语句”):执行删除操作注解

  • 核心文件内配置映射关系
<mappers> <package name="接口所在包"/> </mappers>   
  • 注解操作一对一
------------1
public interface CardMapper {
    //查询全部
    @Select("SELECT * FROM card")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "number",property = "number"),
            @Result(
                    property = "p",             // 被包含对象的变量名
                    javaType = Person.class,    // 被包含对象的实际数据类型
                    column = "pid",             // 根据查询出的card表中的pid字段来查询person表
                    /*
                        one、@One 一对一固定写法
                        select属性:指定调用哪个接口中的哪个方法
                     */
                    one = @One(select = "com.itheima.one_to_one.PersonMapper.selectById")
            )
    })
    public abstract List<Card> selectAll();
}
---------------------2
public interface PersonMapper {
    //根据id查询
    @Select("SELECT * FROM person WHERE id=#{id}")
    public abstract Person selectById(Integer id);
}
------------------------3

public class Test01 {
    @Test
    public void selectAll() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取CardMapper接口的实现类对象
        CardMapper mapper = sqlSession.getMapper(CardMapper.class);

        //5.调用实现类对象中的方法,接收结果
        List<Card> list = mapper.selectAll();

        //6.处理结果
        for (Card card : list) {
            System.out.println(card);
        }

        //7.释放资源
        sqlSession.close();
        is.close();
    }

}
----------------------
@Results:封装映射关系的父注解。
	Result[] value():定义了 Result 数组
@Result:封装映射关系的子注解。
	column 属性:查询出的表中字段名称
	property 属性:实体对象中的属性名称
	javaType 属性:被包含对象的数据类型
	one 属性:一对一查询固定属性
 @One:一对一查询的注解。
	select 属性:指定调用某个接口中的方法

-多表操作一对多

--------------------------1
public interface ClassesMapper {
    //查询全部
    @Select("SELECT * FROM classes")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(
                    property = "students",  // 被包含对象的变量名
                    javaType = List.class,  // 被包含对象的实际数据类型
                    column = "id",          // 根据查询出的classes表的id字段来查询student表
                    /*
                        many、@Many 一对多查询的固定写法
                        select属性:指定调用哪个接口中的哪个查询方法
                     */
                    many = @Many(select = "com.itheima.one_to_many.StudentMapper.selectByCid")
            )
    })
    public abstract List<Classes> selectAll();
}
--------------------------------2
public interface StudentMapper {
    //根据cid查询student表
    @Select("SELECT * FROM student WHERE cid=#{cid}")
    public abstract List<Student> selectByCid(Integer cid);
}
-------------------------------3
public class Test01 {
    @Test
    public void selectAll() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取ClassesMapper接口的实现类对象
        ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class);

        //5.调用实现类对象中的方法,接收结果
        List<Classes> list = mapper.selectAll();

        //6.处理结果
        for (Classes cls : list) {
            System.out.println(cls.getId() + "," + cls.getName());
            List<Student> students = cls.getStudents();
            for (Student student : students) {
                System.out.println("\t" + student);
            }
        }

        //7.释放资源
        sqlSession.close();
        is.close();
    }

}

  • 多表操作多对多
------------------------------1
public interface StudentMapper {
    //查询全部
    @Select("SELECT DISTINCT s.id,s.name,s.age FROM student s,stu_cr sc WHERE sc.sid=s.id")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(column = "age",property = "age"),
            @Result(
                    property = "courses",   // 被包含对象的变量名
                    javaType = List.class,  // 被包含对象的实际数据类型
                    column = "id",          // 根据查询出student表的id来作为关联条件,去查询中间表和课程表
                    /*
                        many、@Many 一对多查询的固定写法
                        select属性:指定调用哪个接口中的哪个查询方法
                     */
                    many = @Many(select = "com.itheima.many_to_many.CourseMapper.selectBySid")
            )
    })
    public abstract List<Student> selectAll();
}
---------------------------------2
public interface CourseMapper {
    //根据学生id查询所选课程
    @Select("SELECT c.id,c.name FROM stu_cr sc,course c WHERE sc.cid=c.id AND sc.sid=#{id}")
    public abstract List<Course> selectBySid(Integer id);
}
----------------------------------3
public class Test01 {
    @Test
    public void selectAll() throws Exception{
        //1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        //2.获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        //3.通过工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession(true);

        //4.获取StudentMapper接口的实现类对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        //5.调用实现类对象中的方法,接收结果
        List<Student> list = mapper.selectAll();

        //6.处理结果
        for (Student student : list) {
            System.out.println(student.getId() + "," + student.getName() + "," + student.getAge());
            List<Course> courses = student.getCourses();
            for (Course cours : courses) {
                System.out.println("\t" + cours);
            }
        }

        //7.释放资源
        sqlSession.close();
        is.close();
    }

}

  • 构建SQL语句:编写其SQL相对方便
------------------------------------1
public class ReturnSql {

    //编写功能类
    //所谓SQL语句构建无非就是让其与接口分离
    //返回值为SQL语句,为字符串类型
    //查询全部
    public String selectAll() {

        return new SQL() {
            {
                SELECT("*");
                FROM("student");
            }
        }.toString();   //toString意思即将其以字符串形式返回
    }

    //新增数据
    public String insert(Student stu) {
        return new SQL() {
            {
                INSERT_INTO("Student");    //添加的表
                INTO_VALUES("#{id},#{name},#{age}");  //从传来的对象取值
            }
        }.toString();
    }

    //修改数据
    public String uqdate(Student stu) {
        return new SQL() {
            {
                UPDATE("Student");
                SET("name=#{name},age=#{age}");
                WHERE("id=#{id}");
            }
        }.toString();
    }

    //删除数据
    public String delete(Integer id){
        return new SQL(){
            {
                DELETE_FROM("Student");
                WHERE("id=#{id}");
            }
        }.toString();
    }
}

-----------------------------------2
public interface StudentMapper {

    //type类型为功能类class文件 method为此功能类具体的实现方法
    @SelectProvider(type = ReturnSql.class,method ="selectAll" )
    public abstract List<Student> selectAll();

    //新增数据
    @InsertProvider(type = ReturnSql.class,method = "insert")
    public abstract Integer insert(Student stu);

    //修改数据
    @UpdateProvider(type = ReturnSql.class, method = "uqdate")
    public abstract Integer update(Student stu);

    //删除数据
    @DeleteProvider(type = ReturnSql.class,method = "delete")
    public abstract Integer delete(Integer id);
}
----------------------------------3
public class Test01 {

    @Test
    public void selectAll() throws Exception {

        InputStream stream = Resources.getResourceAsStream("MyBatisConfig.xml");

        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);

        SqlSession sqlSession = build.openSession(true);

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        List<Student> students = mapper.selectAll();

        for (Student student : students) {
            System.out.println(student);
        }

        sqlSession.close();
        stream.close();
    }



    //新增数据
    @Test
    public void insert() throws Exception {

        InputStream stream = Resources.getResourceAsStream("MyBatisConfig.xml");

        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);

        SqlSession sqlSession = build.openSession(true);

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        Student stu = new Student();
        stu.setId(5);
        stu.setName("鲁班大师");
        stu.setAge(19);
        Integer insert = mapper.insert(stu);
        System.out.println(insert);

        sqlSession.close();
        stream.close();
    }

    //修改数据
    @Test
    public void update() throws Exception {

        InputStream stream = Resources.getResourceAsStream("MyBatisConfig.xml");

        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);

        SqlSession sqlSession = build.openSession(true);

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        Student stu = new Student();
        stu.setId(4);
        stu.setName("沈梦溪");
        stu.setAge(19);

        Integer update = mapper.update(stu);
        System.out.println(update);
        sqlSession.close();
        stream.close();
    }

    //删除操作
    @Test
    public void delete() throws Exception {

        InputStream stream = Resources.getResourceAsStream("MyBatisConfig.xml");

        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);

        SqlSession sqlSession = build.openSession(true);

        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        Integer delete = mapper.delete(3);
        System.out.println(delete);
        sqlSession.close();
        stream.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值