【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;@Overridepublic 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);//        新建userUser 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类型 转换成 数据库需要的类型@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {long time = date.getTime();preparedStatement.setLong(i, time);;}//    将数据库中类型 转换成 java类型
//    String参数:要转换的字段名称
//    ResultSet,查询结果集@Overridepublic 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类型@Overridepublic Date getNullableResult(ResultSet resultSet, int i) throws SQLException {long slong = resultSet.getLong(i);Date date = new java.sql.Date(slong);return date;}//    将数据库中类型 转换成 java类型@Overridepublic 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);//        新建userUser 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();}
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker安装以及idea访问docker

其他目录&#xff1a; docker 安装环境&#xff08;有空更新&#xff09; url “” docker 打包java包&#xff0c;并运行&#xff08;有空更新&#xff09; url “” docker 打包vue &#xff08;有空更新&#xff09; url “” docker 多服务 &#xff08;有空更新&#xff…

2023年亚太杯数学建模A题水果采摘机器人的图像识别功能(matlab 部分代码)

对于1-4问针对的是附录1 中的数据 clc; close all; clear; % 图像文件夹路径 folder_path E:/新建文件夹/yatai/Attachment/Attachment 1/; % 图像文件列表 image_files dir(fullfile(folder_path, *.jpg)); % 假设所有图片都是jpg格式% 解析文件名中的数字&#xff0c;并转…

机器学习探索计划——数据集划分

