笔记
oracle代码改为mysql,java程序数据库oracle改为mysql需要改动哪些代码?怎么改?
主要需要修改的有三个地方:1.数据库驱动包,改为ojdbc-*.jar,2.配置文件修改,将driver、url、用户名和密码修改,3.数据访问层的修改,主要体现在SQL语句
一、数据库驱动包:
二、配置文件:
三、数据访问层(也是最麻烦的地方)
(2)自增方式,oracle需要创建序列,在语句中使用:序列名.nextval。如果你的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’)
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
insert语句
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 是否是字符串,null 空格不算, 是为true,否为false
isEmpty: null 和 '' 两者选一 为空
//ParseException 无法解析的日期异
protected Date parseDate(String dateString) {
try {
return dateFormat.parse(dateString);
} catch (ParseException e) {
// 日期解释错误
return null;
}
}
“));
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 是否是字符串,null 空格不算, 是为true,否为false
isEmpty: null 和 '' 两者选一 为空
```java
//ParseException 无法解析的日期异
protected Date parseDate(String dateString) {
try {
return dateFormat.parse(dateString);
} catch (ParseException e) {
// 日期解释错误
return null;
}
}