ORACLE:

1.在使用romnum的时候如果有内层嵌套子查询,则应该在rownum上指定别名,否则rownum只会在最内层生效 错误:

select distinct(select name from tuser) from tmall where rownum < 5 ; 正确: select distinct(select name from tuser) from tmall m where m. rownum < 5;

2.批量添加顺序错误union 去除重复,同时还会导致拼接的顺序被打乱,将原有表的顺序搞,union all 不去重复,顺序不变

3.使用sysdate的时候要注意,可能生产库和测试库的时区不一致可能会导致sysdate和当前所在地区的时间不一致,这时应该使用currentDate();

4.decode的用法

5.char类型的数据,在数据库里面是定长,CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。 当检索到CHAR值时,查询的值和被查询的值 尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。一定要注意varchar和char的坑

6.select * from Table where id in( x, x, x,)条件查询中x的数量不能超过1000,否则会抛异常,可以使用 in ( select x from dual union all select x from dual …)来替代

7.在操作数据库时,如果由于操作失误导致数据库表锁或者行级锁,解决方案,

--查看锁对应的SID, SERIAL# 
SELECT S.SID,
       S.SERIAL#,
       L.ORACLE_USERNAME,
       L.OS_USER_NAME,
       O.OBJECT_NAME,
       L.LOCKED_MODE
  FROM V$LOCKED_OBJECT L
  JOIN V$SESSION S
    ON L.SESSION_ID = S.SID
  JOIN DBA_OBJECTS O
    ON L.OBJECT_ID = O.OBJECT_ID;

--根据SID, SERIAL#,把SESSION KILL掉

ALTER SYSTEM KILL SESSION '3162,42949'IMMEDIATE ;

8.order by字段为字符串时,排序是按照ascill码,可能会出问题,若需要排序的字段为数字,但是存储的数据结构为varchar2,需要按数字排序,则需要使用to_number()函数,转化为数字之后再排序

9.数据库连接池,在使用springboot时 引用spring-boot-starter-jdbc默认会使用tomcat-jdbc连接池!为了防止有时候数据库断线,导致数据库连接失效,需要配置数据库断线重连

#初始化连接
spring.datasource.initial-size=10
#最大空闲连接
spring.datasource.max-idle=20
#最小空闲连接
spring.datasource.min-idle=5
#最大连接数量
spring.datasource.max-active=50
#是否在自动回收超时连接的时候打印连接的超时错误
spring.datasource.log-abandoned=true
#是否自动回收超时连接
spring.datasource.remove-abandoned=true
#超时时间(以秒数为单位)
spring.datasource.remove-abandoned-timeout=180
#超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
spring.datasource.max-wait=60000
#检测数据库的查询语句
spring.datasource.validation-query=select 1 from dual
#取连接的时候是否需要检查,一般不建议开启
spring.datasource.test-on-borrow=true
#是否测试空闲数据库连接---后面3条配合使用
spring.datasource.test-while-idle=true
#配置空闲时间,当到达空闲时间后,该链接会被检查,单位ms
spring.datasource.min-evictable-idle-time-millis=600000
#自动每隔五分钟检测空闲超过配置时间分钟的连接
spring.datasource.time-between-eviction-runs-millis=300000

10.mybatis动态sql,适用于分库分表查询,动态SQL是mybatis的强大特性之一,mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态sql进行处理。在动态sql解析过程,#{}与${}的效果是不一样的,

  • #{}将传入的参数当成一个字符串,会给传入的参数加一个双引号
  • ${}将传入的参数直接显示生成在sql中,不会添加引号
  • #{}能够很大程度上防止sql注入,${}无法防止sql注入

${}在预编译之前已经被变量替换了,这会存在sql注入的风险。一般传入表名或者字段名称