文章目录 导包手写数据划分函数使用sklearn内置的划分数据函数stratifyy理解举例 导包 import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import make_blobs手写数据划分函数 x, y make_blobs(n_samples 300,n_features 2,centers 3,clus…

Java设计模式系列:单例设计模式

Java设计模式系列&#xff1a;单例设计模式 介绍 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法&#xff08;静态方法&#xff09; 比如 Hiberna…

循环队列的几种实现方式

基于数组来实现循环队列的几种方式 使用 usedSize使用 标志位空出一个位置 方式一 usedSize 0 是则表示当前数组为空 usedSize 数组的长度 则表示当前数组满了方式二 使用一个标记 flag 来判断当前队列是空还是满 如果 flag false 则说明队列为空 如果 flag true 则说…

leetcode:495. 提莫攻击

一、题目 链接&#xff1a;495. 提莫攻击 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;int findPoisonedDuration(int* timeSeries, int timeSeriesSize, int duration) 二、思路 遍历数组timeSeries&#xff0c;如果 元素值duration < 下一元素值 &#x…

GO语言实现txt文本多行合并为一行

windows系统txt文件 input.txt多行合并为一行 package mainimport ("fmt""io/ioutil""strings" )func main() {content, err : ioutil.ReadFile("E:\\gin_demo\\demo30DNF\\youhua\\input.txt")if err ! nil {fmt.Println("Err…

OpenCV快速入门:图像分析——傅里叶变换、积分图像

文章目录 前言一、傅里叶变换1.1 离散傅里叶变换1.1.1 离散傅里叶变换原理1.1.2 离散傅里叶变换公式1.1.3 代码实现1.1.4 cv2.dft 函数解析 1.2 傅里叶变换进行卷积1.2.1 傅里叶变换卷积原理1.2.2 傅里叶变换卷积公式1.2.3 代码实现1.2.4 cv2.mulSpectrums 函数解析 1.3 离散余…

基于深度学习的文本分类

通过构建更复杂的深度学习模型可以提高分类的准确性&#xff0c;即分别基于TextCNN、TextRNN和TextRCNN三种算法实现中文文本分类。 项目地址&#xff1a;zz-zik/NLP-Application-and-Practice: 本项目将《自然语言处理与应用实战》原书中代码进行了实现&#xff0c;并在此基础…

Unity使用DOTween实现分段进度条

文章目录 需求下载安装 DOTween实现实现效果 需求 用组件进度条&#xff08;Slider&#xff09;&#xff0c;利用分段加载进行以假乱真的进度效果&#xff0c;比如说2秒钟到达20%的进度&#xff0c;10秒钟加载20%到50%进度&#xff0c;1分钟加载50%到90%的进度&#xff0c;30秒…

2023年金融信创行业研究报告

第一章 行业概况 1.1 定义 金融信创是指在金融行业中应用的信息技术&#xff0c;特别是那些涉及到金融IT基础设施、基础软件、应用软件和信息安全等方面的技术和产品。这一概念源于更广泛的“信创 (信息技术应用创新)”&#xff0c;即通过中国国产信息技术替换海外信息技术&a…

77 组合问题

给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 class Solution { private: vector<vector<int>> result; // 存放符合条件结果的集合 vector<int> path; // 用来存放符合条件结果 void backtracking(int n, int k , int st…

测试在 Oracle 下直接 rm dbf 数据文件并重启数据库

创建一个新的表空间并创建新的用户&#xff0c;指定新表空间为新用户的默认表空间 create tablespace zzw datafile /oradata/cesdb/zzw01.dbf size 10m;zzw用户已经创建过&#xff0c;这里修改其默认表空间 alter user zzw quota unlimited on zzw; alter user zzw default …

ELK企业级日志分析平台——logstash

部署 新建一台虚拟机elk4部署logstash [rootelk4 ~]# yum install -y jdk-11.0.15_linux-x64_bin.rpm[rootelk4 ~]# yum install -y logstash-7.6.1.rpm 命令方式 [rootelk4 bin]# /usr/share/logstash/bin/logstash -e input { stdin { } } output { stdout {} } elasticsearc…

使用骨传导耳机会伤耳朵吗?一文读懂骨传导耳机有哪些优点

首先说明&#xff0c;如果是正确的使用骨传导耳机是不会伤耳朵。 一、骨传导耳机的传声原理是什么&#xff1f; 声音的传播需要介质&#xff0c;传统的耳机是通过空气来进行传播&#xff0c;也被称为“空气传导耳机”&#xff0c;而骨传导耳机最大的特别之处就在于&#xff0…

AcWing 3384:二叉树遍历(依先序序列建树,输出中序序列) ← DFS

【题目来源】https://www.acwing.com/problem/content/3387/【题目描述】 编写一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。 例如如下的先序遍历字符串&#xff1a;abc##de#g##f###&…

录像机IP地址设置教程:轻松掌握网络连接方法

随着科技的发展&#xff0c;现在的录像机都具备了网络连接的功能&#xff0c;可以通过设置IP地址实现远程和监控。但是很多人对于录像机IP地址的设置方法感到困惑。虎观代理小二二将在本文详细介绍录像机IP地址的设置步骤&#xff0c;帮助您轻松掌握网络连接方法。 首先&#x…

DFS序和欧拉序的降维打击

1. DFS 序和时间戳 1.1 DFS 序 定义&#xff1a;树的每一个节点在深度优先遍历中进、出栈的时间序列。 如下树的 dfs 序就是[1,2,8,8,5,5,2,4,3,9,9,3,6,6,4,7,7,1]。 下图为生成DFS的过程。对于一棵树进行DFS序&#xff0c;除了进入当前节点时对此节点进行记录&#xff0c;…

多线程Thread(初阶二:Thread类及常⻅⽅法)

目录 一、Thread 的常⻅构造⽅法 继承Thread代码&#xff1a; 实现Runnable接口代码: 二、Thread 的⼏个常⻅属性 1、id&#xff1a; 2、获取线程的名字。 3、进程的状态&#xff1a; 4、在java中设置的优先级&#xff0c; 5、是否后台线程&#xff0c; 6、是否存活&a…

ubuntu22.04 arrch64版在线安装node

脚本 #安装node#下载node、npm国内镜像&#xff08;推荐&#xff09;# 判断是否安装了nodeif type -p node; thenecho "node has been installed."elsemkdir -p /home/zenglg cd /home/zenglgwget https://registry.npmmirror.com/-/binary/node/v10.14.1/node-v10.…