【Spring集成MyBatis】核心配置文件

文章目录

  • 1. typeHandlers标签
  • 2. plugins标签
    • 通过PageHelper的API获取分页的信息

1. typeHandlers标签

可以重写类型处理器,或创建类型处理器来处理不支持/非标准的类型。选择性地将它映射到一个JDBC类型:如Java中的Date类型,将其存放到数据库时存成一个1970年至今的毫秒数,取出来的时候转换成java的Date,即java的Date与数据库的varchar毫秒值之间的转换.具体做法是:

  1. 实现org.apache.ibatis.type.TypeHandler接口,或继承很便利的类org.apache.ibatis.type.BaseTypeHandler
  2. 覆盖4个未实现的方法。setNonNullParameter为java程序设置数据到数据库的回调方法,getNullableResult为查询时mysql的字符串类型转换成java的Type类型的方法
  3. 在MyBatis核心配置文件中注册
  4. 测试转换是否正确

在数据库的user表中新建一个字段birthday,类型选择bigint
在这里插入图片描述
写一个插入语句,在XML文件和Java文件中:

<?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.example.demo.dao.UserMapper">

    <insert id="save" parameterType="user">
        insert into user values(#{id}, #{username}, #{password}, #{birthday})
    </insert>

</mapper>
package com.example.demo.dao;

import com.example.demo.domain.User;

public interface UserMapper {
    void save(User user);

}

User类中定义一个birthday属性,更新其Set、Get方法,更新toString方法:

package com.example.demo.domain;

import java.util.Date;

public class User {
    int id;
    String username;
    String password;
    Date birthday;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday=" + birthday +
                '}';
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

写测试代码:

package com.example.demo.service;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

public class ServiceDemo {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//        新建user
        User user = new User();
        user.setUsername("yang");
        user.setPassword("12345");
        user.setBirthday(new Date());

//        执行保存操作
        userMapper.save(user);
        
        sqlSession.commit();

    }
}

但是这时候会报错Data truncated for column 'birthday',则我们就需要
第一步:定义类型处理器,覆盖方法

package com.example.demo.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class DateHandler extends BaseTypeHandler<Date> {
//    将java类型 转换成 数据库需要的类型
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
        long time = date.getTime();
        preparedStatement.setLong(i, time);;
    }

//    将数据库中类型 转换成 java类型
//    String参数:要转换的字段名称
//    ResultSet,查询结果集
    @Override
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
//        获取结果集中需要的数据(long)并转换成Date类型返回
        long slong = resultSet.getLong(s);
        Date date = new java.sql.Date(slong);
        return date;
    }

//    将数据库中类型 转换成 java类型
    @Override
    public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
        long slong = resultSet.getLong(i);
        Date date = new java.sql.Date(slong);
        return date;
    }

//    将数据库中类型 转换成 java类型
    @Override
    public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        Long along = callableStatement.getLong(i);
        Date date = new java.sql.Date(along);
        return date;
    }
}

第二步:在SqlMapConfig中使用<typeHandlers>注册类型处理器
其中handler中写的是类名

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

    <!-- 通过properties标签加载外部properties文件 -->
    <properties resource="jdbc.properties"></properties>

    <!-- 自定义别名 -->
    <typeAliases>
        <typeAlias type="com.example.demo.domain.User" alias="user"></typeAlias>
    </typeAliases>

    <!-- 注册类型处理器 -->
    <typeHandlers>
        <typeHandler handler="com.example.demo.handler.DateHandler"></typeHandler>
    </typeHandlers>

    <!-- 数据源环境 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"></mapper>
    </mappers>

</configuration>

第三步:插入和查询测试
插入测试代码:

package com.example.demo.service;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

public class ServiceDemo {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//        新建user
        User user = new User();
        user.setUsername("yang");
        user.setPassword("12345");
        user.setBirthday(new Date());

//        执行保存操作
        userMapper.save(user);

        sqlSession.commit();
        sqlSession.close();

    }
}

可以看到已经成功保存了:
在这里插入图片描述
执行查询测试:

package com.example.demo.service;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class ServiceDemo {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//        查询
        User user = userMapper.findById(2);
        System.out.println(user.getBirthday());

        sqlSession.commit();
        sqlSession.close();

    }
}

也可以成功查询:
在这里插入图片描述

2. plugins标签

MyBatis可以使用第三方的插件来对功能进行拓展,分页助手PageHelper是将分页的复杂操作进行封装,使用简单的方式即可获得分页相关数据。操作步骤如下:

  1. 导入通用PageHelper坐标
  2. 在MyBatis核心配置文件中配置PageHelper插件
  3. 测试分页数据获取

第一步:导入坐标

<!--        分页助手-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.2</version>
        </dependency>
<!--        解析-->
        <dependency>
            <groupId>com.github.jsqlparser </groupId>
            <artifactId>jsqlparser </artifactId>
            <version>4.6</version>
        </dependency>
    </dependencies>

