Mybatis ResultMap和分页操作示例详解

 更新时间:2023年10月11日 10:41:40   作者:phang  
这篇文章主要为大家介绍了Mybatis ResultMap和分页操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1. ResultMap

现有数据库的字段为:

  • id
  • name
  • pwd

为了其字段的名字,在pojo中的User的字段名和其一样:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    int id;
    String name;
    String pwd;
}

UserMapper.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.UserMapper">
    <select id="getAllUser" resultType="com.pojo.User">
        select * from user
    </select>
</mapp

这样能保证不会出错。若是将User的“pwd”改为“password”,则对应的password结果就会为空。

解决该问题,

方法一:"as"

<select id="getAllUser" resultType="com.pojo.User">
        select id, name, pwd as password from user
    </select>

User字段的为“password”,数据库字段为“pwd”,那就使用Sql的原生语句as,就可以将查询字段和User中字段相对应。

方法二:resultMap(结果映射)

可以使用 <ResultMap>标签将数据库中的字段和User中的字段相对应:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.UserMapper">
    <resultMap id="UserMapper" type="com.pojo.User">
       <!-- column是数据库表的列名 , property是对应实体类的属性名 -->
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="pwd" property="password"/>
    </resultMap>
    <select id="getAllUser" resultMap="UserMapper">
        select * from user
    </select>
</mapper>

其中,单独设置resultMap标签,来使数据库中的字段和User对应上。 resultMap中的id 对应着 <select>标签中的resultMap (原来为resultType)

2. 日志

日志工厂

思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率?

如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题。

对于以往的开发过程,我们会经常使用到debug模式来调节,跟踪我们的代码执行过程。但是现在使用Mybatis是基于接口,配置文件的源代码执行过程。因此,我们必须选择日志工具来作为我们开发,调节程序的工具。

使用方法:

在 mybatis-config.xml 中添加。

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

注意:日志功能的开启是 name = "logImpl", value的值就是各种类型的日志。
注意:

  • value="STDOUT_LOGGING"中不能出现空格,例如 value="STDOUT_LOGGING "就是错误的
  • STDOUT_LOGGING是标准输出日志

Log4j

  • Log4j是Apache的一个开源项目
  • 通过使用Log4j,我们可以控制日志信息输送的目的地:控制台,文本,GUI组件....
  • 我们也可以控制每一条日志的输出格式;
  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
  • 要使用 Log4j首先导入相关的包:
<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
</dependency>
  • 创建 log4j.properties 配置文件:
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/kuang.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
  • 配置 log4j的实现:
<settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
  • log4j简单使用:
  • 导入的包是org.apache.log4j.Logger

一个配置完整的 settings 元素的示例如下:

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

3. 分页

在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进行查询操作,如果查询大量数据的时候,我们往往使用分页进行查询,也就是每次处理小部分数据,这样对数据库压力就在可控范围内。

Limit 分页

#语法
SELECT * FROM table LIMIT stratIndex,pageSize
SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15  
#为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:   
SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.  
#如果只给定一个参数,它表示返回最大的记录行数目:   
SELECT * FROM table LIMIT 5; //检索前 5 个记录行  
#换句话说,LIMIT n 等价于 LIMIT 0,n。

步骤:

  • UserMapper接口中添加:
//选择全部用户实现分页
List<User> selectUser(Map<String,Integer> map);
  • UserMapp.xml中添加:
<select id="selectUser" parameterType="map" resultType="com.pojo.user">
  select * from user limit #{startIndex},#{pageSize}
</select>
  • Test:
@Test
    public void testLimitUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("indexPage",0);
        map.put("endPage",2);
        List<User> userList = userMapper.getLimitByUser(map);
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

4. 注解开发

mybatis最初配置信息是基于 XML ,映射语句(SQL)也是定义在 XML 中的。而到MyBatis 3提供了新的基于注解的配置。不幸的是,Java 注解的的表达力和灵活性十分有限。最强大的 MyBatis 映射并不能用注解来构建。

sql 类型主要分成 :

  • @Select ()
  • @Update ()
  • @Insert ()
  • @Delete ()

注意:利用注解开发就不需要mapper.xml映射文件了 .
在mybatis-config.xml这样导入:

<mappers>
        <mapper class="com.dao.UserMapper" />
    </mappers>

