MyBatis的分页实现和使用注解开发

2022-08-29 14:15:46

这里是基于https://blog.csdn.net/qq_40393135/article/details/97116466中的CRUD的操作的代码进行更改的;

mysql的分页语句

select * from user limit #{startIndex},#{pageSize};
# startIndex : 起始位置 ,默认是0开始
# pageSize :页面大小
# 如何计算出当前页面
currentPage = (currentPage-1)* pageSize

使用limit实现分页

1.编写dao接口

//查询全部用户实现分页
List<User> selectUserByLimit(Map<String,Integer> map);

2.编写对应mapper映射文件的方法

<select id="selectUserByLimit" parameterType="Map" resultType="User">
    select * from mybatis.user limit #{startIndex},#{pageSize}
</select>

3.测试

【模拟分页数据:currentPage,pageSize】

@Test
public void selectUserByLimit(){

    //创建sqlSession
    SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //准备数据
    int currentPage = 2;//当前是第几页
    int pageSize = 2; //页面大小

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("startIndex",(currentPage-1)*pageSize);
    map.put("pageSize",pageSize);

    //测试
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    List<User> users = mapper.selectUserByLimit(map);

    for (User user : users) {
        System.out.println(user);
    }

    sqlSession.close();//关闭连接

}

使用RowBounds实现分页

1.编写接口

//查询全部用户实现分页使用RowBounds
List<User> selectUserByRowBounds();

2编写Mapper映射文件.

<select id="selectUserByRowBounds" resultType="User">
    select * from mybatis.user
</select>

3.编写测试代码

@Test
public void selectUserByRowBounds(){
    //创建sqlSession
    SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
    SqlSession sqlSession = sqlSessionFactory.openSession();

    int currentPage = 2; //当前页
    int pageSize = 2; //页面大小

    RowBounds rowBounds = new RowBounds((currentPage - 1) * pageSize, pageSize);

    //注意点;使用RowBounds就不能使用getMapper了
    //selectList: 接收一个List
    //selectMap: 接收一个Map
    //selectOne : 接收只有一个对象的时候

    List<User> users = sqlSession.selectList("com.zhang.dao.UserDao.selectUserByRowBounds", null, rowBounds);

    for (User user : users) {
        System.out.println(user);
    }
}

当在使用RowBounds就不能使用getMapper了

limit 和 rowBounds区别

  • rowBounds 本质就是封装了limit

  • limit 是在SQL层面实现分页

  • rowBounds 在代码层面实现分页

使用注解反射

早期的,mybatis都是使用xml进行配置的,直到注解的出现,注解可以替代一些xml中的配置 ;

CRUD的注解:

@insert():实现新增

@delete():实现删除操作

@update():实现更改

@select():进行查询

有一个构造器(openSession())可以实现自动提交事务,只要将openSession构造器的参数设置成为true(openSession(true)),则事务会自动提交,我们就不用每次都commit;

优化项目

1.事务优化:自动提交事务;

//获得一个带事务自动提交功能的SqlSession公共的方法
public static SqlSession getSqlSession(){
    //自动提交事务
    return sqlSessionFactory.openSession(true);
}

2.对别名的优化,在pojo包下的类自动设置别名;

<!--配置别名-->
<typeAliases>
    <!--<typeAlias type="com.zhang.pojo.User" alias="User"/>-->
    <package name="com.zhang.pojo"/>
</typeAliases>

3.对mapper的设置路径进行更改

<mappers>
    <!--class对应的是一个接口类-->
    <!--resource对应的是一个接口类的映射文件-->
    <mapper class="com.zhang.dao.Usermapper"/>
</mappers>

使用注解进行开发

1.编写接口;

package com.kuang.dao;

import com.kuang.pojo.User;
import org.apache.ibatis.annotations.*;
import java.util.List;

public interface Usermapper {
    //查询全部用户
    @Select("select * from user")
    List<User> getUserList();

    //通过ID查询用户
    @Select("select * from user where id = #{id}")
    User getUserById(@Param("id") int id);

    //添加用户
    @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(User user);

    //修改用户信息
    @Update("update user set name = #{name}, pwd = #{pwd} where id = #{id}")
    int updateUser(User user);

    //删除用户
    @Delete("delete from user where id =#{uid}")
    int deleteUser(@Param("uid") int id);

}

2.对mybatis的配置文件进行更改;

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!--配置文件修改-->
    <properties resource="database.properties"/>
    <!--Mybatis设置-->
    <settings>
        <!--默认日志实现-->
        <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
        <!--Log4j实现-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!--配置别名-->
    <typeAliases>
        <!--<typeAlias type="com.zhang.pojo.User" alias="User"/>-->
        <package name="com.zhang.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--class对应的是一个接口类-->
        <!--resource对应的是一个接口类的映射文件-->
        <mapper class="com.zhang.dao.Usermapper"/>
    </mappers>

</configuration>

3.编写测试类;

package com.zhang.dao;

import com.zhang.pojo.User;
import com.zhang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import sun.rmi.server.UnicastServerRef;
import java.util.List;

public class UserDaoTest {
    @Test
    public void getUserList(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务
        UserDao mapper = sqlSession.getMapper(Usermapper.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();//关闭sqlSession;
    }

    @Test
    public void getUserById(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务
        UserDao mapper = sqlSession.getMapper(Usermapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);
        sqlSession.close();//关闭sqlSession;
    }
    
    @Test
    public void addUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务
        UserDao mapper = sqlSession.getMapper(Usermapper.class);
        User user = new User(5, "钱七", "赵六");
        int i = mapper.addUser(user);
        System.out.println(i);
        sqlSession.close();//关闭sqlSession;
    }

    @Test
    public void updateUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务
        UserDao mapper = sqlSession.getMapper(Usermapper.class);
        User user = new User(5, "赵六", "钱七");
        int i = mapper.updateUser(user);
        System.out.println(i);
        sqlSession.close();//关闭sqlSession;
    }

    @Test
    public void deleteUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//带自动提交事务
        UserDao mapper = sqlSession.getMapper(Usermapper.class);
        int i = mapper.deleteUser(5);
        System.out.println(i);
        sqlSession.close();//关闭sqlSession;
    }
}

@param的参数一般都写上,如果参数较多的情况下就必须要写;

  • 作者:张*
  • 原文链接:https://blog.csdn.net/qq_40393135/article/details/97114553
    更新时间:2022-08-29 14:15:46