转战Oracle,在线避坑
转战Oracle在线避坑目录前言Oracle注意点关于varchar和varchar2的区别关于number类型关于date时间显示类型关于limit关于CRUD的返回值MySQl与Oracle相同关于自增主键前言Oracle的使用与MySQl相似但也存在很多细节上的差异以下记录一下MySQL过渡Oracle时遇到的一些坑及解决措施欢迎留言区补充相互学习Oracle注意点Oracle的SQL语句要用单引号不能用双引号在Oracle中 双引号 被当做一个普通的字符串来处理SQL Developer 默认是不会自动提交事务的执行DML语句后记得commitmybatis里面的sql末尾是不能以分号;结尾MySQL均可Oracle会报错java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符Oracle字段默认采用大写当与实体类对应时实体类不支持驼峰命名法使用Mybatis时法一mapper映射文件使用resultMap将实体类字段与数据库表字段一一对应resultMap id指定resultMap名type实体类全类名!--id标签为主键列--id columnDB表字段property实体类字段jdbcTypeDECIMALjdbcType类型/!--result标签为非主键列--result columnUSER_NAMEpropertyuserNamejdbcTypeVARCHARjdbcType类型/result columnPASSWORDpropertypasswordjdbcTypeVARCHAR//resultMap法二配置文件开启驼峰功能#配置mybatis mybatis:#自动扫描包下的实体类 type-aliases-package:实体类全类名 #映射文件所在的位置 mapper-locations:classpath:mapper/*.xml configuration: #开启驼峰功能 map-underscore-to-camel-case: true关于varchar和varchar2的区别varchar是标准sql里面的。 varchar2是oracle提供的独有的数据类型。varchar对于汉字占两个字节对于数字英文字符是一个字节占的内存小varchar2一般情况下把所有字符都占两字节处理。具体要看数据库使用的字符集比如GBK汉字就会占两个字节英文1个如果是UTF-8汉字一般占3个字节英文还是1个。varchar对空串不处理varchar2将空串当做null来处理。varchar存放固定长度的字符串最大长度是2000varchar2是存放可变长度的字符串最大长度是4000.如果是要更换不同的数据库例如mysql那么就用varchar如果就用oracle那么用varchar2比较好一点。来源https://www.cnblogs.com/anningkang/p/oracle.html关于number类型Oracle只用NUMBER(m,n)就可以表示任何复杂的数字数据为了兼容Oracle将decimal,numeric,int只能存储整数等数据类型引入但实际上在Oracle内部还是以NUMBER的形式将其存入。Java实体类映射时使用BigDecimal不要使用String否则会出现部分显示缺失问题。例如“0.5” - “.5”来源https://www.cnblogs.com/jiangfeilong/p/10923899.html关于date时间显示类型Oracle的date字段显示为24-5月 -20表示2020年5月24日使用时需要用TO_DATE()函数进行转换TO_DATE(#{startTime},‘YYYY-MM-DD HH24:MI:SS’)Oracle的日期格式也略有不同月-MM、24小时制-HH24、12小时制-HH12分-MIJava操作Mybatis插入date字段时可不用传参而是使用sysdateSELECTSYSDATEFROMDUAL;sysdate内容可参考https://www.cnblogs.com/forever-love-zjl/p/9717413.html关于limitoracle数据库不支持mysql中limit功能但可以通过rownum来限制返回的结果集的行数rownum是oracle系统自动添加的使查询结果最多返回前10行select*fromXXXTABLEwhererownum10;使查询结果返回中间的10到100行select*fromXXXTABLEwhererownum101minusselect*fromXXXTABLEwhererownum10minus:减法操作按列比较对查询结果集的减法。A minus B将只去除A跟B的交集部分对于B中存在而A中不存在的记录不会做任何操作也不会抛出异常。注select * from XXXTABLE where rownum9 and rownum101是错误的oracle会认为条件不成立,不存在大于关于CRUD的返回值MySQl与Oracle相同selecttrue实体类或其集合falsenull或空集合增删改返回值自定义void/int传参的List集合多条数据用for遍历DB执行时还是一条一条执行故返回值为1inserttrueN条数据返回Nfalse主键冲突异常Oracle实例INSERTALLINTOtable(t_id,t_name)VALUES(1,sy)INTOscore(t_id,t_name)VALUES(2,zhan)SELECT*FROMdual;deletetrue无数据返回0N条数据返回Nfalse外键异常updatetrue无数据返回0N条数据返回Nfalse外键异常关于自增主键MySQL直接一个AUTO_INCREMENT即可但Oracle没有这玩样一般Oracle设置自增主键分三步走建表设置主键primary key建序列建触发器案例数据库名DB_NAME,表名TEST_TABLE,表字段TABLE_ID主键,USER_NAME,序列名TEST_TABLE_SEQUENCE,触发器名TEST_TABLE_TRIGGER1.建表设置主键primarykeyCREATETABLETEST_TABLE(TABLE_IDNUMBERprimarykey,USER_NAMEVARCHAR2(20BYTE));COMMENTONCOLUMNDB_NAME.TEST_TABLE.TABLE_IDIS主键ID;COMMENTONCOLUMN数据库名.表名.表字段IS备注;2.建序列CREATESEQUENCE TEST_TABLE_SEQUENCE INCREMENTBY1MAXVALUE9999999999999999999999999999MINVALUE1NOCACHE;//CREATE 序列 序列名 INCREMENT BY 自增值 MAXVALUE 自增最终值 MINVALUE 自增开始值 NOCACHE;3.建触发器createorreplaceTRIGGERDB_NAME.TEST_TABLE_TRIGGER BEFOREINSERTONDB_NAME.TEST_TABLEFOR EACH ROWbeginselectTEST_TABLE_SEQUENCE.nextvalinto:new.TABLE_IDfromdual;end;/** create or replace TRIGGER 触发器名一般为数据库名_表名_TRIGGER BEFORE INSERT ON 数据库名.表名 FOR EACH ROW begin select 序列名.nextval into :new.主键字段 from dual; end; */当一个值必须返回且只返回一次可以从dual表选择返回SELECT1FROMDUALDUAL是一个随着Oracle数据库创建数据字典时自动创建的很小的表有一列,名叫DUMMY定义为VARCHAR2(1)包含一行数据值为X推荐阅读https://www.cnblogs.com/mingmingcome/p/9310371.html发现了一个前沿巨牛的宝藏人工智能学习网站通俗易懂风趣幽默忍不住给大家分享一下。戳一下跳转到学习