第二步:配置插件
需要注意的是,<plugins>应该在typeHandlers的后面、<environmnets>的前面,根据给的提示来放置

<!-- 配置分页助手插件 -->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <property name="dialect" value="mysql"/>
    </plugin>
</plugins>

注:PageHelper的5.0以上的版本应该写:

<!-- 配置分页助手插件 -->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>

第三步:测试分页数据获取
写一个查询所有用户的方法:
配置文件:

<select id="findAll" resultType="user">
    select * from user
</select>

接口:

List<User> findAll();

测试:

package com.example.demo.service;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class ServiceDemo {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        List<User> userList = userMapper.findAll();
        for (User user: userList){
            System.out.println(user);
        }
        
        sqlSession.commit();
        sqlSession.close();
    }
}

在配置了分页相关的插件后,只需要简单地设置一下分页的相关参数,其中第一个参数pageNum为当前页,第二个参数pageSize为每页显示的条数:

package com.example.demo.service;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class ServiceDemo {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//        设置分页相关参数,当前页,及每页显示的条数
        PageHelper.startPage(1, 2);

        List<User> userList = userMapper.findAll();
        for (User user: userList){
            System.out.println(user);
        }

        sqlSession.commit();
        sqlSession.close();
    }
}

数据库中一共三条数据:
在这里插入图片描述

当参数为(1,2)时,结果为:
在这里插入图片描述

当参数为(2,2)时,结果为:
在这里插入图片描述

通过PageHelper的API获取分页的信息

虽然能够分页了,但是我们还可以通过API获取一些分页的信息,这样子在写网页的时候就可以通过这些信息来判断是否显示“上一页”、“下一页”、“首页”、“尾页”按钮
当前页数:pageInfo.getPageNum()
每页显示条数:pageInfo.getPageSize()
总条数:pageInfo.getTotal()
总页数:pageInfo.getPages()
上一页:pageInfo.getPrePage()
下一页:pageinfo.getNextPgae()
是否是第一个(bool):pageInfo.isIsFirstPage()
是否是最后一个(bool):pageInfo.isIsLastPage()

package com.example.demo.service;

import com.example.demo.dao.UserMapper;
import com.example.demo.domain.User;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class ServiceDemo {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

//        设置分页相关参数,当前页,及每页显示的条数
        PageHelper.startPage(1, 2);

        List<User> userList = userMapper.findAll();
        for (User user: userList){
            System.out.println(user);
        }

//        获得与分页相关的参数
        PageInfo<User> pageInfo = new PageInfo<User>(userList);
        System.out.println("当前页:" + pageInfo.getPageNum());
        System.out.println("每页显示条数:" + pageInfo.getPageSize());
        System.out.println("总条数:" + pageInfo.getTotal());
        System.out.println("总页数:" + pageInfo.getPages());
        System.out.println("上一页:" + pageInfo.getPrePage());
        System.out.println("下一页:" + pageInfo.getNextPage());
        System.out.println("是否是第一个:" + pageInfo.isIsFirstPage());
        System.out.println("是否是最后一个:" + pageInfo.isIsLastPage());

        sqlSession.commit();
        sqlSession.close();
    }
}

结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/184414.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“土味出海”,屡试不爽!短剧出海引来新一轮爆发?

土味和“钱途”并存的短剧不仅在国内迅猛爆发&#xff0c;今年下半年以来海外市场多部爆火短剧出现&#xff0c;“短剧出海”的话题热度不断攀升&#xff0c;丝毫不差2021年网文出海的盛况。 “霸总的爱&#xff0c;日入千万刀”&#xff0c;是真实存在的&#xff01; 据统计…

快手ConnectionError

因为运行的程序被中断导致 top然后查看站用处内存高的accelerate kill进程号 9回车

概要设计文档案例分享

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口实现方式 6运行设计 6.1运行模块…

图像标记上线,描点信息尽在掌握丨三叠云

图像标记 路径 表单设计 >> 组件 >> 增强组件 功能简介 「图像标记」字段是「增强字段」类型字段。用户通过上传图片的方式构建一个背景图片&#xff0c;并在构建的图片背景上添加描点信息。搭配「仪表盘」中的「图像轨迹」&#xff0c;可绘制出相应的数据轨迹…

MySQL数据库入门到大牛_基础_14_视图及基本操作

本章开始将会介绍表之外的数据库对象。 文章目录 1. 常见的数据库对象2. 视图概述2.1 为什么使用视图&#xff1f;2.2 视图的理解 3. 创建视图3.1 创建单表视图3.2 创建多表联合视图3.3 基于视图创建视图 4. 查看视图5. 更新视图的数据5.1 一般情况5.2 不可更新的视图 6. 修改…

马斯克星链与芯事:30亿美元炸出卫星互联网革命,GPU算力创无限可能

