Mybatis 框架学习(四)——如果世界真的那么简单就好了

2022-06-15 19:28:59 浏览数 (1)

文章目录

  • Mybatis 框架学习(四)——如果世界真的那么简单就好了
    • 一、resultMap 结果映射
      • 解决属性名 和数据库字段名不一致的问题
      • 用resultMap标签解决
    • 二、limit分页
      • limit用法回顾
      • mybtais中使用分页查询
    • 三、Mybatis 注解开发
      • 使用注解
      • @Param 传递多个参数
      • @Param 注意的问题
    • 四、使用注解CRUD
      • @Insert

Mybatis 框架学习(四)——如果世界真的那么简单就好了

这一篇的标题是Mybtais的官方文档中的一句话,我觉得很经典,让大家有个印象…

一、resultMap 结果映射

解决属性名 和数据库字段名不一致的问题

就是说我们在java代码中要写一个pojo类,与数据库表的字段相对应,必须名字相同。

我们来看一下,如果名字不同的话

数据库中student表的字段

pojo包下student类我们改成名字不同的属性

原来是 name,我们改成 studentname

运行测试方法

发现所有的name都变成了 null,因为拿到数据库查询后的结果之后会根据字段名字映射到对应的类里面,因为name->studentName 对不上,所以全为null

那么我们如果想要数据库字段与实体类的属性名字不一致的话,怎么实现呢?

用resultMap标签解决

在写select标签的时候,返回值之前我们用的是 resultType返回实体类,这个时候我们可以用resultMap。resultMap后面跟一个id

在上面在写一个具体的resultMap标签

id自己取名字,增删改查的标签使用id直接调用

type对应实体类

里面写result标签,properties对应实体类中的属性,column对应数据库表中的字段,这个result就相当于有个对应关系,我们可以用不一致的属性在实体类中

官方文档的解释和上面的差不多,再看看还说了什么?

如果这个世界总是这么简单就好了

高级结果映射,复杂的sql语句,目前还接触不到,我们在以后的工作中再去应对吧

二、limit分页

分页会减少数据的处理量

sql语句中使用limit进行分页

limit用法回顾

代码语言:javascript复制
select * from student limit n;

相当于查询从第1条到第n条的数据

代码语言:javascript复制
select * from student limit startIndex,pageSize;

startIndex是从那一条开始的

pageSize是一页显示的数据的条数

相当于从第 startIndex开始,显示pageSize 条数据

mybtais中使用分页查询

1.在接口定义一个分页查询的方法,参数是map

代码语言:javascript复制
    // 按照分页来进行查询信息
    List<Student> getUserLimit(Map<String,Integer> map);

2.测试方法里面创建map,传递map参数

代码语言:javascript复制
@Test
    public void getUserlimit(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);

        // 创建map,有两个参数 startIndex 从那一条数据开始查找,pageSize 查找几条信息
        HashMap<String ,Integer> map = new HashMap<String, Integer>();
        map.put("startIndex",2);
        map.put("pageSize",2);
        
        // 调用接口的分页查询方法
        List<Student> students = studentMapper.getUserLimit(map);
        for (Student student:students) {
            System.out.println(student);
        }
        sqlSession.close();
    }

3.在xml文件中,实现方法,并接收map参数

代码语言:javascript复制
        <resultMap id="12" type="student">
            <result property="studentName" column="name"/>
        </resultMap>
    

    <select id="getUserLimit" resultMap="12" parameterType="map">
        select * from student limit #{startIndex},#{pageSize}
    </select>

运行得到正确结果

三、Mybatis 注解开发

使用注解开发

这个咱们还是从官方文档中入手,看看官方文档是怎么说的

咱自己在说一下

1.写完了映射器的类之后,除了使用xml实现方法,还可以用注解的方式来完成映射

2.简单的sql语句使用注解来完成映射会使得很简洁,但是呢要想实现更加复杂的功能那么,注解就没有xml好用了

比如,我们想实现resultMap的功能,但是注解没法完成,xml可以实现

如何使用注解呢?

使用注解

还是从一个简单的sql语句出发,就用查询所有用户

1.在接口中定义方法

代码语言:javascript复制
  // 根据student的 id查询对应的 学生信息
    List<Student> getStudentById(int id);

2.在方法的上面使用注解

代码语言:javascript复制
    // 根据student的 id查询对应的 学生信息
    @Select("select * from student where id=#{id}")
    Student getStudentById(int id);

3.绑定类

在核心配置文件中mappers中注册接口

代码语言:javascript复制
    <mappers>
        <mapper class="mapper.StudentMapper"/>
    </mappers>

4.测试接口

写个测试方法,测一下是否能够正常查询

代码语言:javascript复制
    @Test
    public void getUserByID(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();

        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        Student student = studentMapper.getStudentById(1);
        System.out.println(student);

        sqlSession.close();
    }

5.运行得到结果

查是查到了,但是呢,之前我们使用resultMap 给字段在实体类中有了不同的映射,所以在没有xml,只使用注解的方式,没有办法得到 name这个信息了

@Param 传递多个参数

@Param() 在参数的前面加上这个注解,然后xml就能取得这个参数,以注解中的名字才能取到

1.接口定义方法,传递多个参数

代码语言:javascript复制
    Student getStudentByIDandNAME(@Param("uid") int id,@Param("uname") String name);

2.使用注解拿到参数,实现方法

代码语言:javascript复制
    @Select("select * from student where id=#{uid} and name =#{uname}")
    Student getStudentByIDandNAME(@Param("uid") int id,@Param("uname") String name);

3.注册接口

之前已经注册过了

4.测试方法

代码语言:javascript复制
    @Test
    public void getUserByIDAndNAME(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();

        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        Student student = studentMapper.getStudentByIDandNAME(1,"陈瑞棋");
        System.out.println(student);

        sqlSession.close();
    }

5.运行得到结果

得到正确的结果

@Param 注意的问题

1.基本类型和String类型,如果需要就加上

2.如果是引用类型不需要加,加上反而可能错(我就报异常了)

3.如果只有一个基本类型的参数,可以忽略,但是建议加上

4.我们在sql引用的就是@Param(“uid”)设定的属性名

四、使用注解CRUD

以增为例,其他的 @Delete @Update 都是一样的

@Insert

1.定义方法 注解实现

代码语言:javascript复制
    @Insert("insert into student values(0,#{name},#{age},#{sex})")
    int InsertStudent111(Student student);

2.绑定接口

前面已完成

3.测试方法

代码语言:javascript复制
@Test
    public void InsertStudent111(){
        SqlSession sqlSession = MybatisUtil.getSqlSession();

        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        studentMapper.InsertStudent111(new Student(0,"小小",20,"未知"));

        sqlSession.close();
    }

4.查看数据库,是否插入成功

成功添加。

增删改查的注解开发的操作基本都一样,我就不再演示了。

0 人点赞