数据库对象包括表、视图(查询)、存储过程(参数查询)、函数、约束。对象名字由前缀和实际名字组成,长度不超过30。
1)前缀:
使用小写字母。如:
表(Table) tb_
字段(Column)
主键(Primary key) pk_
外键(Foreign key) fk_
Check约束(Check Constraint) ck_
Default 约束(Default Constraint) df_
视图(View) vi_
索引(Index) idx_
存储过程(Stored procedure) sp_
用户定义函数 (User-defined function) fn_
序列(Sequence) seq_
表空间(Tablespace) ts_
变量名(Variable) @
触发器(Trigger) tr_
2)实际名字:
实际名字尽量描述实体的内容,由单词或单词组合,每个单词的首字母大写,其他
字母小写,不以数字和_开头。如:
表 User_Info
视图 User_List
存储过程 User_Delete
3)示例:
合法的对象名字类似如下:
表 tb_User_Info tb_Message_Detail
视图 vi_Message_List
存储过程 sp_Message_Add
第一种方式:序列化+显示调用序列化。
第二种方式:序列化+触发器;
一:
第一步:创建序列sequence
(序列名格式要求 :序列(Sequence) seq_XXX )
//创建sequence
create sequence seq_on_table
increment by 1
start with 1
nomaxvalue
nocycle
nocache;
第二步:显示调用序列
insert into table values('001', '安保部', '000', 1, seq_on_test.nextval);
第三步:查询进行查看
select * from table
数据库 给表格设置默认值 来显示调用序列化的值
bean.xml中使用序列化实现新增
<insert id="addDevice">
<selectKey keyProperty="vo.主键名" resultType="long"
order="BEFORE">
SELECT 序列名.nextval FROM DUAL
selectKey>
insert into
表名(id,列名)
values(#{vo.deviceId},#{vo.列名对应值})
insert>
二:
第一步:创建序列sequence
create sequence SEQ_LOG_ID
minvalue 1 --增长最小值
maxvalue 9999999999 --增长最大值,也可以设置NOMAXvalue -- 不设置最大值
start with 101 --从101开始计数
increment by 1 --自增步长为1
cache 50 --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---NOCACHE防止跳号
cycle; --循环,当达到最大值时,不是从start with设置的值开始循环。而是从1开始循环
第二步:建立触发器
(命名格式:触发器(Trigger) tr_XXX )
create or replace trigger tr_test_id
before insert on S_Depart --defore在添加时触发S_Depart 是表名
for each row --行级触发器
declare
nextid number;
begin
IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
select SEQ_ID.nextval --SEQ_ID正是刚才创建的
into nextid
from sys.dual;
:new.DepartId:=nextid;
end if;
end tr_test_id;
第三步:插入数据测试看主键是否自增
踩坑
1: *号 不能随便用,如果不同表名之间含有相同列名,则数据库无法查出数据。外层sql只是单纯继承内部时可用。
2:sql 有严格的空格 要求。
3:xml里最后一个值 后面不能接逗号 会报错
4:对传入的变量要进行判空处理,避免出现异常
5:数据库对列的值 有范围要求时 要写明在接口文档内
6:特殊字符要进行转义处理
7:数组对象要进行迭代
8:变量类型,和数据库类型不同是要进行声明处理
<foreach collection="devIdList" item="item" open=","
separator=",">
#{item}
foreach>
查询分页sql
在已经查询出来的结果集合中按照特定范围进行嵌套查询 返回结果
<select id="getWorkOrdersPages" resultType="com.nw.hms.server.v2.vo.workOrder.WorkOrderVo">
select t.work_order_id workOrderId,
t.station_name stationName,
t.station_id stationId,
t.item_code itemCode,
t.item_name itemName,
t.dev_name deviceName,
t.dev_id deviceId,
t.dev_addr deviceAddr,
t.maintenance_id maintenanceId,
t.maintenance_name maintenanceName,
t.maintenance_tel maintenanceTel,
t.faultType_id faultTypeId,
t.faultType_name faultTypeName,
t.status status,
t.created createTime,
t.start_time startTime,
t.finish_time finishTime,
t.remarks remarks
from
(select rownum rowno, t9.*
from (select t1.work_order_id,
t2.station_name,
t1.station_id,
t1.item_code,
t3.item_name,
t4.dev_name,
t4.dev_id,
t4.dev_addr,
t5.maintenance_id,
t5.maintenance_name,
t5.maintenance_tel,
t6.faultType_id,
t6.faultType_name,
t1.status,
t1.created,
t1.start_time,
t1.finish_time,
t1.remarks
from work_order t1
inner join config_station t2
on t2.id = t1.station_id
inner join
monitor_item t3
on t3.item_code = t1.item_code
inner join config_device
t4
on t4.dev_id = t1.dev_id
inner join maintenance_info t5
on
t5.maintenance_id = t1.maintenance_id
inner join fault_type t6
on
t6.faultType_id = t1.faultType_id
where t1.user_id = #{vo.userId}
and
t1.faultType_id = #{vo.faultTypeId}
<if test="vo.searchText != null and vo.searchText != ''">
and (
t2.station_name like
'%'||#{vo.searchText,javaType=String,jdbcType=VARCHAR}||'%'
or
t3.item_name like '%'||
#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
or t4.dev_id
like '%'|| #{vo.searchText,javaType=String,jdbcType=VARCHAR}
||'%'
or
t4.dev_name like '%'||
#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
or t4.dev_addr
like '%'||
#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
or
t5.maintenance_name like '%'||
#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
or
t6.faultType_name like '%'||
#{vo.searchText,javaType=String,jdbcType=VARCHAR} ||'%'
or t1.status
like '%'|| #{vo.searchText,javaType=String,jdbcType=VARCHAR}
||'%'
)
if>
) t9) t
where t.rowno ]]>
#{vo.start}
and t.rowno
#{vo.end}
新增1
<insert id="addRoleObjRef">
<if test="roleIds.size != 0">
insert all
<foreach collection="roleIds" item="item" separator=",">
into sys_role_obj_ref(role_id,obj_id,obj_type)
values(#{item},#{objId},#{objType})
foreach>
select 1 from dual
if>
insert>
新增2
<insert id="addUserSelectAreas" parameterType="java.util.ArrayList" useGeneratedKeys="false">
insert into user_select_area(
id,
user_id,
type_id,
area_id
) SELECT SEQ_USER_SELECT_AREA.nextval,a.user_id,a.type_id,a.area_id FROM (
<foreach collection="voList" item="vo" separator="union all">
SELECT
#{vo.userId,jdbcType=NUMERIC} user_id,
#{vo.typeId,jdbcType=NUMERIC} type_id,
#{vo.areaId,jdbcType=NUMERIC} area_id
FROM dual
foreach>
) a
insert>
删除
<delete id="delUserSelectAreas">
delete from user_select_area
where 1=1
<if test="idList != null and idList.size > 0 ">
and id in
<foreach collection="idList" item="id" index="index" open="(" close=")" separator=",">
#{id}
foreach>
if>
delete>
无主键自增长
<insert id="saveBatchWorkOrder" parameterType="java.util.ArrayList" useGeneratedKeys="false" >
insert into work_order(
user_id,
station_id,
item_code,
dev_id,
maintenance_id,
faultType_id,
remarks,
status)
<foreach collection="reqWOList" item="vo" separator="union all">
select
#{vo.userId,jdbcType=NUMERIC} user_id,
#{vo.stationId,jdbcType=NUMERIC} type_id,
#{vo.itemCode} item_code,
#{vo.deviceId } dev_id,
#{vo.maintenanceId, jdbcType=NUMERIC} MAINTENANCE_ID,
#{vo.faultTypeId ,jdbcType=NUMERIC} faultType_id,
#{vo.remarks} remarks,
#{vo.status} status
from dual
</foreach>
</insert>