★卫星互联网&#xff1b;算力&#xff1b;卫星通信&#xff1b;互联网&#xff1b;低轨卫星互联网&#xff1b;5G基础设施&#xff1b;GPT-4 Turbo&#xff1b;算力&#xff1b;地面通信&#xff1b;液冷&#xff1b;水冷&#xff1b;AI服务器&#xff1b;东数西算&#xff1b…

收藏这几个开源库,写css你会笑出声

你是否遇到过写css没灵感&#xff0c;写不出酷炫的效果&#xff0c;那这篇文章你一定要看完。知道这几个开源库&#xff0c;它能让你写出炸天的效果并且有效地增加你的摸鱼时长。 1.CSS Inspiration 网址&#xff1a;https://chokcoco.github.io/CSS-Inspiration/#/ CSS Insp…

时间序列分析算法的概念、模型检验及应用

时间序列分析是一种用于研究随时间变化的数据模式和趋势的统计方法。这类数据通常按照时间顺序排列&#xff0c;例如股票价格、气温、销售额等。时间序列分析的目标是从过去的观测中提取信息&#xff0c;以便预测未来的趋势。 以下是关于时间序列分析的一些重要概念、模型检验…

[Android]使用Retrofit进行网络请求

以下是使用 Retrofit 发送 POST 请求获取分页城市列表的 Kotlin 代码示例 1.在你的 build.gradle 文件中添加 Retrofit 和 Gson 的依赖 dependencies {......implementation("com.squareup.retrofit2:retrofit:2.9.0")implementation("com.squareup.retrofit2…

在Linux服务器部署爬虫程序?大佬只需七步!

之前在某乎上看见一篇关于《为什么很多程序员都建议使用 Linux》的文章&#xff0c;结合我自身关于Linux的使用经验。心血来潮得写了一段关于我在Linux系统部署爬虫程序的心得&#xff0c;希望结识更多的爬虫技术大佬&#xff0c;一起游弋在代码世界中。 根据我多年在Linux上部…

基于C#实现Dijkstra算法

或许在生活中&#xff0c;经常会碰到针对某一个问题&#xff0c;在众多的限制条件下&#xff0c;如何去寻找一个最优解&#xff1f;可能大家想到了很多诸如“线性规划”&#xff0c;“动态规划”这些经典策略&#xff0c;当然有的问题我们可以用贪心来寻求整体最优解&#xff0…

vue3.0使用leaflet

1、获取天地图密钥; 访问:https://www.tianditu.gov.cn/ 注册并登录,访问开发资源 =》地图API =》 地图服务=》申请key 应用管理=》创建新应用=》获取到对应天地图key 2、引入leaflet组件 参考资料:https://leafletjs.com/reference.html#path npm install leaflet …

用自己热爱的事赚钱,是多么的幸福

挖掘天赋可能有些困难&#xff0c;但挖掘爱好就简单多啦&#xff01;最幸福的事情就是能用自己喜欢的事情赚钱。 我们要说的是一个博主&#xff0c;他非常喜欢骑自行车&#xff0c;虽然他的工作是在外贸公司做销售&#xff0c;但每当有空时&#xff0c;他都会骑自行车。而且他…

竞赛选题 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

MES管理系统需要与ERP系统协同工作吗

在当前的制造业环境中&#xff0c;信息化、智能化、数字化已经成为了企业转型升级的重要方向。其中&#xff0c;ERP企业管理系统与MES生产管理系统的应用和实施&#xff0c;对于提升企业的运营效率和竞争力具有显著效果。然而&#xff0c;在面对系统工具选择时&#xff0c;许多…

内网横向技术

如果拿下了一台机器之后寻找域控机器 ipconfig /all 找到域名 ping 域名或者nslookup域名

局域网协议:动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)

在局域网络中&#xff0c;DHCP协议通过自动化和简化网络配置过程&#xff0c;提高网络的可管理性和灵活性&#xff0c;使得设备可以更轻松地连接到网络并获得所需的网络配置信息。 文章目录 What is DHCP?DHCP的组成1. DHCP客户端2. DHCP服务器&#xff1a;3. 中继代理&#…

Linux CentOS7的主机名

主机名&#xff0c;也称为计算机名&#xff0c;是提供给网络连接的设备&#xff08;如系统、交换机、路由器等&#xff09;的识别名称。同一网络中不能有两个主机名相同的系统。Linux系统给当前主机命名的目的是能够容易记住&#xff0c;尤其是在部署集群的时候更加方便。 一般…

第二证券:股票破发后面还会涨吗?

许多出资者遇到这样的状况&#xff0c;自己心里也着急及担忧。破发是股价掉破了发行价&#xff0c;这种状况下就会引起出资者的不安。那么股票破发后边还会涨吗&#xff1f;这个问题没有定论&#xff0c;需求从多个视点进行分析和判别。 从经济基础面来看&#xff0c;破发的股…

JSP EL表达式之 empty

好 本文我们还是继续说EL表达式 我们来讲一个非空判断的好手 empty 我们直接编写代码如下 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <%request.setCharacterEncoding("UTF-8");%> <!DOCTYPE html&…