文章目录
一. 问题背景
二. 参考博客
三. 数据库表的int型转为实体类的int型
四. 其他类型转换的方案
五. Mybatis逆向工程类型转换的原理
六. int型转成int型的实现原理
一. 问题背景
IDE: IntelliJ IDEA 2019.1版本 后台: SpringBoot 2.3.1版本 MySQL: 5.7.25版本
情况:使用mybatis逆向工程生成实体类,但是数据库里面表的字段本来是int型,到了实体类就变成了Integer型,我的需求是int型->int型,而不是int型->Integer型。因此需要修改配置。本文将介绍修改字段类型映射的方法以及原理,与字段类型映射有关的问题都大概会讲到。
效果如下: 如果上图不是大家想要的效果或者不想了解字段类型映射的原理,可以忽略下面的内容了,因为篇幅比较长。 如果对mybatis逆向工程有兴趣或想知道怎么搭建逆向工程,可以看看这篇MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了
本文适合将数据库字段的short型转为Integer型、tinyint转化为Byte类型、tinyint转为Integer类型等等以及类型转换原理的情况。
二. 参考博客
在这里感谢以下博客:
修改mybatis-generator中数据库类型和Java类型的映射关系。适合修改简单的数据库类型和Java类型的映射关系。操作简单
自定义mybatis-generator自动生成代码时的类型转换。适合一般情况的数据库类型转为Java类型。操作简单。
mybatis3逆向工程Short类型转Integer。适合解决不了类型转换的情况,当然本文也有讲述,而且非常详细。
三. 数据库表的int型转为实体类的int型
3.1 前言
本文需要搭好mybatis逆向工程环境,详情可以查看MyBatis generator逆向工程_超详细解说_0基础入门_一篇就够了中的搭建环境部分 。这里第三节给出的实现步骤是解决int型->int型。其他类型转其他类型后面小节也会讲述。
3.2 步骤
创建一个类(类名随意),并继承JavaTypeResolverDefaultImpl。代码如下:
public class MyJavaTypeResolverDefaultImpl extends JavaTypeResolverDefaultImpl {
@Override
protected FullyQualifiedJavaType overrideDefaultType ( IntrospectedColumn column, FullyQualifiedJavaType defaultType) {
FullyQualifiedJavaType answer = defaultType;
switch ( column. getJdbcType ( ) ) {
case 4 : / / int 型字段的getJdbcType ( ) 都是4
if ( "INT" . equals ( column. getActualTypeName ( ) ) ) {
answer = new FullyQualifiedJavaType ( "int" ) ;
}
break ;
case - 7 :
answer = calculateBitReplacement ( column, defaultType) ;
break ;
case 2 :
case 3 :
answer = this . calculateBigDecimalReplacement ( column, defaultType) ;
break ;
case 91 :
answer = this . calculateDateType ( column, defaultType) ;
break ;
case 92 :
answer = this . calculateTimeType ( column, defaultType) ;
break ;
case 93 :
answer = this . calculateTimestampType ( column, defaultType) ;
}
return answer;
}
}
解释: 这个方法是重写父类JavaTypeResolverDefaultImpl的方法。原理后面会讲述
在generatorConfig.xml的标签
中,使用
的type 属性配置刚才定义的类,如下:
< context>
< javaTypeResolver type = " com.icbc.demo.config.MyJavaTypeResolverDefaultImpl" >
< property name = " forceBigDecimals" value = " false" />
javaTypeResolver>
context>
解释:type的值必须是全类名(要有全路径)
至此,启动逆向工程即可。注意需要用类启动方式,不能用插件启动,插件启动会有很多问题 。
四. 其他类型转换的方案
一般情况下,只需配置简单的配置项或者修改一两句代码就可以了,无需使用上面那种自定义类的方法。
4.1 方案一
在generatorConfig.xml中的标签里,使用
,如下:
< table tableName = " user2" domainObjectName = " User2"
enableCountByExample = " false" enableUpdateByExample = " false"
enableDeleteByExample = " false" enableSelectByExample = " false"
selectByExampleQueryId = " false" >
< columnOverride column = " 数据库字段类型" javaType = " 你想要的类型" />
table>
4.2 方案二
创建一个类实现JavaTypeResolver
接口,将JavaTypeResolverDefaultImpl
里面的所有代码都复制到自定义类里面。
打开JavaTypeResolverDefaultImpl源码,它有一个构造方法,如下:
public JavaTypeResolverDefaultImpl ( ) {
this . typeMap. put ( 2003 , new JavaTypeResolverDefaultImpl. JdbcTypeInformation ( "ARRAY" , new FullyQualifiedJavaType ( Object. class . getName ( ) ) ) ) ;
this . typeMap. put ( - 5 , new JavaTypeResolverDefaultImpl. JdbcTypeInformation ( "BIGINT" , new FullyQualifiedJavaType ( Long. class . getName ( ) ) ) ) ;
. . .
}
我们只需找到数据库字段的类型,并 将你想要的类型修改到后面(当然这是在自定义的那个类里面修改,因为没有下载源码的话,源码是只读的,不可写) 即可,如下: 然后启动逆向工程即可。推荐使用类启动方式,插件启动有很多问题。
五. Mybatis逆向工程类型转换的原理
首先要知道mybatis使用JavaTypeResolverDefaultImpl
实现类型转换的,这个类实现了JavaTypeResolver
接口。(从这里可以知道,我们想自定义类型转换,只需创建一个类并实现这个接口,根据JavaTypeResolverDefaultImpl
中的代码复制过去就可以,然后修改成自己想要的效果)
JavaTypeResolverDefaultImpl
其中最最最关键的方法是calculateJavaType()
,如下:
public FullyQualifiedJavaType calculateJavaType ( IntrospectedColumn introspectedColumn) {
FullyQualifiedJavaType answer = null;
JavaTypeResolverDefaultImpl. JdbcTypeInformation jdbcTypeInformation =
( JavaTypeResolverDefaultImpl. JdbcTypeInformation)
this . typeMap. get ( introspectedColumn. getJdbcType ( ) ) ;
if ( jdbcTypeInformation != null) {
answer = jdbcTypeInformation. getFullyQualifiedJavaType ( ) ;
answer = this . overrideDefaultType ( introspectedColumn, answer) ;
}
return answer;
}
再看看overrideDefaultType()
,如下:
protected FullyQualifiedJavaType overrideDefaultType ( IntrospectedColumn column, FullyQualifiedJavaType defaultType) {
FullyQualifiedJavaType answer = defaultType;
switch ( column. getJdbcType ( ) ) {
case - 7 :
answer = this . calculateBitReplacement ( column, defaultType) ;
break ;
case 2 :
case 3 :
answer = this . calculateBigDecimalReplacement ( column, defaultType) ;
break ;
case 91 :
answer = this . calculateDateType ( column, defaultType) ;
break ;
case 92 :
answer = this . calculateTimeType ( column, defaultType) ;
break ;
case 93 :
answer = this . calculateTimestampType ( column, defaultType) ;
}
return answer;
}
解释: 先获取数据库字段的类型,做case匹配,再进行相应的处理。处理完后返回出去。
总结1:首先是calculateJavaType()
方法,其中会获取数据库字段的类型,然后根据mybatis写好的转换类型关系获取要转成什么类型。如果获取到的对象不为空,最终会调用overrideDefaultType()
方法,该方法返回出去的类型就是最终要转换的类型。
总结2:要转换成什么类型,最终由overrideDefaultType()
方法决定,因此我们需要修改类型转换关系,只需修改overrideDefaultType()
方法。
上面 有很多calculateXxxxType()
方法 ,因此 我们来看一两个这些方法,如下:
protected FullyQualifiedJavaType calculateTimestampType ( IntrospectedColumn column, FullyQualifiedJavaType defaultType) {
FullyQualifiedJavaType answer;
if ( this . useJSR310Types) {
answer = new FullyQualifiedJavaType ( "java.time.LocalDateTime" ) ;
} else {
answer = defaultType;
}
return answer;
}
protected FullyQualifiedJavaType calculateBitReplacement ( IntrospectedColumn column, FullyQualifiedJavaType defaultType) {
FullyQualifiedJavaType answer;
if ( column. getLength ( ) > 1 ) {
answer = new FullyQualifiedJavaType ( "byte[]" ) ;
} else {
answer = defaultType;
}
return answer;
}
可以看到,这些calculateXxxxType()
方法,最终都是返回new FullyQualifiedJavaType("类型")
。
总结:因此我们可以使用new FullyQualifiedJavaType("类型")
返回出去我们想要转换成的类型。
再来看看可以填写什么类型 ,点进看看FullyQualifiedJavaType
类,发现有好多这些get()方法,并且返回值都是new FullyQualifiedJavaType("类型")
,如下:
public static final FullyQualifiedJavaType getIntInstance ( ) {
if ( intInstance == null) {
intInstance = new FullyQualifiedJavaType ( "int" ) ;
}
return intInstance;
}
public static final FullyQualifiedJavaType getNewMapInstance ( ) {
return new FullyQualifiedJavaType ( "java.util.Map" ) ;
}
public static final FullyQualifiedJavaType getNewListInstance ( ) {
return new FullyQualifiedJavaType ( "java.util.List" ) ;
}
public static final FullyQualifiedJavaType getNewHashMapInstance ( ) {
return new FullyQualifiedJavaType ( "java.util.HashMap" ) ;
}
public static final FullyQualifiedJavaType getNewArrayListInstance ( ) {
return new FullyQualifiedJavaType ( "java.util.ArrayList" ) ;
}
public static final FullyQualifiedJavaType getNewIteratorInstance ( ) {
return new FullyQualifiedJavaType ( "java.util.Iterator" ) ;
}
public static final FullyQualifiedJavaType getStringInstance ( ) {
if ( stringInstance == null) {
stringInstance = new FullyQualifiedJavaType ( "java.lang.String" ) ;
}
return stringInstance;
}
public static final FullyQualifiedJavaType getBooleanPrimitiveInstance ( ) {
if ( booleanPrimitiveInstance == null) {
booleanPrimitiveInstance = new FullyQualifiedJavaType ( "boolean" ) ;
}
return booleanPrimitiveInstance;
}
public static final FullyQualifiedJavaType getObjectInstance ( ) {
if ( objectInstance == null) {
objectInstance = new FullyQualifiedJavaType ( "java.lang.Object" ) ;
}
return objectInstance;
}
public static final FullyQualifiedJavaType getDateInstance ( ) {
if ( dateInstance == null) {
dateInstance = new FullyQualifiedJavaType ( "java.util.Date" ) ;
}
return dateInstance;
}
如以上代码所示,都是可以填写到new FullyQualifiedJavaType("类型")
中的类型。
总结:我们最最最最终可以使用new FullyQualifiedJavaType("类型")
将自己想要的类型返回出去。
六. int型转成int型的实现原理
第三节给出了int型->int型的解决方法,它的原理是这样的。
来到这个calculateJavaType()
方法(可以在这个方法打断点)如下:
public FullyQualifiedJavaType calculateJavaType ( IntrospectedColumn introspectedColumn) {
FullyQualifiedJavaType answer = null;
JavaTypeResolverDefaultImpl. JdbcTypeInformation jdbcTypeInformation
= ( JavaTypeResolverDefaultImpl. JdbcTypeInformation)
this . typeMap. get ( introspectedColumn. getJdbcType ( ) ) ;
if ( jdbcTypeInformation != null) {
answer = jdbcTypeInformation. getFullyQualifiedJavaType ( ) ;
answer = this . overrideDefaultType ( introspectedColumn, answer) ;
}
return answer;
}
来到overrideDefaultType()
这个方法,如下:
protected FullyQualifiedJavaType overrideDefaultType ( IntrospectedColumn column, FullyQualifiedJavaType defaultType) {
FullyQualifiedJavaType answer = defaultType;
switch ( column. getJdbcType ( ) ) {
case - 7 :
answer = this . calculateBitReplacement ( column, defaultType) ;
break ;
case 2 :
case 3 :
answer = this . calculateBigDecimalReplacement ( column, defaultType) ;
break ;
case 91 :
answer = this . calculateDateType ( column, defaultType) ;
break ;
case 92 :
answer = this . calculateTimeType ( column, defaultType) ;
break ;
case 93 :
answer = this . calculateTimestampType ( column, defaultType) ;
}
return answer;
}
因此我写了一个类并继承MyJavaTypeResolverDefaultImpl
,重写了这个overrideDefaultType()
方法,如下:
public class MyJavaTypeResolverDefaultImpl extends JavaTypeResolverDefaultImpl {
@Override
protected FullyQualifiedJavaType overrideDefaultType ( IntrospectedColumn column, FullyQualifiedJavaType defaultType) {
FullyQualifiedJavaType answer = defaultType;
switch ( column. getJdbcType ( ) ) {
case 4 :
if ( "INT" . equals ( column. getActualTypeName ( ) ) ) {
answer = new FullyQualifiedJavaType ( "int" ) ;
}
break ;
case - 7 :
answer = calculateBitReplacement ( column, defaultType) ;
break ;
case 2 :
case 3 :
answer = this . calculateBigDecimalReplacement ( column, defaultType) ;
break ;
case 91 :
answer = this . calculateDateType ( column, defaultType) ;
break ;
case 92 :
answer = this . calculateTimeType ( column, defaultType) ;
break ;
case 93 :
answer = this . calculateTimestampType ( column, defaultType) ;
}
return answer;
}
}
从上面可以看到,其实就是利用了最最最终会调用到的overrideDefaultType()
,以及最终返回出去的new FullyQualifiedJavaType("类型")
。
有问题的小伙伴可留言
你可能感兴趣的:(MyBatis,每日一写)
insert into select 主键自增_mybatis拦截器实现主键自动生成
weixin_39521651
insert into select 主键自增 mybatis delete返回值 mybatis insert返回主键 mybatis insert返回对象 mybatis plus insert返回主键 mybatis plus 插入生成id
前言前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。他的回答是他们项目目前的id都是采用雪花算法来生成,因此为了项目稳定性,不会切换id的生成方式。朋友问我有没有什么实现思路,他们公司的orm框架是mybatis,我就建议他说,不然让你老大把mybatis切换成mybatis-plus。mybat
MyBatis 详解
阿贾克斯的黎明
java mybatis
目录目录一、MyBatis是什么二、为什么使用MyBatis(一)灵活性高(二)性能优化(三)易于维护三、怎么用MyBatis(一)添加依赖(二)配置MyBatis(三)创建实体类和接口(四)使用MyBatis一、MyBatis是什么MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。它可以通过简
mybatis 二级缓存失效_Mybatis 缓存原理及失效情况解析
weixin_39844942
mybatis 二级缓存失效
这篇文章主要介绍了Mybatis缓存原理及失效情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1、什么是缓存[Cache]存在内存中的临时数据。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。2、为什么要使用缓存减少和数据库的交互次
详解mybatis的一二级缓存以及缓存失效原因
仰望天花板
缓存 数据库 mybatis java mysql
数据库的大部分场景下是从磁盘读取,如果数据从内存进行读取,速度较比磁盘要快得多。但因为内存的容量有限,所以一般只会把使用和查询较多的数据缓存起来,以便快速反应,其他使用率不太多的继续存放在磁盘。mybatis分为一级缓存和二级缓存1.一级缓存一级缓存存放在SqlSqeeion上,默认开启1.1pojo@DatapublicclassRole{privateLongid;privateStringr
36. MyBatis如何支持多数据库操作?如何配置不同的数据源?
这孩子叫逆
Mybatis笔记 mybatis 数据库
在许多企业级应用中,可能需要访问多个数据库。MyBatis可以通过配置多个数据源和动态切换数据源来支持多数据库操作。下面介绍如何在MyBatis中配置和使用多个数据源。1.多数据源的基本配置1.1配置多个数据源要支持多个数据源,首先需要在Spring或SpringBoot中配置不同的数据源。假设我们要连接两个数据库db1和db2,可以通过以下步骤进行配置。SpringBoot示例:applicat
MyBatis批量插入大量数据
小黑屋说YYDS
MyBatis java
1.思路分析批量插入这个问题,我们用JDBC操作,其实就是两种思路吧:用一个for循环,把数据一条一条的插入(这种需要开启批处理)。生成一条插入sql,类似这种insertintouser(username,address)values(‘aa’,‘bb’),(‘cc’,‘dd’)…。到底哪种快呢?我们从两方面来考虑这个问题:插入SQL本身执行的效率。网络I/O。先说第一种方案,就是用for循环循
MyBatis 查询数据库_mybatis查询某个库的所有表名(2)
2401_84181942
程序员 mybatis oracle tomcat
标签说明:***``标签**:需要指定namespace属性,表示命名空间,值为mapper接口的全限定名,包括全包名.类名。***``查询标签**:是用来执行数据库的查询操作的:`id`:是和Interface(接口)中定义的方法名称一样的,表示对接口的具体实现方法。`resultType`:是返回的数据类型,也就是开头我们定义的实体类。####2.4.4添加Service服务层实现代码如下:@
5-【JavaWeb】JUnit 单元测试及JUL 日志系统
weixin_44329069
JavaWeb junit 单元测试
1.使用JUnit进行单元测试JUnit是Java中非常流行的单元测试框架,MyBatis与JUnit可以很好地结合,来测试持久层代码的正确性。1.1添加JUnit依赖在使用JUnit之前,需要在pom.xml中引入JUnit依赖。junitjunit4.13.2test1.2单元测试基本结构假设我们要测试UserMapper中的getUserById方法,测试代码如下:importorg.apa
【免费】springboot项目申报管理系统|毕业设计|Javaweb项目
计算机学姐来啦
springboot ssm java spring boot 课程设计 后端 毕设 毕业设计 java-ee
收藏点赞不迷路关注作者有好处编号:springboot375springboot项目申报管理系统开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis工具:IDEA/Ecilpse、Navicat、Maven1.万字文档展示(部分)2.系统图片展示第5章系统详细设计5.1管理员功能模块的实现5.1.1项目列表如图5.1显示的就是项目列表页面,此页面提供给管理员的
MyBatis系统学习(一)——项目结构及其含义
OEC小胖胖
MyBatis mybatis 学习 web 后端
1.MyBatis简介MyBatis是一款优秀的持久层框架,它通过SQL映射的方式实现Java对数据库操作的映射,既保留了SQL语句的灵活性,也简化了代码的编写。在一个MyBatis项目中,核心部分主要有:配置文件(mybatis-config.xml)映射文件(Mapper.xml)实体类(Entity/POJO)接口类(Mapper接口)MyBatis会话工厂(SqlSessionFactor
MyBatis 如何将 Mapper 接口与其 XML 映射文件关联:深入原理与实现
OEC小胖胖
web后端 mybatis xml java web 后端
MyBatis如何将Mapper接口与其XML映射文件关联:深入原理与实现1.概述MyBatis是一个简单、灵活的持久层框架,它通过SQL语句将Java对象与数据库进行映射。MyBatis支持基于XML和注解的配置方式。在实际开发中,XML映射文件与Mapper接口的关联是MyBatis的核心功能之一。通过这种关联,开发者可以在Mapper接口中定义方法,并在XML文件中编写SQL语句,从而实现数
Mybatis实现员工管理系统
wu1113_
mybatis java maven
文章目录1.案例需求2.编程思路3.案例源码4.小结1.案例需求在上次做的父子模块的maven以及Ajax实现人工管理系统的基础上使用Mybatis实现员工管理系统的增删改查,具体运行效果如下:2.编程思路Mybatis框架的一般执行流程:创建MyBatis配置文件mybatis-config.xml在里面加载数据源、事务等,管理映射文件创建需要的映射文件mapper.xml,用于映射表中列和实体
springboot+mybatisplus实现基本的增删改查以及分页查询。这里使用的是Restful风格包括简单描述Restful是什么
okchan666
spring boot java
先实现springboot+mybatisplus的增删改查接口使用postman测试:第一步创建项目导入依赖:直接给大家了:4.0.0org.springframework.bootspring-boot-starter-parent2.6.6com.okchanspringboot_07_ssmp0.0.1-SNAPSHOT1.8org.springframework.bootspring-b
MyBatis 方法重载的陷阱及解决方案
molashaonian
mybatis 方法重载 异常 方法名相同
在使用MyBatis进行开发时,尤其是使用注解模式(如@Select、@Insert等)时,开发者常常会遇到这样一个问题:为什么我的方法重载不能正常工作?即使在Java中允许方法名相同但参数不同的重载,MyBatis在处理注解的SQL方法时却并不支持这种方式。这篇文章将深入探讨MyBatis的这个特性及如何规避相关的坑。问题背景在标准的Java开发中,方法重载是一种常见的设计模式。方法重载允许我们
Spring Cloud+Spring Boot+Mybatis+Java版电子招标采购系统源码 及 功能清单
Xiaohong0716
mybatis java spring cloud
一、立项管理1、招标立项申请功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。2、非招标立项申请功能点:非招标立项申请入口、用户可以保存为草稿、提交。3、采购立项列表功能点:对草稿进行编辑,驳回的立项编辑,在途流程查看。二、项目管理1、采购计划管理功能点:采购计划新增、编辑、删除2、采购过程管理功能点:查询、维护基准价、组建评审小组、项目答疑澄清、文件费保证金审核、供应商报价维护、查看评审
BindingException: Invalid bound statement (not found)
小卡车555
MyBatis mybatis java mysql
Mybatis出现绑定异常问题的解决org.apache.ibatis.binding.BindingException:Invalidboundstatement(notfound)一般的原因是Mapperinterface和xml文件的定义对应不上,需要检查包名,namespace,函数名称等能否对应上,需要比较细致的对比,我经常就是写错了一两个字母搞的很长时间找不到错误按以下步骤一一执行:1
工程项目管理系统源码与Spring Cloud:实现高效系统管理与二次开发
微服务技术分享
spring cloud java 工程项目管理系统源码
随着企业规模的不断扩大和业务的快速发展,传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,企业需要借助先进的数字化技术进行转型。本文将介绍一款采用SpringCloud+SpringBoot+Mybatis技术框架的工程项目管理系统,该系统涵盖了项目管理、合同管理、预警管理、竣工管理、质量管理等多个方面,通过数据字典、编码管理、用户管理
[附源码]SSM计算机毕业设计游戏账号交易平台JAVA
计算机程序源码
java 游戏 mysql
项目运行环境配置:Jdk1.8+Tomcat7.0+Mysql+HBuilderX(Webstorm也行)+Eclispe(IntelliJIDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM+mybatis+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.ID
Mybatis Mysql
莫夏_b560
1、查询失败或者结果异常andfwbdh=#{fwbdh}更换成andfwbdh=#{fwbdh}
33. MyBatis中的@Param注解如何使用?如何在Mapper接口中传递多个参数?
这孩子叫逆
Mybatis笔记 java mybatis tomcat
在MyBatis中,@Param注解用于将方法参数绑定到SQL语句中的命名参数。它主要用于在Mapper接口中传递多个参数,以便在SQL语句中更方便地引用这些参数。为什么使用@Param注解?在MyBatis中,当Mapper接口的方法只有一个参数时,MyBatis会默认将这个参数的名称绑定为#{parameter},可以直接在SQL语句中引用它。如果方法有多个参数,MyBatis默认使用para
Python+Django毕业设计校园易购二手交易平台(程序+LW+部署)
Python、JAVA毕设程序源码
课程设计 java mysql
项目运行环境配置:Jdk1.8+Tomcat7.0+Mysql+HBuilderX(Webstorm也行)+Eclispe(IntelliJIDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:SSM+mybatis+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.ID
Springboot3 整合 Mybatis3
(前程似锦)
mybatis java spring boot
Springboot3整合MybatisSpringboot3整合MybatisSpringboot3整合Mybatis一、导入依赖二、编写配置文件三、定义模型entity实体类四、在启动类上添加注解,表示mapper接口所在位置五、定义mapper接口六、定义mapper.xml映射文件七、service层八、测试一、导入依赖mybatis的必要依赖注意:使用springboot3的话要使用my
mybatis支持json,Spring boot配置
Knight_9
mysql5.7版本以后支持原生json格式,基于Springboot进行配置说明。mybatis支持mysql的json格式mysql-connector,mysql的驱动版本要大于等于5.1.40,否则json字段查询会发生乱码。继承BaseTypeHandler自定义一个json类型处理器,放到一个handler包下,例:packagecom.c.config.handler;importc
【Java】Mybatis Druid连接池配置详细
beautiful_huang
Java
pom.xmlcom.alibabadruid1.0.18.propertiesspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatis2?characterEncoding=utf-8&useSSL=truespring.da
关于com.baomidou:mybatis-plus-boot-starter:jar:unknown was not found解决办法
波斯CD
mybatis jar java
原型com.baomidoumybatis-plus-boot-starter修改以后解决了com.baomidoumybatis-plus-boot-starter3.5.3.1
MyBatis-Plus 3.5.5的代码生成器 实践【完整代码】
qq_43513957
mybatis
MyBatis-Plus3.5.5的代码生成器实践【完整代码】1.表:要有一个version字段,乐观锁更新。配置拦截器的代码packagecom.example.demo.zmybatisplusGenerator.config;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.exte
深入解析 MyBatis:从理论到项目实例
OEC小胖胖
web后端 mybatis java spring web 后端
深入解析MyBatis:从理论到项目实例目录MyBatis概述MyBatis项目结构及作用核心概念详解分页功能的实现与深入剖析动态SQL缓存机制详解与Spring集成常见问题与深入分析完整项目示例总结1.MyBatis概述MyBatis是一个轻量级的持久层框架,使用SQL查询语句来访问数据库。它与Java对象建立映射关系,通过配置文件或注解来管理SQL语句,灵活性高且与数据库操作直接相关,适合需要
MyBatis Plus 实战详解
Aries263
redis 分布式 数据库
一、引言MyBatisPlus(简称MP)是MyBatis的增强工具,旨在简化开发、提高效率。它保留了MyBatis的强大功能,并在其基础上进行了扩展和优化,提供了强大的CRUD操作、配置选项、条件构造器等功能。本文将详细介绍MyBatisPlus的安装、配置、基本操作以及分页和条件查询的使用。二、安装与配置1.添加依赖首先,在Maven项目的pom.xml中添加MyBatisPlus的依赖。以下
在springboot中,利用xml配置mybatis的方法
猪猡猪猡猪
java mybatis mybatis spring boot xml java mysql
前置步骤参考博客:SpringBoot配置Mybatis的两种方式(通过XML配置和通过YML配置文件配置)_Darreni的博客-CSDN博客但按照博客中的关键代码和步骤创建的项目无法启动启动报错:Description:FailedtoconfigureaDataSource:'url’attributeisnotspecif:Reason:Failedtodetermineasuitable
MyBatis 学习笔记(4) 动态SQL
张云飞Vir
1.背景本节讲mybatis应对动态SQL的场景。2.知识动态SQL是指“条件"不固定的SQL,对比于一般的SQL,动态SQL会有一个或者多个条件/参数。比如:场景:查询的时候,如果用户输入了姓名,就按姓名模糊查询;同时又输入了邮箱,就再增加一个条件按姓名+邮箱两个条件查询。传统的拼接SQL很费力,拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。借助功能强大的基于OGNL的
xml解析
小猪猪08
xml
1、DOM解析的步奏
准备工作:
1.创建DocumentBuilderFactory的对象
2.创建DocumentBuilder对象
3.通过DocumentBuilder对象的parse(String fileName)方法解析xml文件
4.通过Document的getElem
每个开发人员都需要了解的一个SQL技巧
brotherlamp
linux linux视频 linux教程 linux自学 linux资料
对于数据过滤而言CHECK约束已经算是相当不错了。然而它仍存在一些缺陷,比如说它们是应用到表上面的,但有的时候你可能希望指定一条约束,而它只在特定条件下才生效。
使用SQL标准的WITH CHECK OPTION子句就能完成这点,至少Oracle和SQL Server都实现了这个功能。下面是实现方式:
CREATE TABLE books (
id &
Quartz——CronTrigger触发器
eksliang
quartz CronTrigger
转载请出自出处:http://eksliang.iteye.com/blog/2208295 一.概述
CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式,CronTrigger 支持日历相关的重复时间间隔(比如每月第一个周一执行),而不是简单的周期时间间隔。 二.Cron表达式介绍 1)Cron表达式规则表
Quartz
Informatica基础
18289753290
Informatica Monitor manager workflow Designer
1.
1)PowerCenter Designer:设计开发环境,定义源及目标数据结构;设计转换规则,生成ETL映射。
2)Workflow Manager:合理地实现复杂的ETL工作流,基于时间,事件的作业调度
3)Workflow Monitor:监控Workflow和Session运行情况,生成日志和报告
4)Repository Manager:
linux下为程序创建启动和关闭的的sh文件,scrapyd为例
酷的飞上天空
scrapy
对于一些未提供service管理的程序 每次启动和关闭都要加上全部路径,想到可以做一个简单的启动和关闭控制的文件
下面以scrapy启动server为例,文件名为run.sh:
#端口号,根据此端口号确定PID
PORT=6800
#启动命令所在目录
HOME='/home/jmscra/scrapy/'
#查询出监听了PORT端口
人--自私与无私
永夜-极光
今天上毛概课,老师提出一个问题--人是自私的还是无私的,根源是什么?
从客观的角度来看,人有自私的行为,也有无私的
Ubuntu安装NS-3 环境脚本
随便小屋
ubuntu
将附件下载下来之后解压,将解压后的文件ns3environment.sh复制到下载目录下(其实放在哪里都可以,就是为了和我下面的命令相统一)。输入命令:
sudo ./ns3environment.sh >>result
这样系统就自动安装ns3的环境,运行的结果在result文件中,如果提示
com
创业的简单感受
aijuans
创业的简单感受
2009年11月9日我进入a公司实习,2012年4月26日,我离开a公司,开始自己的创业之旅。
今天是2012年5月30日,我忽然很想谈谈自己创业一个月的感受。
当初离开边锋时,我就对自己说:“自己选择的路,就是跪着也要把他走完”,我也做好了心理准备,准备迎接一次次的困难。我这次走出来,不管成败
如何经营自己的独立人脉
aoyouzi
如何经营自己的独立人脉
独立人脉不是父母、亲戚的人脉,而是自己主动投入构造的人脉圈。“放长线,钓大鱼”,先行投入才能产生后续产出。 现在几乎做所有的事情都需要人脉。以银行柜员为例,需要拉储户,而其本质就是社会人脉,就是社交!很多人都说,人脉我不行,因为我爸不行、我妈不行、我姨不行、我舅不行……我谁谁谁都不行,怎么能建立人脉?我这里说的人脉,是你的独立人脉。 以一个普通的银行柜员
JSP基础
百合不是茶
jsp 注释 隐式对象
1,JSP语句的声明
<%! 声明 %> 声明:这个就是提供java代码声明变量、方法等的场所。
表达式 <%= 表达式 %> 这个相当于赋值,可以在页面上显示表达式的结果,
程序代码段/小型指令 <% 程序代码片段 %>
2,JSP的注释
<!-- -->
web.xml之session-config、mime-mapping
bijian1013
java web.xml servlet session-config mime-mapping
session-config
1.定义:
<session-config>
<session-timeout>20</session-timeout>
</session-config>
2.作用:用于定义整个WEB站点session的有效期限,单位是分钟。
mime-mapping
1.定义:
<mime-m
互联网开放平台(1)
Bill_chen
互联网 qq 新浪微博 百度 腾讯
现在各互联网公司都推出了自己的开放平台供用户创造自己的应用,互联网的开放技术欣欣向荣,自己总结如下:
1.淘宝开放平台(TOP)
网址:http://open.taobao.com/
依赖淘宝强大的电子商务数据,将淘宝内部业务数据作为API开放出去,同时将外部ISV的应用引入进来。
目前TOP的三条主线:
TOP访问网站:open.taobao.com
ISV后台:my.open.ta
【MongoDB学习笔记九】MongoDB索引
bit1129
mongodb
索引
可以在任意列上建立索引
索引的构造和使用与传统关系型数据库几乎一样,适用于Oracle的索引优化技巧也适用于Mongodb
使用索引可以加快查询,但同时会降低修改,插入等的性能
内嵌文档照样可以建立使用索引
测试数据
var p1 = {
"name":"Jack",
"age&q
JDBC常用API之外的总结
白糖_
jdbc
做JAVA的人玩JDBC肯定已经很熟练了,像DriverManager、Connection、ResultSet、Statement这些基本类大家肯定很常用啦,我不赘述那些诸如注册JDBC驱动、创建连接、获取数据集的API了,在这我介绍一些写框架时常用的API,大家共同学习吧。
ResultSetMetaData获取ResultSet对象的元数据信息
apache VelocityEngine使用记录
bozch
VelocityEngine
VelocityEngine是一个模板引擎,能够基于模板生成指定的文件代码。
使用方法如下:
VelocityEngine engine = new VelocityEngine();// 定义模板引擎
Properties properties = new Properties();// 模板引擎属
编程之美-快速找出故障机器
bylijinnan
编程之美
package beautyOfCoding;
import java.util.Arrays;
public class TheLostID {
/*编程之美
假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿以下且ID是小于10亿的整数,假设每份数据保存两个备份,这样就有两个机器存储了同样的数据。
1.假设在某个时间得到一个数据文件ID的列表,是
关于Java中redirect与forward的区别
chenbowen00
java servlet
在Servlet中两种实现:
forward方式:request.getRequestDispatcher(“/somePage.jsp”).forward(request, response);
redirect方式:response.sendRedirect(“/somePage.jsp”);
forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知
[信号与系统]人体最关键的两个信号节点
comsci
系统
如果把人体看做是一个带生物磁场的导体,那么这个导体有两个很重要的节点,第一个在头部,中医的名称叫做 百汇穴, 另外一个节点在腰部,中医的名称叫做 命门
如果要保护自己的脑部磁场不受到外界有害信号的攻击,最简单的
oracle 存储过程执行权限
daizj
oracle 存储过程 权限 执行者 调用者
在数据库系统中存储过程是必不可少的利器,存储过程是预先编译好的为实现一个复杂功能的一段Sql语句集合。它的优点我就不多说了,说一下我碰到的问题吧。我在项目开发的过程中需要用存储过程来实现一个功能,其中涉及到判断一张表是否已经建立,没有建立就由存储过程来建立这张表。
CREATE OR REPLACE PROCEDURE TestProc
IS
fla
为mysql数据库建立索引
dengkane
mysql 性能 索引
前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过一些开发,但却对如何为数据库建立适当的索引所知较少,因此我起了写一篇相关文章的念头。 最普通的情况,是为出现在where子句的字段建一个索引。为方便讲述,我们先建立一个如下的表。
学习C语言常见误区 如何看懂一个程序 如何掌握一个程序以及几个小题目示例
dcj3sjt126com
c 算法
如果看懂一个程序,分三步
1、流程
2、每个语句的功能
3、试数
如何学习一些小算法的程序
尝试自己去编程解决它,大部分人都自己无法解决
如果解决不了就看答案
关键是把答案看懂,这个是要花很大的精力,也是我们学习的重点
看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的含义
照着答案去敲
调试错误
centos6.3安装php5.4报错
dcj3sjt126com
centos6
报错内容如下:
Resolving Dependencies
--> Running transaction check
---> Package php54w.x86_64 0:5.4.38-1.w6 will be installed
--> Processing Dependency: php54w-common(x86-64) = 5.4.38-1.w6 for
JSONP请求
flyer0126
jsonp
使用jsonp不能发起POST请求。
It is not possible to make a JSONP POST request.
JSONP works by creating a <script> tag that executes Javascript from a different domain; it is not pos
Spring Security(03)——核心类简介
234390216
Authentication
核心类简介
目录
1.1 Authentication
1.2 SecurityContextHolder
1.3 AuthenticationManager和AuthenticationProvider
1.3.1 &nb
在CentOS上部署JAVA服务
java--hhf
java jdk centos Java服务
本文将介绍如何在CentOS上运行Java Web服务,其中将包括如何搭建JAVA运行环境、如何开启端口号、如何使得服务在命令执行窗口关闭后依旧运行
第一步:卸载旧Linux自带的JDK
①查看本机JDK版本
java -version
结果如下
java version "1.6.0"
oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]
ldzyz007
oracle mysql SQL Server
oracle &n
记Protocol Oriented Programming in Swift of WWDC 2015
ningandjin
protocol WWDC 2015 Swift2.0
其实最先朋友让我就这个题目写篇文章的时候,我是拒绝的,因为觉得苹果就是在炒冷饭, 把已经流行了数十年的OOP中的“面向接口编程”还拿来讲,看完整个Session之后呢,虽然还是觉得在炒冷饭,但是毕竟还是加了蛋的,有些东西还是值得说说的。
通常谈到面向接口编程,其主要作用是把系统设计和具体实现分离开,让系统的每个部分都可以在不影响别的部分的情况下,改变自身的具体实现。接口的设计就反映了系统
搭建 CentOS 6 服务器(15) - Keepalived、HAProxy、LVS
rensanning
keepalived
(一)Keepalived
(1)安装
# cd /usr/local/src
# wget http://www.keepalived.org/software/keepalived-1.2.15.tar.gz
# tar zxvf keepalived-1.2.15.tar.gz
# cd keepalived-1.2.15
# ./configure
# make &a
ORACLE数据库SCN和时间的互相转换
tomcat_oracle
oracle sql
SCN(System Change Number 简称 SCN)是当Oracle数据库更新后,由DBMS自动维护去累积递增的一个数字,可以理解成ORACLE数据库的时间戳,从ORACLE 10G开始,提供了函数可以实现SCN和时间进行相互转换;
用途:在进行数据库的还原和利用数据库的闪回功能时,进行SCN和时间的转换就变的非常必要了;
操作方法: 1、通过dbms_f
Spring MVC 方法注解拦截器
xp9802
spring mvc
应用场景,在方法级别对本次调用进行鉴权,如api接口中有个用户唯一标示accessToken,对于有accessToken的每次请求可以在方法加一个拦截器,获得本次请求的用户,存放到request或者session域。
python中,之前在python flask中可以使用装饰器来对方法进行预处理,进行权限处理
先看一个实例,使用@access_required拦截:
?