SSM-MyBatis深层了解(使用注解开发和SQL构建对象)

MyBatis进阶

今天给大家分享以下几个内容

  1. 注解实现单表开发
  2. 注解实现多表操作
  3. MyBatis的SQL构建语句

先给大家介绍以下MyBatis注解开发的几个关键字

在这里插入图片描述

注解实现单表开发

在一个表中操作数据比较简单,这里我就直接把增删改查放到一起,步骤如下:

  1. 先导入MyBatis相关的jar包(因为要用到JDBC相关的类和日志文件所以导入了相应的包)
    在这里插入图片描述

  2. 配置MyBatis核心配置文件

 <settings>
        <!--在控制台显示SQL语句-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

<mappers>
        <!--加载使用注解的接口所在的包-->
        <package name="dao"/>    
</mappers>
  1. 在接口中要实现的方法上面添加注解和要操作数据库的SQL语句(这个接口要写在上一步配置的包下面)
public interface OneToOneMapper {
    @Select("select * from Card")
    List<Card> findCard();
}
  1. 编写测试类测试结果
    测试类:
public class Test {

    private SqlSession sqlSession;

    private OneToOneMapper mapper;


    public Test() {
        this.sqlSession = SqlSessionUtils.getSession();
        mapper = sqlSession.getMapper(OneToOneMapper.class);
    }


    @org.junit.Test
    public void test1() {
        List<Card> cards = mapper.findCard();

        for (Card card : cards) {
            System.out.println(card.getId() + "," + card.getNumber());
        }
    }
}

测试结果:
在这里插入图片描述

增删改和上面的步骤差不多,这里我就不一一赘述了。

注解实现多表查询

这里还是分为三种情况来介绍,导包和配置文件和上面的一样。

  1. MyBatis注解实现一对一的查询
    先在CardMapper接口中添加方法和注解:
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",
                    one = @One(select = "onetoone.PersonMapper.findById")
            )
    })
    List<Card> findAll();
}

注意:这里要注意要在接口对应的实体类中添加一个属性对应另外一个实体类。

在这里插入图片描述
然后在另一个接口PersonMapper中定义一个方法对应CardMapper中的@One中的方法,
这个方法要传入的参数就是在CardMapper中的SQL语句查询出来的结果中的一个列。

public interface PersonMapper {

    @Select("select * from person where id=#{id}")
    Person findById(Integer id);
}

最后就是编写测试类来测试结果:

public class Test01 {
    private SqlSession sqlSession;

    private OneToOneMapper mapper;

    private CardMapper cardMapper;

    public Test01() {
        this.sqlSession = SqlSessionUtils.getSession();
        mapper = sqlSession.getMapper(OneToOneMapper.class);
        cardMapper = sqlSession.getMapper(CardMapper.class);
    }

    @Test
    public void test1() {
        List<Card> cards = mapper.findCard();

        for (Card card : cards) {
            System.out.println(card);
        }
    }


    @Test
    public void test2() {
        List<Card> all = cardMapper.findAll();
        for (Card card : all) {
            System.out.println(card);
        }

    }

}

查询结果:
在这里插入图片描述
2. MyBatis注解实现一对多的查询
定义一个接口ClassesMapper:

这里和一对一不同的是在注解最后使用的是 many = @Many(…)

public interface ClassesMapper {


    @Select("select * from classes where id=2")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "name",property = "name"),
            @Result(
                 column = "id",
                 javaType = List.class,
                 property = "students",
                 many = @Many(select = "onetomany.StudentMapper.findStudentByCid")
            )
    })
    List<Classes> findClasses();
}

对应的接口:

public interface StudentMapper {

    @Select("select * from student where cid=#{cid}")
    List<Student> findStudentByCid(Integer cid);
}

测试类测试结果:

public class Test01 {

    private static SqlSession sqlSession;

    private static StudentMapper studentMapper;

    private static ClassesMapper classesMapper;


    static {
        sqlSession = SqlSessionUtils.getSession();
        classesMapper = sqlSession.getMapper(ClassesMapper.class);
        studentMapper = sqlSession.getMapper(StudentMapper.class);
    }

    @Test
    public void test1() {
        List<Classes> classes = classesMapper.findClasses();
        for (Classes aClass : classes) {
            System.out.println(aClass.getId()+","+aClass.getName());
            List<Student> students = aClass.getStudents();
            for (Student student : students) {
                System.out.println("\t"+student);
            }
        }

        sqlSession.close();
    }
}

测试结果:
在这里插入图片描述
3. MyBatis注解实现多对多的查询

因为多对多就是两个一对多,这里我就不赘述了。

MyBatis的SQL构建语句

简单介绍:
在这里插入图片描述
这个内容一般不太常用,我就直接演示一下使用格式。

  • 先定义一个类写出想要实现的SQL语句
public class SqlDao {
    
    public String delete() {

        SQL sql = new SQL() {
            {
                DELETE_FROM("student");
                WHERE("id=#{id}");
            }
        };

        return sql.toString();
    }
}
  • 再定义一个接口来调用这个SQL语句
public interface SqlMapper {

    @DeleteProvider(type = SqlDao.class, method = "delete")
    Integer delete(Integer id);
}
  • 编写测试类来测试结果
public class Test {

    private SqlSession sqlSession;

    private SqlMapper sqlMapper;

    public Test() {
        this.sqlSession = SqlSessionUtils.getSession();
        sqlMapper = sqlSession.getMapper(SqlMapper.class);
    }

    @org.junit.Test
    public void test1() {
        Integer delete = sqlMapper.delete(5);

        System.out.println(delete);
    }
}

测试结果:
在这里插入图片描述

以上就是本次文章的介绍,如果有不恰当的地方,欢迎指正。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值