笔记
oracle代码改为mysql,java程序数据库oracle改为mysql需要更改哪些代码?如何更改?
有三个地方需要修改:1。数据库驱动包,改为ojdbc-*.jar,2.将修改配置文件driver、url、3.数据访问层的修改主要体现在用户名和密码的修改上SQL语句 一、数据库驱动包: 二、配置文件: 三、数据访问层(也是最麻烦的地方) (2)自增方式,oracle需要创建序列,使用语句:序列名:.nextval。如果你的java使用框架,例如hibernate,需要对id重新配置标签,添加自增序列说明。如果你的java使用框架,例如hibernate,需要对id重新配置标签,添加自增序列说明。 mysql的substring,oracle用substr处理。 去空,mysql只有trim,oracle有trim,ltrim,rtrim多种选择。 字符串长度,mysql是char_length(),oracle是length。 INSTR函数的参数,oracle多一个 ,从非1位置执行:INSTR('abcd','a',2)。 mysql的if...case语句可以用oracle的decode函数代替。(5)oracle的SQL语句在书写上要求严格,如查询语句,GROUP BY分组,mysql除分组字段外,其他字段的值可以返回,oracle不允许。 (6)mysql允许使用双引号操作字符串,oracle只能使用单引号,程序需要提前转换。 (7)如果脱离库表,oracle需要使用虚拟表的查询或计算DUAL,譬如SELECT ASCII('A') VALUE FROM DUAL; (10)oracle没有group_concat; (11)oracle后面不能用表名as。
mysql使用limit,oracle使用rownum。
函数
mysql的ifnull()对应oracle的nvl()
mysql的now()对应oracle的sysdate或systimestamp,可以在sysdate运算符直接用于计算。
-
oracle主键为 number 类型,不支持自增
-
转为 mysql 后自动为 decimal 这种类型不能设置为自增
-
需要设置主键自增,手动增加mysql主键改为int类型
-
varchar2以下转为 varchar 长度不变的类型(oracle字节数在255以内)
-
varchar2以下转为 text 字节数超过255的类型自动变为text
Date类型转为datetime类型
(1) 取时间
oracle中sysdate,获取系统本地时间。mysql中,now()函数。
oracle使用时间相似TO_DATE(‘2018-04-03 13:01:32’,‘YYYY-MM-DD HH24:MI:SS)表达方式。
mysql的date_format和time_format,oracle可以用类似TO_CHAR(sysdate,‘YYYY-MM-DD HH24:MI:SS’)
- mysql 单列索引最长为767字节,最大为191字符(varchar(191))
- oracle中索引超过191字符,转换失败,可手动更改索引长度
concat()函数
oracle中concat函数中只有两个参数,concat(str1,str2);而mysql多个参数可以放在中间concat(str1,str2,…)
oracle:
select to_date(‘1999-01-01 00:00:00’,‘yyyy-mm-dd hh24:mi:ss’) from dual;
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) from dual;
mysql:
SELECT DATE_FORMAT(NOW(),‘%y-%c-%d %h:%i:%s’);
SELECT STR_TO_DATE(‘2000-01-01 00:00:00’, ‘%Y-%m-%d %h:%i:%s’);
大字段转换字符
oracle中可用to_char()转换;
Oracle中可以用 || 符号用于连接字符,例如:
SELECT ‘A’||‘,’||‘B’ AS ZHI FROM DUAL
输出值为 “A,B”,而MySQL意思是表示或等同于"or"。
concat函数,oracle只能拼接两个,要么拼接两个,要么换成两个||拼接。
(1)select e.empno,e.ename,d.dname from emp e,dept d where e.DEPTNO = d.DEPTNO( );
(2)select e.empno,e.ename,d.dname from emp e left join dept d on e.DEPTNO = d.DEPTNO;
表连接一般有以上两种方式,Oracle支持两种方式,但是mysql只支持第二种方式。
mysql允许使用!=null,oracle使用is not null
mysql允许使用!=null,oracle使用is not null
mysql可以连续,oracle不能连续:
mysql:insert into 表 values(…),(…),(…);
oracle:insert into 表 values(…);
基本概念:
DDL (Data Definition Language) 语句: 语言的数据定义 , 主要是定义/改变表的结构、数据类型、表之间的链接等。常用的句子关键词包括 CREATE、DROP、ALTER 等。
CREATE TABLE 表名( 列名1 数据类型, 列名2 数据类型, 列名3 数据类型, ... ) ALTER TABLE 表名; eg:ALTER TABLE 表名 ADD 列名 数据类型;(添加一列) ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;(修改列名) ALTER TABLE 表名 DROP 列名; DROP TABLE 表名;
DROP
DATABASE 数据库名
;
DML(Data Manipulation Language)语句: 数据操纵语言,主要是对数据进行增加、删除、修改操作。常用的语句关键字有 INSERT、UPDATE、DELETE 等。
INSERT INTO 表名 (字段1,字段2,...) values (某值,某值,...),(某值,某值,...);
UPDATE 表名 SET 列名=新值 WHERE 限定条件;
DELETE FROM 表名 WHERE 限定条件;
建表后面 auto_increment 什么意思?
mysql的创建表的语句后面有auto_increment=120
DDL
CREATE TABLE `insurance_claim_luggage_old` (
`claim_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '理赔主键',
`claim_no` varchar(65) NOT NULL COMMENT '理赔单号',
`status` decimal(2,0) NOT NULL COMMENT '理赔状态',
`report_no` varchar(30) DEFAULT NULL COMMENT '报案号',
`claim_amounts` decimal(11,2) DEFAULT NULL COMMENT '理赔金额',
`case_status` decimal(2,0) DEFAULT NULL COMMENT '理赔案件状态',
`apply_date` datetime NOT NULL COMMENT '申请日期',
`refund_date` datetime DEFAULT NULL COMMENT '退款日期',
`report_result_desc` varchar(250) DEFAULT NULL COMMENT '报案结果描述',
`pay_result_desc` varchar(250) DEFAULT NULL COMMENT '支付提交结果描述',
`claim_audit_conclusion` varchar(250) DEFAULT NULL COMMENT '理赔审核结论',
`order_no` varchar(20) DEFAULT NULL COMMENT '订单号',
`ticket_no` varchar(20) DEFAULT NULL COMMENT '客票号',
`segorder` int(11) DEFAULT NULL COMMENT '航段序号',
`passenger_name` varchar(80) NOT NULL COMMENT '旅客姓名',
`payee_name` varchar(80) DEFAULT NULL COMMENT '银行户名(领款姓名)',
`payee_mobile` varchar(15) DEFAULT NULL COMMENT '手机号码',
`self_payee` decimal(1,0) DEFAULT NULL COMMENT '本人领款',
`flight_status` varchar(5) DEFAULT NULL COMMENT '航班状态',
`luggage_loss` decimal(1,0) DEFAULT NULL COMMENT '行李是否损失',
`luggage_delay` decimal(1,0) DEFAULT NULL COMMENT '行李是否延误',
`bookuser` varchar(38) DEFAULT NULL COMMENT '订单用户',
`idcard` varchar(80) DEFAULT NULL COMMENT '证件号码',
`idtype` varchar(10) DEFAULT NULL COMMENT '证件类型',
`payee_relation` varchar(5) DEFAULT NULL COMMENT '领款人与被保人关系(关系编码)',
PRIMARY KEY (`claim_id`) USING BTREE,
UNIQUE KEY `pk_insurance_claim_luggage_old` (`claim_id`),
UNIQUE KEY `uq_insurance_claim_luggage_old` (`claim_no`),
UNIQUE KEY `idx_ins_claim_luggage_old_orderno` (`order_no`),
KEY `idx_ins_claim_luggage_old_ticketno` (`ticket_no`),
KEY `idx_ins_claim_luggage_old_psgname` (`passenger_name`),
KEY `idx_ins_claim_luggage_old_bookuser` (`bookuser`),
KEY `idx_ins_claim_luggage_old_psg` (`idcard`,`idtype`,`passenger_name`)
) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='行李理赔表'
主键自增
添加索引,组合索引
AUTO_INCREMENT=n命令来重设自增的起始值。
但是如果设置的n比目前的数值小的话,执行的sql不会报错,但是不会生效!
1.ENGINE=INNODB:将数据库的引擎设置为InnoDB(mysql中两种数据库引擎 :MyISAM 、InnoDB)
2.AUTO_INCREMENT=1:自动增长的起始值为1
3.DEFAULT CHARSET=utf8:设置数据库的默认字符集为utf8
这里是创建语句,记住每一个create table 都是一个语句,不要嵌套在里面。
CREATE TABLE `insurance_claim_refund_old` (
`claim_id` int(12) NOT NULL AUTO_INCREMENT COMMENT '理赔主键',
`claim_no` varchar(20) NOT NULL COMMENT '理赔单号',
`status` decimal(2,0) NOT NULL COMMENT '理赔状态',
`report_no` varchar(30) DEFAULT NULL COMMENT '报案号',
`claim_amounts` decimal(11,2) DEFAULT NULL COMMENT '理赔金额',
`case_status` decimal(2,0) DEFAULT NULL COMMENT '理赔案件状态',
`apply_date` datetime NOT NULL COMMENT '申请日期',
`refund_date` datetime DEFAULT NULL COMMENT '退款日期',
`refund_poundage` decimal(11,2) DEFAULT NULL COMMENT '退票或变更手续费',
`report_result_desc` varchar(250) DEFAULT NULL COMMENT '报案结果描述',
`pay_result_desc` varchar(250) DEFAULT NULL COMMENT '支付提交结果描述',
`claim_audit_conclusion` varchar(250) DEFAULT NULL COMMENT '理赔审核结论',
`order_no` varchar(20) DEFAULT NULL COMMENT '订单号',
`ticket_no` varchar(20) DEFAULT NULL COMMENT '客票号',
`segorder` int(11) DEFAULT NULL COMMENT '航段序号',
`passenger_name` varchar(80) NOT NULL COMMENT '旅客姓名',
`payee_name` varchar(80) DEFAULT NULL COMMENT '银行户名(领款姓名)',
`payee_mobile` varchar(15) DEFAULT NULL COMMENT '手机号码',
`self_payee` decimal(1,0) DEFAULT NULL COMMENT '本人领款',
`bookuser` varchar(38) DEFAULT NULL COMMENT '订单用户',
`idcard` varchar(80) DEFAULT NULL COMMENT '证件号码',
`idtype` varchar(10) DEFAULT NULL COMMENT '证件类型',
`payee_relation` varchar(5) DEFAULT NULL COMMENT '领款人与被保人关系(关系编码)',
PRIMARY KEY (`claim_id`)
) ENGINE=InnoDB AUTO_INCREMENT=189 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='退改理赔表';
CREATE UNIQUE INDEX pk_insurance_claim_refund_old ON insurance_claim_refund_old (claim_id)
CREATE UNIQUE INDEX uq_insurance_claim_refund_old ON insurance_claim_refund_old (claim_no)
CREATE INDEX idx_ins_claim_refund_orderno ON insurance_claim_refund_old (order_no)
CREATE INDEX idx_ins_claim_refund_ticketno ON insurance_claim_refund_old (ticket_no)
CREATE INDEX idx_ins_claim_refund_psgname ON insurance_claim_refund_old (passenger_name)
CREATE INDEX idx_ins_claim_refund_bookuser ON insurance_claim_refund_old (bookuser)
CREATE INDEX idx_ins_claim_refund_passenger ON insurance_claim_refund_old (idcard,idtype,passenger_name)
oracle 创建索引 栗子
2.创建索引
create index 索引名称 on 表名 (字段名称);
3.删除索引
drop index 索引名;
4.创建组合索引
create index 索引名 on 表名(列名1,,列名2);
5.在数据库中查找表名
select * from user_tables where table_name like 'tablename%';
6.查看该表的所有索引
select * from all_indexes where table_name = 'tablename';
7.查看该表的所有索引列
select* from all_ind_columns where table_name = 'tablename';
8.唯一索引 --unique --[] 表示可选
create [unique] index 字段名称
修改索引只能先删除,在重新建立。
oracle 下的主键自增
@Entity
@Table(name = "insurance_claim_delay_old")
public class InsuranceClaimDelay extends AbstractInsuranceClaim {
/** 理赔主键 */
@Id
@Column(name = "claim_id")
@SequenceGenerator(name = "INSURANCE_CLAIM_DELAY_GENERATOR", sequenceName = "SEQ_INSURANCE_CLAIM_DELAY", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "INSURANCE_CLAIM_DELAY_GENERATOR")
private BigInteger claimId;
oracle 改为 mysql主键自增该法 该过之后
@SuppressWarnings("serial")
@Entity
@Table(name = "insurance_claim_attached_old")
public class InsuranceClaimAttached implements Serializable {
/** 资料主键 */
@Id
@Column(name = "attach_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private BigInteger attachId;
多数据源
oracle 改为mysql
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.autoReconnect=true
spring.jpa.hibernateuse-new-id-generator-mappings=true
开发 和 测试 包里面都要改
prod 开发环境 test 测试环境
需要创建的表的sql 就是我们的DDL
注意: 我们测试环境更开发 环境用的库不一定相同 所以测试的时候 不一定用的同一个库 本地的在
测试的在这里
关于不是主键唯一约束,添加不进去可能是 这个值为外键,只有在原表里面有这个数据,这张表才可以添加。
可以发生链结构,多个表互为外键。
数据库插入数据出现中文乱码?
??GM 查数据库定位为中文乱码问题
乱码的问题我看了下是因为mysql-connector-java驱动包8.0.13以前的版本需要在配置mysql连接上指定characterEncoding=UTF-8默认是utf8mb3, 8.0.13及以后的版本才是utf8mb4, 我把这jar包改到跟数据库上面的8.0.17版本就可以了
//getTime 方法返回一个整数值,这个整数代表了从 1970 年 1 月 1 日开始计算到 Date 对象中的时间之间的毫秒数。
Java中getTime()返回的是毫秒单位的long数据。因此,在转换为时间时需要注意。
日期格式大小写需要注意,不对的话,结果不是想要的 不能随意更换大小写
@Test
public void testup() {
try {
InsuranceClaimAttached attached = new InsuranceClaimAttached();
attached.setUploadtime(new Date());
attached.setAttachType(11);
//BigInteger类型 将int类型转化为biginteger
attached.setClaimId(BigInteger.valueOf(665));
attached.setUuid("uuid测试233");
attached.setAttachPath("adffeqaf.txt");
insuranceClaimAttachedRepository.save(attached);
List<InsuranceClaimAttached> list = insuranceClaimAttachedRepository.findByUuid("uuid测试233");
Date uploadtime = list.get(0).getUploadtime();
long time = uploadtime.getTime();
System.out.println(time);
String format = new SimpleDateFormat("yyyy-MM-dd hh-MM-ss").format(uploadtime);
System.out.println(format);
}catch (Exception e){
}
}
控制台打印
Hibernate: insert into insurance_claim_attached_old (attach_path, attach_type, attach_xh, claim_id, claim_type, uploadtime, uuid) values (?, ?, ?, ?, ?, ?, ?)
Hibernate: select insurancec0_.attach_id as attach_i1_0_, insurancec0_.attach_path as attach_p2_0_, insurancec0_.attach_type as attach_t3_0_, insurancec0_.attach_xh as attach_x4_0_, insurancec0_.claim_id as claim_id5_0_, insurancec0_.claim_type as claim_ty6_0_, insurancec0_.uploadtime as uploadti7_0_, insurancec0_.uuid as uuid8_0_ from insurance_claim_attached_old insurancec0_ where insurancec0_.uuid=?
1656382901000
2022-06-28 10-06-41
StringUtils.hasText()作用
如果里面的值为null,""," ",那么返回值为false;否则为true
@Test
public void test() {
//无空格
System.out.println(StringUtils.isEmpty(""));//是否为空,空返回true
System.out.println(StringUtils.hasText(""));//是否为空,空返回false
//有空格
System.out.println(StringUtils.isEmpty(" "));
System.out.println(StringUtils.hasText(" "));
//任意字符
System.out.println(StringUtils.isEmpty(" ' "));
System.out.println(StringUtils.hasText(" '' "));
System.out.println(StringUtils.isEmpty(" 1 "));
System.out.println(StringUtils.hasText(" 2 "));
}
控制台打印
true
false
false
false
false
true
false
true
hasText 是否是字符串,