Mybatis
? 動態(tài)拼接
? 數(shù)據(jù)更新,replace/insert
? mybatis批量插入
? 插入的內(nèi)容含英文單引號
Mysql
? 常見錯誤
? 分區(qū)表
mysql作為開源的數(shù)據(jù)庫軟件智润,好用免費慧耍,是關(guān)系型數(shù)據(jù)庫的首選诬像。我在使用的過程中跪腹,遇到的一些問題昌腰,進行匯總开伏,不定期更新。作為記錄遭商,下次也有一個查詢的地方固灵。
Mybatis
動態(tài)拼接,實現(xiàn)有條件的數(shù)據(jù)更新或者插入
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.datacenter.manage.rmdbrecord.dao.OperaDataLoadMapper">
<select id="list" parameterType="***Dto" resultType="***Dto">
select
id
***
,jdbc_name AS jdbcName
from operational_data_source_mysql
where 1=1 and table_schema not in ('mysql','performance_schema','sys')
<trim>
<if test="jdbcName != null">
and jdbc_name like '%${jdbcName}%'
</if>
<if test="tableSchema != null">
and table_schema like '%${tableSchema}%'
</if>
</trim>
</select>
? 通過if判斷劫流,來檢查test條件是否滿足巫玻。如果滿足則執(zhí)行,不滿足則跳過祠汇。而trim另外的三個參數(shù)仍秤。prefix為拼接sql的前綴,suffix這個是動態(tài)sql的后綴可很,suffixOverrides去掉最后多出來的符號诗力。如:insert數(shù)據(jù)時,在對象沒有數(shù)據(jù)時實現(xiàn)不插入的動態(tài)拼接我抠。
數(shù)據(jù)更新(insert into...on duplicate key update 與replace into)
? insert into ... on duplicate key update
在primary key或者unique key沖突的時候才會執(zhí)行update之后的語句(一個有意義的index是否重要)姜骡。如:
<insert id="insert" param.....>
insert into tb1 (id,name,age) select id,name,age from tb2
on duplicate key update name=#{name},age={age}
</insert>
? replace into
在唯一性沖突時(同上,primary key/unique key),將覆蓋原有的數(shù)據(jù)(先刪除屿良,再插入)圈澈。這樣的代價就是: 歷史數(shù)據(jù)無保存、無痕跡尘惧,新數(shù)據(jù)插入(部分字段無內(nèi)容康栈,則以默認值取代。以及create_time/modify_time都是最新的。)
<insert id="insert" param...>
replace into tb1 (id,name,age)
select id,name,age
from tb2
</insert>
mybatis批量插入
對于List類型來說啥么,我們需要批量的進行數(shù)據(jù)插入登舞。在mysql中也類似于動態(tài)拼接sql的過程。mybatis提供了for-each方法悬荣,如:
<insert id="insertMap" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator=";">
insert into param_map ( file_path,type, `key`, content_line, parse_result)
values
(
substring(#{item.filePath},1,1000)
,substring((#{item.key},1,1000)
,substring(#{item.contentLine},1,1000)
,substring(#{item.parseResult},1,1000)
) on duplicate key update content_line=substring(#{item.contentLine},1,1000) ,parse_result=substring(replace(replace(#{item.parseResult},1,1000) ,mtime=now()
</foreach>
</insert>
mybatis中插入的內(nèi)容中帶有英文單引號
mybatis對于參數(shù)的傳遞有兩種模式菠秒。一種是#{},一種{}則為直接傳遞數(shù)據(jù)。
我在遇到這個問題的時候嚼蚀,我是將原始的數(shù)據(jù)中''給替換掉禁灼。
mysql上的操作
腳本執(zhí)行報錯
-
Exception: Data too long for column
字段長度問題,可以通過將長度設(shè)置的更長轿曙,如varchar(1000)弄捕,如果字段內(nèi)容更長,則可以考慮設(shè)置為: mediumtext
-
Exception: Row ** was cut by GROUP_CONCAT()
處理行轉(zhuǎn)列的數(shù)據(jù)處理時需呀用到group_concat函數(shù)导帝,如果需要合并的行太多守谓,就會報這樣的錯誤∧ィ可以設(shè)置相關(guān)參數(shù)
//會話級 SET SESSION group_concat_max_len = 102400; //全局 SET GLOBAL group_concat_max_len=102400;
分區(qū)表
-
分區(qū)類型
序號 分區(qū)類型 說明 使用頻率 1 RANGE分區(qū) 給定一個連續(xù)區(qū)間的列值(非離散)分飞,將多行數(shù)據(jù)分配給對應(yīng)分區(qū) 較多 2 HASH分區(qū) 對給定的列/值算出對應(yīng)的hash值,作為對應(yīng)行的分區(qū) 較多 3 LIST分區(qū) 對行記錄睹限,匹配List(離散列表)值譬猫,放入指定分區(qū) 一般 4 KEY分區(qū) 類似于分桶,指定分桶數(shù)和分桶字段羡疗。有mysql內(nèi)部分區(qū) 一般 創(chuàng)建
create table test.user_test(
id int comment '自增id',
phone varchar(255) comment '送檢的手機號',
p_dt DATE comment '分區(qū)字段(yyyy-mm-dd)',
PRIMARY key(id,p_dt)
) ENGINE=InnoDB COMMENT='用戶風(fēng)險等級 - 依賴于騰訊天御接口'
PARTITION by range(TO_DAYS(p_dt))
(
PARTITION p1 VALUES LESS THAN (to_days('2019-08-12')) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (to_days('2019-08-13')) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (to_days('2019-08-14')) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (to_days('2019-08-15')) ENGINE = InnoDB
)
;
- 查詢分區(qū)
select table_catalog,table_schema,table_name,partition_name,partition_ordinal_position,partition_method,partition_expression,table_rows,create_time,nodegroup
from information_schema.partitions
where table_schema = schema()
and table_name='user_test';
- 操作分區(qū)
-- 新增分區(qū)
alter table xqlm_base.user_test add partition (partition p4 values less than (to_days('2019-08-16')))
-- 修改分區(qū)
alter table xqlm_base.user_test PARTITION by range(TO_DAYS(p_dt)) (partition p4 values less than (to_days('2019-08-16')))
-- 重建分區(qū)
ALTER TABLE xqlm_base.user_test rebuild partitionp1,p2;
-- 優(yōu)化分區(qū)
ALTER TABLE xqlm_base.user_test optimize partition p1,p2;
- 分區(qū)問題
-- 需求場景1:創(chuàng)建分區(qū)染服,類似實現(xiàn)create ... if exists 功能
儲存過程,調(diào)度叨恨,判斷