UMC ORM 数据访问

APIUMC
后端知识体系开发原生移动应用
UMC ORM 是我们UMC架构的数据访问层,已经用java和.net实现,他简化了数据库访问的方式方法,极大的提高后台工程师的coding效率,有效减少70%的数据访问代码 还充分提高可读性
在我们后台工程师,大部分的开发都是与数据库打交道,与数据库的开发是整个后台的重中之重,在这块内容,如何提高,有点工作经验都有采用一个开发数据访问架构来加快效率,这此架构强行把业务逻辑与数据层分开,美其名曰分层开发,数据操作本身就是业务逻辑的一种,采用强行分开,会导致代码可读性大大减弱,特别时间一长,或者人员离职交接,更能体现这个问题;还有乙方面对客户现场各样的数据库,如果有一个与数据库无关的实现数据访问,将能很好的减轻的开发强度,这此内容都是困绕我们的后台工程师,拥有这块内容解决方案,相信能大大提高工程师的产能,解放了人员的生产力。
UMC架构,从实战中回来,特意优化数据库访问方式,让我们采用链式操作就能完成更新、删除、插入,整个过程都不用写SQL,采用链式操作,看上去更像自然语言表达,大大提供的可读性,在安全上,全面排除的SQL注入风险,在coding的代码量上可以说,能有效帮助后端工程师少写70%与数据库访问的代码,还提高的可读性,感觉非常有必要单独拿拿出来与大家讲解,UMC ORM也是一套实体管理SQL的方式方法,目前已实现了java与.net的实体链式访问方式层,下面我们就用java实例与大家讲解,各个方法.net都有,执行结果都是一致的;同样 UMC ORM为各个数据库提供一致操作方式,现在的业务逻辑,不用再考虑使用什么数据库了,不再考虑怎么划分访问层了,从此你发现,原来访问数据coding也可以这样优美。
实例讲解实现
下面我就用用户实体类做实例讲解:
//用户实体类 public class User { public String Username; public String Alias; public Integer Flags; public Date RegistrTime; public Date ActiveTime; public UUID Id; }
注意:UMC ORM的实体类字段类型要使用引用类型,不能使用值类型
实体插入
看一我们的实现链式访问,是怎么样完成一个用户注册的呢,看下面代码:
Map<String,String[]> mapUser=req.getParameterMap(); User user=new User(); Utility.setField(user,mapUser);//实体赋值 //数据库操作 Database.instance().objectEntity(User.class) .where().and().equal("Username",user.Username) .entities().iff(e-> e.count()==0,e->e.insert(user)); //代码完成了重名检测,再插入到数据库
从上面完成了用户注册了,我的数据库访问简单明了,再不用强行多出多层来来实现,架构会自己生成对应的SQL来插入数据库,这生成 的SQL是采用SQL92标准,只要支持SQL92标准的数据库都支持,市面上没有不支持SQL92标准的关系性数据库,所有我们就也完成了与数据库无关的操作了。
下面我们再进行查询分布,排序,分组,看我们此架构是怎么完成的
实体更新、查询、分组
IObjectEntity<User> entity = Database.instance().objectEntity(User.class); //这是like查询,会自动加入%号 User like= new User(); like.Alias="吴顺明"; entity.where().and().like(like); //或下面的 //entity.where().and().like("Alias", "吴顺明"); //这是排序 User order = new User(); order.RegistrTime = new Date(); entity.order().asc(order); //或下面的 //entity.order().asc("RegistrTime"); ///分页查询 User[] users = entity.query(0, 12); //自动生成SQL分页查询,返回此条件下的0-12行用户 //这是分组查询 User group = new User(); group.Flags = 0; User max = new User(); max.RegistrTime = new Date(); entity.groupBy(group).max(max).query(); //查看不同的Flags最近注册时间 //包含多条件,例如 在此条件同时Flags=2或者1的也就是Username like '%d%' and (Flags=2 or Flags=1); entity.where().contains().and().equal("Flags",2).or().equal("Flags",1); User update = new User(); update.Flags=2; entity.update(update);只会更新非空字段 //把非空字段插入到数据库,可插入多个 entity.insert(new User()); //删除条件数据,返回删除的条数 entity.delete();
从上面实例说可以看出,我们是在where条件可以采用实体非null字段来进行条件赋值,也可以直接字段赋值,在其他地方采用非null字段确认采用那此字段来参与运行。还有更多的方法操作实现数据与数据库打交通,基本我们的应用开发就不用再写SQL语句,SQL不会再散落在代码中,大大的提可读性,和稳定性,现在我就不一一例举,最好的掌握方式就是实践。
上面代码,是不是更像自然语言表达,后期我们维护起来就简单高效,现在是不是有信心提高自己的产能,不再996,从现在做好朝九晚五的技术人生。
SQL语句
UMC ORM,他是个优秀的数据库访问组件,当前也支持我们写SQL了,他让大家的SQL写的更简单,
ISqler sqler = Database.instance().sqler() Map user= sqler.executeSingle("select *FROM User where (Username={0} Or Alias={0}) and Flags={1}","吴顺明",1); //也可以绑定实体类查询 User user= sqler.executeSingle(User.class,"select *FROM User where (Username={0} Or Alias={0}) and Flags={1}","吴顺明",1);
从上面,我们可以得知,UMC ORM的 Sqler 访问数据库,采用的格式索引传参方式,是不是比我们传统的方式更优美,更安全呢,比拼装SQL的可读性更高。
Sqler 中有好几种与数据库访问的方法,如下
/**执行 SQL 语句,并返回影响行数 * @param sqlText 格式化的sql脚本 * @param paramers 参数 */ int executeNonQuery(String sqlText, Object... paramers); /**返回的第一行第一列 * @param sqlText 格式化的sql脚本 * @param paramers 参数 */ Object executeScalar(String sqlText, Object... paramers); /**返回的数据集合 * @param sqlText 格式化的sql脚本 * @param paramers 参数 */ List<Map> execute(String sqlText, Object... paramers); /**返回分页的数据集合 * @param sqlText 格式化的sql脚本 * @param start 开始位置 * @param limit 记录数 * @param paramers 参数 */ List<Map> execute(String sqlText, int start, int limit, Object... paramers); /**返回查询的第一行并把转化为字典 * @param sqlText 格式化的sql脚本 * @param paramers 参数 */ Map executeSingle(String sqlText, Object... paramers); /**把查询到的字段转化对应的单个实体 * @param tClass 泛型类 * @param sqlText 格式化的sql脚本 * @param paramers 参数 * @param <T> 数据实体类 */ <T> T executeSingle(Class<T> tClass, String sqlText, Object... paramers); /**返回分页的数据表 * @param tClass 泛型类 * @param sqlText 格式化的sql脚本 * @param paramers 参数 * @param <T> 数据实体类 */ <T> List<T> execute(Class<T> tClass, String sqlText, Object... paramers); /**自定义处理一个查询只读的结果集 * @param sqlText 格式化的sql脚本 * @param reader 处理数据集代理 * @param paramers 参数 */ void execute(String sqlText, IResultReader reader, Object... paramers); /**自定义处理一个查询只读的结果集 * @param tClass 泛型类 * @param sqlText 格式化的sql脚本 * @param reader 处理数据集代理 * @param paramers 参数 * @param <T> 数据实体类 */ <T> void execute(Class<T> tClass, String sqlText, IDataReader<T> reader, Object... paramers); /**返回分页的数据表 * @param tClass 泛型类 * @param sqlText 格式化的sql脚本 * @param start 开始位置 * @param limit 记录数 * @param paramers 参数 * @param <T> */ <T> List<T> execute(Class<T> tClass, String sqlText, int start, int limit, Object... paramers); /**返回分页的数据表 * @param sqlText 格式化的sql脚本 * @param start 开始位置 * @param limit 记录数 * @param reader 处理数据集代理 * @param paramers 参数 * @param <T> */ <T> void execute(String sqlText, int start, int limit, IDataReader<T> reader, Object... paramers); /*** * 处理分页的数据集,用ResultSet处理 * @param sqlText 格式化的sql脚本 * @param start 开始位置 * @param limit 记录数 * @param reader 处理数据集代理 * @param paramers 参数 */ void execute(String sqlText, int start, int limit, IResultReader reader, Object... paramers);
从中,可我看到我们读起数据的方式应有尽有,简化的不只是一点点。
管理员 | 阅读(67) | 评论(0)
暂无评论