mybatis实践篇(二)

自定义类型处理器(TypeHandler)

实体
package com.wyl.mybatis.entity;import java.util.Date;/*** @Description 省市区-字典* @Author wuyilong* @Date 2024-02-26*/public class FullCity {private static final long serialVersionUID = 1L;/*** 主键ID*/private Long id;/*** 名称*/private String name;/*** 区域码*/private String code;/*** 全名称*/private String fullName;/*** 创建时间*/private String createTime;public static long getSerialVersionUID() {return serialVersionUID;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getFullName() {return fullName;}public void setFullName(String fullName) {this.fullName = fullName;}public String getCreateTime() {return createTime;}public void setCreateTime(String createTime) {this.createTime = createTime;}
}
运行程序
package com.wyl.mybatis.demo;import com.wyl.mybatis.config.SqlSessionFactoryConfig;
import com.wyl.mybatis.entity.FullCity;
import com.wyl.mybatis.mapper.FullCityMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;/*** @Description* @Author WuYiLong* @Date 2024/3/14 14:47*/
public class TypeHandlerDemo {private final static Logger log = LoggerFactory.getLogger(TypeHandlerDemo.class);public static void main(String[] args) throws IOException {SqlSessionFactory sqlSessionFactory = SqlSessionFactoryConfig.buildSqlSessionFactory();try (SqlSession sqlSession = sqlSessionFactory.openSession()) {FullCityMapper mapper = sqlSession.getMapper(FullCityMapper.class);FullCity fullCity = mapper.selectByName("广东省");log.info("数据json:{}", fullCity.getCreateTime());}}
}
类型处理器
package com.wyl.mybatis.typehandler;import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;import java.sql.*;
import java.util.Date;/*** @Description* @Author WuYiLong* @Date 2024/3/14 15:18*/
public class DateToStringTypeHandler extends BaseTypeHandler {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {Timestamp timestamp = rs.getTimestamp(columnName);if (timestamp != null) {return DateUtil.format(new Date(timestamp.getTime()),"yyyy-MM-dd HH:mm:dd.SSSSSS");}return null;}@Overridepublic Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return null;}@Overridepublic Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return null;}
}
mybatis-config.xml
 <typeHandlers><package name="com.wyl.mybatis.typehandler"/>
<!--        <typeHandler handler="com.wyl.mybatis.typehandler.DateToStringTypeHandler" javaType="date" jdbcType="DATE"/>--></typeHandlers>


由上面可以知道:通过自定义类型转换器,java类型和mysql类型可以无缝转换。

mybatis集成springboot

maven设置

