1.重点内容
- PlSQLMapper是什么?
- PlSQLMapper的insert、delete与update操作
- PlSQLMapper的select操作
2.运行展示
SQLMapper的Insert操作
SQLMapper的Update操作
3.PlSQLMapper
PlSQLMapper是peanutlib的DB模块一个组件,解决在代码中操作数据库的SQL代码与C++的逻辑代码分离。它的规则很简单,只要在XML配置文件中书写SQL语句,然后在C++代码中拿到SQL,并合并到业务逻辑中就OK。
特点如下:
1.不依赖一种数据库。使用一种数据库,当要求换其它数据库时,只需将SQLMapper的配置文件中的SQL模板换成其它数据库兼容的模板就可以,无需修改C++中的任何代码。
2.支持SQL的各种写法,包括动态SQL。
3.SQL模板一次编写,可不断套用模板重复使用。
4.不依赖第三方库,完全兼容QT。
5.不需要生成额外的数据库实体类,只需要在XML中配置SQL与数据库表的操作映射就可以。
6.对QT的模型类兼容友好,例如:QSqlTableModel类等可兼容使用,不冲突。
4.程序示例
4.1 映射数据库表
我们首先要确定要操作的表,例如对ps_staff_item表,该表的结构如下:
CREATE TABLE [ps_staff_item](
[staff_no] varchar(20) PRIMARY KEY ASC NOT NULL,
[staff_name] varchar(30) NOT NULL,
[borrow_charge] decimal(10, 2),
[dest_address] varchar(50),
[begin_date] DATE,
[end_date] DATE,
[is_refund] char(1) NOT NULL);
第一步:编写sqlMapper配置文件
在工程的resource下建立/plsqlmap/sqlite/psample_sqlmapper.xml文件,我们可以用文本编辑器(Notepad++)编辑psample_sqlmapper.xml。
下面是该文件的主要内容:
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<peanut>
<sqlmapper id="psStaffItemMapper" name="员工费用明细表" type="sqlite" >
<sql id="psStaffItemColumns" name="ps_staff_item的列名映射" type="string">
staff_no,
staff_name,
borrow_charge,
dest_address,
begin_date,
end_date,
is_refund
</sql>
<sql id="psStaffItemColumnsMap" name="ps_staff_item的列名取值模板映射" type="map">
<!-- staff_no列模块:#staff_no表示该列。: 相当于等于符号。'${staff_no}'是一个模板,${ }是模块占位符,staff_no是列值占位符,在${staff_no}两边有' '单引号,表示模板中取值的常量-->
<!-- 例如,当前staff_no的值是张三,经过sqlMapper取值处理后,置换成'张三'-->
#staff_no : '${staff_no}';
#staff_name : '${staff_name}';
#borrow_charge : ${borrow_charge};
#dest_address : '${dest_address}';
#begin_date : ${begin_date};
#end_date : ${end_date};
#is_refund : '${is_refund}'
</sql>
<sql id="selectAllPsStaffItem" name="ps_staff_item的select模板语句" type="select">
<!-- ${string::psStaffItemColumns} 表示取sqlid="psStaffItemColumns"的值,值为ps_staff_item的列名映射的值,其中${ }是模板占位符 -->
<!-- ${whereSql} 表示whereSql占位,sqlMapper经过where子句置换后,带where条件,其中${ }是模板占位符-->
<sqlText>select ${string::psStaffItemColumns} from ps_staff_item ${whereSql}</sqlText>
</sql>
<sql id="selectAllPsStaffItemCount" name="ps_staff_item的select count模板语句" type="select">
<sqlText>select count(*) as staff_count from ps_staff_item ${whereSql}</sqlText>
</sql>
<sql id="selectAllPsStaffItemMax" name="ccps_staff_item的select max模板语句" type="select">
<sqlText>select max(staff_no) as staff_max from ps_staff_item ${whereSql}</sqlText>
</sql>
<sql id="insertPsStaffItem" name="ps_staff_item的insert模板语句" type="insert">
<!-- ${string::psStaffItemColumns} 表示取sqlid="psStaffItemColumns"的值,值为ps_staff_item的列名映射的值,其中${ }是模板占位符 -->
<!-- ${sql} 表示insert的values子句占位,sqlMapper经过values子句置换,将置换成values子句,其中${ }是模板占位符-->
<sqlText>insert into ps_staff_item(${string::psStaffItemColumns}) values(${sql})</sqlText>
<!-- sqli