区别于之前的mapper.xml的导入:

<mappers>
        <mapper resource="com/dao/UserMapper.xml"/>
    </mappers>

为了实现事务的提交,在MyBatis中:

public class MyBatisUtils {
    static SqlSessionFactory sqlSessionFactory;
    static {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

中对sqlSessionFactory.openSession()的参数设置:

sqlSessionFactory.openSession(true);就可以实现自动提交事务。

查询

编写接口方法注解

//根据id查询用户
@Select("select * from user where id = #{id}")
User selectUserById(@Param("id") int id);
  • 测试
@Test
public void testSelectUserById() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = mapper.selectUserById(1);
   System.out.println(user);
   session.close();
}

新增

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

Test:

@Test
public void testAddUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = new User(6, "秦疆", "123456");
   mapper.addUser(user);
   session.close();
}

修改

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

删除

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

Test:

@Test
public void testDeleteUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   mapper.deleteUser(6);
   session.close();
}

注意:

  • 增删改一定记得对事务的处理
  • 注释的话,一定要把类通过<mappers class="">注册到 mybatis-config.xml 中去;配置的话,一定要把UserMapper.xml(xxMapper.xml)通过<mappers resouce="">注册到 mybatis-config.xml 中去

@Param

@Param注解用于给方法参数起一个名字。以下是总结的使用原则:

  • 在方法只接受一个参数的情况下,可以不使用@Param。
  • 在方法接受多个参数的情况下,建议一定要使用@Param注解给参数命名。
  • 如果参数是 JavaBean , 则不能使用@Param。
  • 不使用@Param注解时,参数只能有一个,并且是Javabean。

以上就是Mybatis ResultMap和分页操作示例详解的详细内容,更多关于Mybatis ResultMap分页的资料请关注脚本之家其它相关文章!

相关文章

  • mybatis like模糊查询特殊字符报错转义处理方式

    mybatis like模糊查询特殊字符报错转义处理方式

    这篇文章主要介绍了mybatis like模糊查询特殊字符报错转义处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java FileWriter输出换行操作

    Java FileWriter输出换行操作

    这篇文章主要介绍了Java FileWriter输出换行操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot中Redis自动配置的介绍、原理和使用详解

    SpringBoot中Redis自动配置的介绍、原理和使用详解

    这篇文章主要介绍了SpringBoot中Redis自动配置的介绍、原理和使用详解,Redis是一种高性能的键值对存储数据库,它支持多种数据结构和丰富的功能,如缓存、消息队列、计数器、分布式锁等,需要的朋友可以参考下
    2023-08-08
  • Java实现常用加密算法——单向加密算法MD5和SHA

    Java实现常用加密算法——单向加密算法MD5和SHA

    本篇文章主要介绍了Java实现常用加密算法——单向加密算法MD5和SHA,信息加密后数据更安全,需要的朋友可以参考下。
    2016-10-10
  • Mybatis数据批量插入如何实现

    Mybatis数据批量插入如何实现

    这篇文章主要介绍了Mybatis数据批量插入如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 详解SpringBoot可执行Jar包运行原理

    详解SpringBoot可执行Jar包运行原理

    SpringBoot有一个很方便的功能就是可以将应用打成可执行的Jar,那么大家有没想过这个Jar是怎么运行起来的呢,本篇博客就来介绍下 SpringBoot可执行Jar包的运行原理,需要的朋友可以参考下
    2023-05-05
  • Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法

    Java报错:org.springframework.beans.factory.BeanCreationExcepti

    本文解析Spring框架中BeanCreationException的常见原因,如属性类型不匹配、依赖缺失、类加载错误,并提供修正配置、调试日志、清理项目等解决方法,帮助开发者快速定位和修复该异常问题,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • java中的动态代理(jdk和Cglib)实现详解

    java中的动态代理(jdk和Cglib)实现详解

    这篇文章主要介绍了java中的动态代理(jdk和Cglib)的相关资料,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-04-04
  • Java SpringBoot详解集成以及配置Swagger流程

    Java SpringBoot详解集成以及配置Swagger流程

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步
    2021-10-10
  • Spring Mybatis 分页插件使用教程

    Spring Mybatis 分页插件使用教程

    这篇文章主要介绍了Spring Mybatis分页插件使用教程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02

最新评论