springboot: v2.7.18
mybatis-spring-boot-starter: v2.3.2

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wyl</groupId><artifactId>mybatis-springboot-demo</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.2</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.3.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.18</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version> <!-- 这里可以选择合适的版本 --><configuration><source>1.8</source> <!-- 这里指定源代码的Java版本 --><target>1.8</target> <!-- 这里指定生成字节码的Java版本 --></configuration></plugin></plugins></build>
</project>
配置文件yml
server:port: 8784spring:profiles:active: devdatasource:url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456hikari:maximum-pool-size: 15 #最大连接数,默认值10.minimum-idle: 5 #最小空闲连接,默认值10.connection-timeout: 60000 #连接超时时间(毫秒),默认值30.#空闲连接超时时间,默认值600000(10分钟),只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放#如果大于等于 max-lifetime 且 max-lifetime>0,则会被重置为0.idle-timeout: 600000max-lifetime: 1800000 #连接最大存活时间,默认值30分钟.设置应该比mysql设置的超时时间短connection-test-query: select 1 #连接测试查询auto-commit: truepool-name: HikariCP # 连接池名称# mybatis
mybatis:mapper-locations: classpath:/mapper/**type-aliases-package: com.wyl.boot.entity
demo结构

启动完成

上面已经完成了mybatis和springboot的集成,包括一些主要的启动配置、文件夹的分布、maven包的下载

多数据源配置

数据库配置文件
# mysql
db.username=root
db.password=root
db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/blog?zeroDateTimeBehavior=CONVERT_TO_NULL&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8# pgsql
db1.username=postgres
db1.password=1234
db1.driver=org.postgresql.Driver
db1.url=jdbc:postgresql://127.0.0.1:5432/postgres?reWriteBatchedInserts=true&stringtype=unspecified
mybatis的配置文件
 <!-- 环境:配置mybatis的环境 --><environments default="development"><!-- 环境变量:可以配置多个环境变量,比如使用多数据源时,就需要配置多个环境变量 --><environment id="development"><!-- 事务管理器 --><transactionManager type="jdbc"></transactionManager><!-- 数据源 --><dataSource type="POOLED"><property name="driver" value="${db.driver}"/><property name="url" value="${db.url}"/><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/></dataSource></environment><environment id="pgsql"><transactionManager type="jdbc"></transactionManager><dataSource type="POOLED"><property name="driver" value="${db1.driver}"/><property name="url" value="${db1.url}"/><property name="username" value="${db1.username}"/><property name="password" value="${db.password}"/></dataSource></environment></environments>
实体类
package com.wyl.mybatis.entity;/*** @Description 省市区-字典* @Author wuyilong* @Date 2024-02-26*/
public class FullCity {private static final long serialVersionUID = 1L;/*** 主键ID*/private Long id;/*** 名称*/private String name;/*** 区域码*/private String code;/*** 全名称*/private String fullName;/*** 创建时间*/private String createTime;public static long getSerialVersionUID() {return serialVersionUID;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getFullName() {return fullName;}public void setFullName(String fullName) {this.fullName = fullName;}public String getCreateTime() {return createTime;}public void setCreateTime(String createTime) {this.createTime = createTime;}
}
package com.wyl.mybatis.entity;/*** @Description* @Author WuYiLong* @Date 2024/3/22 21:47*/
public class User {/*** 主键id*/private Long id;/*** 用户名*/private String username;/*** 密码*/private String password;public Long getId() {return id;}public void setId(Long 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;}
}
mapper接口

/*** @Description* @Author WuYiLong* @Date 2024/3/22 21:48*/
@Mapper
public interface UserMapper {/*** 列表查询* @return*/@Select("select * from public.user")List<User> selectList();}
package com.wyl.mybatis.mapper;import com.wyl.mybatis.entity.FullCity;
import com.wyl.mybatis.page.Page;
import com.wyl.mybatis.req.FullCityReq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;import java.util.List;/**
* @Description 省市区-字典
* @Author wuyilong
* @Date 2024-02-26
*/
@Mapper
public interface FullCityMapper {/*** 根据名称查询* @param name* @return*/FullCity selectByName(@Param("name") String name);/*** 根据名称和code查询* @param name* @param code* @return*/@Select(value = "select * from d_full_city where name = #{name} and code = #{code}")FullCity selectByNameAndCode(@Param("name") String name,@Param("code") String code);/*** 查询省市区* @param fullCityReq* @return*/@Select(value = "select * from d_full_city where name = #{fullCityReq.name}")FullCity selectFullCity(@Param("fullCityReq") FullCityReq fullCityReq);/*** 省市区模糊查询* @param name* @return*/@Select(value = "select * from d_full_city where name regexp #{name}")List<FullCity> selectFullCityLikeName(@Param("name")  String name);/*** 分页* @param page* @return*/@Select("select * from d_full_city")List<FullCity> selectFullCityPage(@Param("page") Page page);/*** 统计表的数量* @param table* @return*/@Select("select count(*) count from #{table}")Integer countTable(@Param("table") String table);
}
数据库加载配置文件
package com.wyl.mybatis.config;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;/*** @Description* @Author WuYiLong* @Date 2024/3/14 9:43*/
public class SqlSessionFactoryConfig {/*** 默认配置* @return* @throws IOException*/public static SqlSessionFactory buildSqlSessionFactory() throws IOException {// 读取mybatis的配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 通过SqlSessionFactoryBuilder 的 build 方法用于解析配置文件并创建 SqlSessionFactory 对象。SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);return sqlSessionFactory;}/*** 多环境配置* @param environment* @return* @throws IOException*/public static SqlSessionFactory buildSqlSessionFactoryEnv(String environment) throws IOException {// 读取mybatis的配置文件InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");// 通过SqlSessionFactoryBuilder 的 build 方法用于解析配置文件并创建 SqlSessionFactory 对象。SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,environment);return sqlSessionFactory;}
}
package com.wyl.mybatis.demo;import com.wyl.mybatis.config.SqlSessionFactoryConfig;
import com.wyl.mybatis.entity.FullCity;
import com.wyl.mybatis.entity.User;
import com.wyl.mybatis.mapper.FullCityMapper;
import com.wyl.mybatis.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.util.List;/*** @Description* @Author WuYiLong* @Date 2024/3/22 21:16*/
public class MoreDataSource {private static final Logger log = LoggerFactory.getLogger(MoreDataSource.class);public static void main(String[] args) throws IOException {// mysqlSqlSessionFactory sqlSessionFactory = SqlSessionFactoryConfig.buildSqlSessionFactory();try (SqlSession sqlSession = sqlSessionFactory.openSession()) {FullCityMapper mapper = sqlSession.getMapper(FullCityMapper.class);FullCity fullCity = mapper.selectByName("广东省");System.out.println("区域名称:" + fullCity.getFullName());}// postgresqlSqlSessionFactory pgsql = SqlSessionFactoryConfig.buildSqlSessionFactoryEnv("pgsql");try (SqlSession sqlSession = pgsql.openSession()) {UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> users = mapper.selectList();for (User user : users) {log.info("用户名称:{},密码:{}",user.getUsername(),user.getPassword());}}}
}

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

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

相关文章

第十三届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 裁纸刀试题 B: 寻找整数试题 C : \mathrm{C}: C: 求和试题 D: GCD试题 E: 蜂巢试题 F : \mathrm{F}: F: 全排列的价值试题 G: 青蛙过河试题 H \mathrm{H} H : 因数平方和试题 I: 最优清零方案试题 J : \mathrm{J}: J: 推导部分和 发现…

Unity Mesh简化为Cube mesh

Mesh简化为Cube mesh &#x1f373;食用&#x1f959;子物体独立生成CubeMesh&#x1f96a;合并成一个CubeMesh&#x1f32d;Demo &#x1f373;食用 下载并导入插件&#x1f448;即可在代码中调用。 &#x1f959;子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11&#xff0c;发现了一个小麻烦事&#xff0c;如下图&#xff1a; 当我想使用svn或git的时候必须要多点一下&#xff0c;这忍不了&#xff0c;无形之中加大了工作量&#xff01; 于是&#xff0c;菜单全显示教程如下&#xff1a; 第一步&#xff1a;管…

C#宿舍信息管理系统

简介 功能 1.发布公告 2.地理信息与天气信息的弹窗 3.学生信息的增删改查 4.宿舍信息的增删改查 5.管理员信息的增删改查 6.学生对宿舍物品的报修与核实 7.学生提交请假与销假 8.管理员对保修的审批 9.管理员对请假的审批 技术 1.采用C#\Winform开发的C\S系统 2.采用MD5对数据…

Centos7安装Python3.8

1.安装编译相关工具 yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel yum install libffi-devel -y2.下载安装包…

GPT模型部署后续:聊天机器人系统的扩展与优化

一、多轮对话支持 为了实现多轮对话支持&#xff0c;我们需要维护用户的会话上下文。这可以通过在服务器端使用一个字典来存储会话状态实现。 目录 一、多轮对话支持 下面是一个简单的扩展例子&#xff1a; 二、性能优化 三、用户界面与交互优化 下面是一个简单的HTML示例&…

一文搞懂 YOLOv9 训练推理全流程 | YOLOv9你绝对不知道的细节!

文章地址&#xff1a;https://arxiv.org/pdf/2402.13616.pdf 代码地址&#xff1a;https://github.com/WongKinYiu/yolov9 前言 在这篇博客中&#xff0c;我们来聊聊 YOLOv9。首先&#xff0c;值得注意的一点是&#xff0c;YOLOv9的变化相对较小&#xff0c;它仍然基于YOLOv5的…

微信小程序button动态跳转到页面

微信小程序中如何动态的跳转到某个页面。 目录 1、首先在js文件中定义事件函数 2、在页面中进行传参调用 3、其它跳转方法简单说明 1、首先在js文件中定义事件函数 goto(e){const urle.currentTarget.dataset.url;wx.navigateTo({url: url})}, 2、在页面中进行传参调用 &l…

【随笔】Git -- 常用命令(四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

带你学会深度学习之循环神经网络[RNN] - 2

前言 笔者写下此系列文章是希望在复习人工智能相关知识同时为想学此技术的人提供一定帮助。 图源网络&#xff0c;所有者可随时联系笔者删除。 代码不代表全部实现&#xff0c;只是为展示模型的关键结构。 与CNN不同&#xff0c;RNN被设计用来处理序列数据。它通过在网络的…

3GPP 协议资料学习和文档下载

一、登录3GPP官网 3GPP – The Mobile Broadband Standard 二、选择Specifications Per TSG Round 三、选择ftp下载路径 四、选择不同阶段的3GPP协议 包含了从1999年到R18,甚至更新到当前最新的协议。 五、查看对应版本的LTE或者5G NR协议 其中LTE射频相关章节为36.521系列&…

小目标检测篇 | YOLOv8改进之增加小目标检测层(针对Neck网络为AFPN)

前言:Hello大家好,我是小哥谈。小目标检测是计算机视觉领域中的一个研究方向,旨在从图像或视频中准确地检测和定位尺寸较小的目标物体。相比于常规目标检测任务,小目标检测更具挑战性,因为小目标通常具有低分辨率、低对比度和模糊等特点,容易被背景干扰或遮挡。本篇文章就…

MP4如何把视频转MOV格式? MP4视频转MOV格式的技巧

在现代的数字媒体时代&#xff0c;视频格式转换成为了许多用户必须掌握的技能。特别是将MP4视频转换为MOV格式&#xff0c;这对于需要在Apple设备上播放或编辑视频的用户来说尤为重要。本文将详细介绍如何将MP4视频转换为MOV格式&#xff0c;帮助读者轻松应对不同设备和平台的需…

三端可调正稳压器集成电路D317——输出电压范围是1.2V至37V,负载电流最大为1.5A

D317大电流可调稳压电路 1、 概述&#xff1a; D317是一款三端可调正稳压器集成电路&#xff0c;其输出电压范围是1.2V至37V&#xff0c;负载电流最大为1.5A。它的使用非常简单&#xff0c;仅需两个外接电阻来设置输出电压。此外&#xff0c;它的电压线性度和负载调整率也比标准…

使用Python制作一个批量查询搜索排名的SEO免费工具

搭建背景 最近工作中需要用上 Google SEO&#xff08;搜索引擎优化&#xff09;&#xff0c;有了解过的朋友们应该都知道SEO必不可少的工作之一就是查询关键词的搜索排名。关键词少的时候可以一个一个去查没什么问题&#xff0c;但是到了后期&#xff0c;一个网站都有几百上千…

浏览器工作原理与实践--渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的

在上一篇文章中我们介绍了导航相关的流程&#xff0c;那导航被提交后又会怎么样呢&#xff1f;就进入了渲染阶段。这个阶段很重要&#xff0c;了解其相关流程能让你“看透”页面是如何工作的&#xff0c;有了这些知识&#xff0c;你可以解决一系列相关的问题&#xff0c;比如能…

获取第三方小程序指定页面的path

获取第三方小程序指定页面的path wx.navigateToMiniProgramappIdpathwx.navigateToMiniProgram 在开发小程序时需要跳转到第三方小程序指定页面时,需通过wx.navigateToMiniProgram方法完成。其中有两个主要参数appId和path,文本以问卷星为例,分享两者获取方法。 appId 在…

使用Python批量实现文件夹下所有Excel文件的第二张表合并

目录 一、前言 二、准备工作 三、实现步骤 遍历文件夹获取所有Excel文件 读取每个Excel文件的第二张表 合并所有表格 主函数 四、案例实践 五、注意事项 六、扩展与改进 七、总结 在数据处理和分析中&#xff0c;经常需要对多个Excel文件进行批量操作&#xff0c;特…

代码随想录阅读笔记-栈与队列【滑动窗口最大值】

题目 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶&#xff1a; 你能在线性时间复杂度内解决此题吗&#xff1f; 提示&am…

如何提升FFmpeg 1‰的转码性能

在8K视频编解码特别是解码部分&#xff0c;我做了一些优化工作&#xff0c;转码速度提升了50%以上。专家们评价曰&#xff1a;“主要围绕算法并行度的优化&#xff0c;属于算法性能优化的常规手段&#xff0c;在创新性和技术难度方面的体现较为一般”。评价过于犀利&#xff0c…