mybatis实践篇(二)

news2024/11/18 1:45:05

自定义类型处理器(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 {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {

    }

    @Override
    public 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;
    }

    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return null;
    }

    @Override
    public 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: 8784

spring:
  profiles:
    active: dev
  datasource:
    url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    hikari:
      maximum-pool-size: 15 #最大连接数,默认值10.
      minimum-idle: 5 #最小空闲连接,默认值10.
      connection-timeout: 60000 #连接超时时间(毫秒),默认值30.
      #空闲连接超时时间,默认值600000(10分钟),只有空闲连接数大于最大连接数且空闲时间超过该值,才会被释放
      #如果大于等于 max-lifetime 且 max-lifetime>0,则会被重置为0.
      idle-timeout: 600000
      max-lifetime: 1800000 #连接最大存活时间,默认值30分钟.设置应该比mysql设置的超时时间短
      connection-test-query: select 1 #连接测试查询
      auto-commit: true
      pool-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 {
        // mysql
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryConfig.buildSqlSessionFactory();
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {

            FullCityMapper mapper = sqlSession.getMapper(FullCityMapper.class);
            FullCity fullCity = mapper.selectByName("广东省");
            System.out.println("区域名称:" + fullCity.getFullName());
        }

        // postgresql
        SqlSessionFactory 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.coloradmin.cn/o/1541767.html

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

相关文章

python之(19)CPU性能分析常见工具

Python之(19)CPU性能分析常见工具 Author: Once Day Date: 2024年3月24日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏:Python开发_Once-Day的博客…

车载测试 UDS诊断 CANoe使用(线下实操项目)

本周末2天的时间&#xff0c;可以线下带大家对车载项目&#xff1a; uds诊断进行实操训练和CANoe工具的灵活使用 本博主从事新能源汽车的研发部&#xff0c;主要是嵌入式方面的&#xff0c;对车载测试的底层逻辑非常熟悉。 需要项目或者CANoe工具实操的可以关注并私信我

【数据结构和算法初阶(C语言)】二叉树的链式结构--前、中、后序遍历实现详解,节点数目计算及oj题目详解---二叉树学习日记③

1.二叉树的链式存储 二叉树的链式存储结构是指&#xff0c;用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成&#xff0c;数据域和左右指针域&#xff0c;左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存…

[自研开源] MyData v0.7.5 更新日志

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 介绍 MyData …

(ES6)前端八股文修炼Day2

1. let const var 的区别 var&#xff1a; var 是在 ES5 中引入的声明变量的关键字。 具有函数作用域&#xff0c;而不是块作用域&#xff0c;这意味着使用 var 声明的变量在函数内部是可见的。 变量可以被重复声明&#xff0c;而且变量的值可以在声明前使用&#xff0c;这可能…

一文带你看懂甘特图,项目进度、资源分配清清楚楚

带大家看懂一个甘特图&#xff0c;我们打开一个zz-plan 的甘特图&#xff0c;左边是任务栏&#xff0c;右边是进度条&#xff0c;上面这个是时间&#xff0c;下面是一个整个项目的一个状态&#xff0c;任务、工时、周期和进度。 这一列颜色灰色的表示是当天&#xff0c;我们从…

Linux常用命令和基础命令合集---非常推荐

非常好用的Linux通用基础常用命令和高级命令。 下载链接&#xff1a;https://download.csdn.net/download/lishihuijava/89026399

2024腾讯云服务器2核4G、4核8G、8核16G配置最新收费标准

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

城市内涝水文水动力模型软件

原文链接&#xff1a;城市内涝水文水动力模型软件https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598401&idx3&sn0c4c86b3a5d09a75b8f07e6fad81aa9c&chksmfa8200a6cdf589b0970a6854869e8e3a9f132fe40a19977863c091cbcf6d9786f067e0c5651e&token1…

Autosar MCAL配置——ADC

文章目录 前言一、创建Adc硬件单元二、创建、配置Adc通道1.根据电路原理图,有多少ADC采样引脚,就创建多少ADC采样通道。2.配置Adc通道3.配置ADC组4.配置ADC扫描组三、配置ADC通用设置前言 ADC,即Analogue Digital Converter缩写。简单来说,它是将输入的模拟信号转换为数字…

[数据结构]二叉树的建立与遍历(递归)

一、二叉树的遍历与建立 首先我们拥有如下二叉树: 要了解二叉树遍历,我们得先了解二叉树的三种遍历方式:前序遍历,中序遍历,后序遍历 1.前序遍历 前序遍历:根,左子树,右子树 遍历的结果就是:1 2 4 8 N N 9 N N 5 10 N N 11 N N 3 6 N N 7 N N 2.中序遍历 中序遍历:左子树…

SpringCloud-记

目录 什么是SpringCloud 什么是微服务 SpringCloud的优缺点 SpringBoot和SpringCloud的区别 RPC 的实现原理 RPC是什么 eureka的自我保护机制 Ribbon feigin优点 Ribbon和Feign的区别 什么是SpringCloud Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发…

day29|leetcode|C++|491. 非递减子序列|46. 全排列|47. 全排列 II

Leetcode 491. 非递减子序列 链接&#xff1a;491. 非递减子序列 thought: 设 stack 中最后一个值的位置为 last。如果 stack 为空&#xff0c;则 last -1。 设当前正在处理的位置为 pos。如果在 nums 的子区间 [last1, pos) 中&#xff0c;存在和 nums[pos] 相同的值&…

智慧公厕:跨界融合,打造智慧城市新名片

随着城市化进程的不断加快&#xff0c;公共厕所建设成为一个亟待解决的问题。传统的公厕存在着管理繁琐、卫生差、服务不到位等一系列问题&#xff0c;与城市发展的节奏不协调。为此&#xff0c;推进新型智慧公厕建设成为了一个重要的解决方案。智慧公厕的建设需要推进技术融合…

BM56 有重复项数字的全排列(回溯)

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param num int整型一维数组 * return int整型ArrayList<ArrayList<>>*/public void recursion(ArrayList<…

20231911 2022-2023-2 《网络攻防实践》实验三

1.实验内容 1、实践tcpdump 使用tcpdump开源软件对在本机上访问www.tianya.cn网站过程进行嗅探&#xff0c;回答问题&#xff1a;你在访问www.tianya.cn网站首页时&#xff0c;浏览器将访问多少个Web服务器&#xff1f;他们的IP地址都是什么&#xff1f; 2、实践Wireshark 使…

复旦EMBA参访娃哈哈:交流企业创新转型、家族企业管理之道

早在多年前&#xff0c;复旦EMBA同学曾参访娃哈哈集团&#xff0c;与宗庆后先生对话&#xff0c;就国内企业创新转型、家族企业管理之道、“企二代”的成长、企业社会责任等热点问题向其探讨交流。通过面对面的实地企业参访和行业领袖的深入交流&#xff0c;亲身触摸中国科创的…

详解:JS异步解决方案之回调函数,及其弊端

「异步编程」是前端工程师日常开发中经常会用到的技术&#xff0c;异步的实现有好几种方式&#xff0c;各有利弊&#xff0c;本篇先讲通过回调来实现来异步 。 一、同步和异步 同步编程和异步编程是两种不同的编程方式。 同步编程是指按照代码的顺序执行&#xff0c;每一行代…

网络基础知识-DNS与DHCP+网络规划与设计故障诊断+嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记&#xff0c;未经本人许可&#xff0c;请勿转载&#xff0c;如发现本笔记内容的错误还望各位不吝赐教&#xff08;笔记内容可能有误怕产生错误引导&#xff09;。 本章的主要内容见下图&#xff1a; 本章知识和计算机…

springboot3+jdk17+MP整合最新版jersey详细案例,正真做到拿来即用

如题&#xff0c;springboot3.x java17 MP 整合最新jersey&#xff0c;各种请求类型&#xff08;实战/详解&#xff09; 文件上传下载 jersey资源注册 拦截器&#xff08;JWT&#xff09; 跨域处理 全局异常 Valid注解校验 等等 &#xff0c;除非你必须整合security&am…