文章目录
一. 问题背景
二. 参考博客
三. 数据库表的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,每日一写)
2025最新Mybatis-plus教程(二)
三、CRUD(一)BaseMapper接口方法介绍BaseMapper中提供了crud方法,具体方法如下://插入一条记录intinsert(Tentity);//根据entity条件,删除记录intdelete(@Param(Constants.WRAPPER)Wrapperwrapper);//删除(根据ID批量删除)intdeleteBatchIds(@Param(Constants.COL
2025最新Mybatis-plus教程(四)
五、MyBatis-Plus的service封装(一)通用Service简介MyBatis-Plus除了通用的Mapper还有通用的Service层,这也减少了相对应的代码工作量,把通用的接口提取到公共。其实按照mp的这种思想,可以自己也实现一些通用的Controller。(二)通用Service方法介绍/***插入一条记录(选择字段,策略插入)**@paramentity实体对象*/defaul
2025最新Mybatis-plus教程(三)
四、MyBatis-Plus条件构造器(一)条件构造器介绍在MyBatis-Plus中提了构造条件的类Wrapper,它可以根据自己的意图定义我们需要的条件。Wrapper是一个抽象类,一般情况下我们用它的子类QueryWrapper来实现自定义条件查询。(二)selectOne方法@TestpublicvoidtestSelectOne(){ QueryWrapperqueryWrapper=n
Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战
大葱白菜
java合集 java 开发语言 后端 个人开发 学习 代理模式
作为一名Java开发工程师,你一定在使用Spring、MyBatis、RPC框架等技术时接触过“代理”(Proxy)这个概念。无论是Spring的AOP(面向切面编程)、事务管理,还是远程调用、日志记录、权限控制等场景,代理机制都扮演着至关重要的角色。本文将带你全面掌握:什么是代理?静态代理与动态代理的区别JDK动态代理与CGLIB动态代理的实现原理代理模式的典型应用场景代理在主流框架中的使用(如
Java朴实无华按天计划从入门到实战(强化速战版-66天)
岫珩
Java 后端 java 开发语言 学习 Java 时间安排 学习计划
致敬读者感谢阅读笑口常开生日快乐⬛早点睡觉博主相关博主信息博客首页专栏推荐活动信息文章目录Java朴实无华按天计划从入门到实战(强化速战版-66天)1.基础(18)1.1JavaSE核心(5天)1.2数据库与SQL(5天)1.3前端基础(8天)2.进阶(17天)2.1JavaWeb核心(5天)2.2Mybatis与Spring全家桶(6天)2.3中间件入门(4天)2.4实践项目(2天)3.高阶(1
年后计划
腾_飞
正月十六过完,这个年就算过去了。开始“折腾自己”!1每天三组俯卧撑,每组十个,以一号十五号为时间点,每次增加五个,坚持100天。2每天看书时间至少一小时,不间断时间。3开始拿起画笔,每天一小画,每周一大画,并学习有关绘画的知识。4每日弹吉他半小时,熟练掌握技巧。5每日一写,不拘字数,以每日相关看书,感悟,小说,诗歌为基础。6以六月为截止,投稿,以文字形式展开第二副业。7每周至少一次爬山,以散心,强
Mybatisplus的雪花算法及代码生成器的使用
你我约定有三
算法 dreamweaver
1.雪花算法1.1背景:雪花算法(Snowflake)的使用背景主要源于高并发分布式系统环境下对唯一ID生成的需求。这种需求在像Twitter这样的社交媒体平台上尤为突出,因为Twitter需要处理每秒上万条消息的请求,并且每条消息都必须分配一个唯一的ID。这些ID不仅需要全局唯一,以跨机器、跨时间区分,还需要保持一定的顺序性(尽管不要求连续),以方便客户端排序和后续的数据处理。1.2与自动递增的
并发编程与MyBatis精髓
AIHacksCash
Java场景面试宝典 Concurrency Java Database Framework
我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、Spri
mybatis的insert(pojo),会返回pojo吗
在MyBatis中,执行insert操作时,Mapper接口的insert方法本身不会直接返回一个包含数据库生成字段的POJO对象。其默认返回值是受影响的数据库行数(通常是int或Integer)。以下是具体分析和解决方案:1.默认行为返回值类型:insert方法返回的是受影响的行数(整数),不是插入后的POJO对象。POJO状态:执行插入后,如果数据库生成了自增ID或其他字段(如创建时间),PO
MyBatis与MyBatis-Plus批量插入实战指南
代码小侦探
mybatis
在实际项目中,批量插入数据是一个常见且重要的需求。本文将详细总结MyBatis和MyBatis-Plus常用的几种批量插入方式,并通过实际代码示例和运行结果,帮助大家更好地理解和应用。一、准备工作导入pom.xml依赖mysqlmysql-connector-javaruntimeorg.mybatis.spring.bootmybatis-spring-boot-starter2.2.2com.
Spring Boot与MyBatis完美融合:整合实战指南
目录1、梳理整合思路2、整合实现2.1环境搭建2.2案例3、整合mybatis-plus报错1.依赖问题2.配置问题3.Mapper接口与XML文件问题4.实体类问题5.数据库连接问题6.SQL语句问题7.Spring容器问题8.其他1、梳理整合思路将MyBatis的DataSource交给SpringIoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数
MyBatis中#{}与${}的实战避坑指南
MyBatis在持久层框架中占据举足轻重的地位,其映射文件中的两种参数占位符——#{}与${}——常常令初学者困惑,也令资深开发者反复斟酌。笔者在日常代码审计与性能调优过程中,屡次遇到因二者混用而导致的生产事故,因此决定撰写一篇技术博客,结合真实项目片段,系统梳理二者的使用差异、安全边界与工程落地细节。全文约三千字,力求言必有据,例证皆来自可运行的源码仓库,读者可直接复现并验证。在MyBatis的
AI-调查研究-26-【时间管理】全球不同人群社交媒体使用时间情况
武子康
AI DeepSearch 人工智能 ai 学习 职场和发展 职场发展 个人开发 程序人生
点一下关注吧!!!非常感谢!!持续更新!!!AI篇持续更新中!(长期更新)AI炼丹日志-29-字节跳动DeerFlow深度研究框斜体样式架私有部署测试上手架构研究,持续打造实用AI工具指南!Java篇正式开启!(300篇)目前2025年07月10日更新到:Java-68深入浅出分布式服务Netty实现自定义RPC附详细代码MyBatis已完结,Spring已完结,Nginx已完结,Tomcat已完
【Spring Boot 整合 MyBatis 详细教程】
打会游戏睡会觉
spring boot spring boot mybatis 后端
文章目录SpringBoot整合MyBatis详细教程简介环境准备项目搭建项目结构配置项目1.`pom.xml`配置2.`数据源和MyBatis`配置3.`启动类`配置4.`Mapper接口`和`XML映射文件`测试总结SpringBoot整合MyBatis详细教程简介SpringBoot与MyBatis的整合可以让你轻松地构建数据访问层,通过简化配置和自动配置功能,使得开发者可以更加专注于业务逻
Spring Boot 整合 MyBatis 全流程指南
目录SpringBoot整合MyBatis全流程指南一、整合回顾与准备(一)Spring整合MyBatis回顾(二)SpringBoot整合MyBatis优势(三)案例需求(四)准备数据库二、创建工程并引入依赖三、配置数据源信息四、编写代码(一)引入实体类(二)创建mapper接口(三)创建service接口及实现类(四)创建controller类五、测试工程在实际开发中,配置文件的使用至关重要。
并发编程与MyBatis核心知识
我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。拥有多年一线研发和团队
Java+Vue 地下停车场管理系统的设计与实现
不若浮生一梦
计算机毕设 java vue.js 开发语言
一、项目简介本项目是一款基于SpringBoot+Vue开发的地下停车场管理系统,采用前后端分离架构,后端使用MyBatis操作MySQL数据库,前端使用Vue进行页面展示和用户交互。系统涵盖车位监控、车辆登记、订单生成与结算、在线支付、公告通知、留言反馈、用户积分管理等模块,支持用户端和管理员端的全流程停车管理,适用于中小型停车场数字化转型。项目定位:提升停车场管理效率与用户体验,实现“高效停车
SSM+Vue共享充电宝管理系统 充电宝投放管理系统 共享充电宝维护管理系统Java
计算机程序老哥
作者主页:计算机毕业设计老哥有问题可以主页问我一、开发介绍1.1开发环境开发语言:Java数据库:MySQL系统架构:B/S后端:SSM(Spring+SpringMVC+Mybatis)前端:Vue工具:IDEA或者Eclipse,JDK1.8,Maven二、系统介绍2.1图片展示注册登录页面:登陆前端页面功能:首页、合作商户、充电宝投放、公告栏、个人中心、后台管理首页.png充电宝投放.png
MyBatisPlus 批量添加
文章目录现状优化效果报错现状一般来说,批量插入可以使用MyBatisPlus中ServiceImpl自带的方法saveBatch打开sql日志,application.yml添加配置,mapper-locations配置mapper路径mybatis-plus:configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImpl#开启
每日一问一写一省
朱珠牧场妈
每日一问:如果有机会成为一名知名的新媒体写作者,有粉丝百万,你会有什么样的使命?然后你写什么题材和内容?假如有机会成为一名知名的新媒体写作,拥有百万粉丝说明自己的写作功底已经养成而且思维逻辑框架也非常的成熟!我会用心的去写每一篇文章,给粉丝带去能量,让他看到能够从消极的自己变成积极的自己,从我的文章中能够获取能量,能够找回状态最好的自己!把今天不愉快的心情排泄掉对当下拥有幸福感!每日一写《天机》常
springboot + mybatis使用xml方式九
AmeeLove
springboot集成mybatis使用xml方式依赖org.springframework.bootspring-boot-starter-parent1.5.12.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.sprin
【经验分享】如何找到适合初学者的Java项目案例?
Java项目开发案例全程实录涉及从需求分析到部署维护的全流程,结合实战经验总结如下关键步骤:项目规划与需求分析:明确业务需求,定义功能范围和用户故事,如电商项目涉及订单处理和库存管理15。系统设计与技术选型:基于需求选择框架和技术栈,例如使用SpringBoot构建微服务架构,MyBatis处理数据交互,Redis作为缓存层优化性能5。编码实现与核心功能开发:业务逻辑层:编写核
狂神说Linux笔记
是你牛天成
项目部署 linux
B站视频狂神说LinuxJava开发之路:JavaSE,MySQL,前端(html,css,js),javaweb,SSM框架,SpringBootvue,SpringCloud,(mybatis-plusgit)LinuxLinux操作系统:Window、Mac消息队列(Kafka,RabbitMQ,RockeetMQ)缓存(Redis)搜索引擎(ElasticSearch)集群分布式(需要购买
MyBatis Plus 中的条件构造器
中东大鹅
mybatis spring boot 后端 java
一、WrapperWrapper:条件构造抽象类,最顶端父类AbstractWrapper:用于查询条件封装,生成sql的where条件QueryWrapper:查询条件封装UpdateWrapper:Update条件封装AbstractLambdaWrapper:使用Lambda语法LambdaQueryWrapper:用于Lambda语法使用的查询WrapperLambdaUpdateWrap
MyBatis Plus 分页
中东大鹅
mybatis java 数据库 spring boot
一、分页插件MyBatisPlus自带分页插件,只要简单的配置即可实现分页功能1、添加配置类@ConfigurationpublicclassMyConfig{@BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();
MyBatis Plus 对数据表常用注解
中东大鹅
mybatis oracle 数据库 spring boot
1.@TableName(1)解释说明@TableName注解用于指定实体类对应的数据库表名,当实体类的名称与数据库表名不一致时,可以用此注解进行映射。此外,@TableName还支持设置一些其他的配置选项,比如全局表名前缀、后缀的处理。value:指定数据库表名。如果没有设置此注解,则会默认映射到与类名相同的表名。schema:指定数据库的schema,适用于多schema的情况。(2)应用示例
Postgresql数据库Java中mybatis问题记录
haokan_Jia
postgresql JAVA 数据库 postgresql java
项目场景:Java中使用mybatis进行数据查询,使用实体类接收报错“Errorattemptingtogetcolumn‘basin_code’fromresultset.Cause:org.postgresql.util.PSQLException:不良的类型值long:WFG_1\n;不良的类型值long:WFG_1;nestedexceptionisorg.postgresql.util
基于ssm框架的管理系统如何开题,有哪些步骤,怎么设计更合理
勤劳的史蒂夫
1、SSM框架简介SSM框架是SpringMVC,Spring和Mybatis框架的整合,是标准的MVC模式,将整个系统划分为View层,Controller层,Service层,DAO层四层,使用SpringMVC负责请求的转发和视图管理,Spring实现业务对象管理,Mybatis作为数据对象的持久化引擎。DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此。D
Day20: Spring与MyBatis的量子纠缠 —— 解密Mapper接口如何获得魔法实现的终极指南
zhysunny
Spring spring mybatis java
目录灵魂拷问时刻:一、Mapper接口的"借尸还魂"术——MapperFactoryBean解剖室1.1Mapper的诞生时刻轴1.2MapperFactoryBean的克隆工厂源码级实例生成流程:1.3接口炼金术——MyBatisProxyFactory核心代码关键对象关系图:二、线程安全防御体系——SqlSessionTemplate的奥秘2.1传统SqlSession的危险性2.2Sprin
[附源码]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
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拦截:
?