在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:fastquery开源软件地址:https://gitee.com/xixifeng.com/fastquery开源软件介绍:Apache Maven<dependency> <groupId>org.fastquery</groupId> <artifactId>fastquery</artifactId> <version>1.0.117</version> <!-- fastquery.version --></dependency> Gradle/Grailscompile 'org.fastquery:fastquery:1.0.117' FastQuery 数据持久层框架FastQuery 基于Java语言.他的使命是:简化Java操作数据层. FastQuery 主要特性如下:
运行环境要求JRE 8+ 配置文件配置文件的存放位置默认从 c3p0-config.xml完全支持c3p0官方配置,详情配置请参照c3p0官网的说明. <?xml version="1.0" encoding="UTF-8"?><c3p0-config> <named-config name="xk-c3p0"> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://192.168.1.1:3306/xk?useSSL=false</property> <property name="user">xk</property> <property name="password">abc123</property> <property name="acquireIncrement">50</property> <property name="initialPoolSize">100</property> <property name="minPoolSize">50</property> <property name="maxPoolSize">1000</property> <property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property> </named-config> <!-- 可以配置多个named-config节点,多个数据源 --> <named-config name="name-x"> ... ... </named-config></c3p0-config> druid.xml用于配置支持Druid连接池,详细配置请参照 https://github.com/alibaba/druid <beans> <bean name="xkdb1" id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="jdbc:mysql://db.fastquery.org:3305/xk" /> <property name="username" value="xk" /> <property name="password" value="abc123" /> <property name="filters" value="stat" /> <property name="maxActive" value="20" /> <property name="initialSize" value="1" /> <property name="maxWait" value="60000" /> <property name="minIdle" value="1" /> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="poolPreparedStatements" value="true" /> <property name="maxOpenPreparedStatements" value="20" /> </bean> <!-- 再配置一个数据源 --> <bean name="xkdb2" id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="jdbc:mysql://db.fastquery.org:3305/xk" /> <property name="username" value="xk" /> <property name="password" value="abc123" /> </bean></beans> hikari.xml用于配置支持HikariCP连接池,详细配置选项请参照 https://github.com/brettwooldridge/HikariCP <beans> <bean name="xkdb2"> <property name="jdbcUrl" value="jdbc:mysql://192.168.1.1:3306/xk" /> <property name="dataSource.user" value="xk" /> <property name="dataSource.password" value="abc123" /> <property name="dataSource.cachePrepStmts" value="true" /> <property name="dataSource.prepStmtCacheSize" value="250" /> <property name="dataSource.prepStmtCacheSqlLimit" value="2048" /> <property name="dataSource.useServerPrepStmts" value="true" /> <property name="dataSource.useLocalSessionState" value="true" /> <property name="dataSource.rewriteBatchedStatements" value="false" /> <property name="dataSource.cacheResultSetMetadata" value="true" /> <property name="dataSource.cacheServerConfiguration" value="true" /> <property name="dataSource.elideSetAutoCommits" value="true" /> <property name="dataSource.maintainTimeStats" value="false" /> </bean> <!-- 可以配置多个bean节点,提供多个数据源 --> <bean name="name-x"> ... ... </bean></beans> 支持多连接池共存,如,同时让Druid,HikariCP工作,并配置多个数据源. fastquery.json配置数据源的作用范围 // @author xixifeng ([email protected])// 配置必须遵循标准的json语法.{ "scope":[ // config 用于指定由谁来提供数据源,如,"c3p0","druid","hikari"等等 { "config": "c3p0", // 表示由c3p0负责提供数据源 "dataSourceName": "xk-c3p0", // 数据源的名称 "basePackages": [ // 该数据源的作用范围 "org.fastquery.example", // 包地址 "org.fastquery.dao.UserInfoDBService" // 完整类名称 // 在这可以配置多个DB接口或包地址,以","号隔开 // 提醒:在json结构中,数组的最后一个元素的后面不能加"," ] }, /* 再配置一个数据源作用域 */ { "config" : "mySQLDriver", // 表示由mySQLDriver负责提供数据源 "dataSourceName": "shtest_db", // 数据源的名称 "basePackages": [ // 该数据源的作用范围 "org.fastquery.example.DataAcquireDbService" // 在这可以配置多个DB接口,以","号隔开 ] }, { "config": "c3p0", // 表示由c3p0负责提供数据源 "basePackages": [ "org.fastquery.dao2.UserInfoDB" ] } ] } 注意: 在fastquery.json中配置作用域,其中"dataSourceName"不是必须的,"dataSourceName"要么不指定,要指定的话那么必须正确.如果没有指定"dataSourceName",那么在调用接口的时候必须指定数据源的名称.下面的适配数据源章节会讲到."basePackages"若配置了包地址,那么对应的数据源会作用这个包的所有类,及所有子包中的类. 数据源的初始化是从"fastquery.json"开始的,根据从里面读到"dataSourceName"的值,取相应的配置,继而完成数据源的创建.如,创建一个名为"rex-db"的数据源: { "config": "c3p0", "dataSourceName": "rex-db"} 在这里,"basePackages"不是必须的,该数据源可以当做是一个服务,供没有明确指定数据源的Repository使用. 入门例子当看到一个例子时,切勿断章取义,多看一眼,往往会有意想不到的结果.
public class Student { private String no; private String name; private String sex; private Integer age; private String dept; // getter / setter 省略... } 实体属性跟数据库映射的字段必须为包装类型,否则被忽略. 在实体属性上标识
public interface StudentDBService extends org.fastquery.core.Repository { @Query("select no, name, sex from student") JSONArray findAll(); @Query("select no,name,sex,age,dept from student") Student[] find(); }
public class StudentDBServiceTest { // 获取实现类 private static StudentDBService studentDBService = FQuery.getRepository(StudentDBService.class); @Test public void test() { // 调用 findAll 方法 JSONArray jsonArray = studentDBService.findAll(); // 调用 find 方法 Student[] students = studentDBService.find(); }} 注意:不用去实现StudentDBService接口.通过 一个接口不实现它的 唯一的出路,只能引用接口,这就使得开发者编程起来不得不简单,因为面对的是一个高度抽象的模型,而不必去考虑细枝末节.接口可以看成是一个能解析SQL并能自动执行的模型,方法的参数、绑定的模版和标识的注解无不是为了实现一个目的:执行SQL,返回结果. 这种不得不面向接口的编程风格,有很多好处:耦合度趋向0,天然就是对修改封闭,对扩展开放,不管是应用层维护还是对框架增加新特性,这些都变得特别容易.隐藏实现,可以减少bug或者是能消灭bug,就如解决问题,不如消灭问题一般,解决问题的造诣远远落后于消灭问题,原因在于问题被解决后,不能证明另一个潜在问题在解决代码中不再出现,显然消灭问题更胜一筹.应用层只用写声明抽象方法和标识注解,试问bug从何而来?该框架最大的优良之处就是让开发者没办法去制造bug,至少说很难搞出问题来.不得不简便,没法造bug,显然是该项目所追求的核心目标之一. 不管用不用这个项目,笔者期望读者至少能快速地检阅一下该文档,有很多设计是众多同类框架所不具备的,希望读者从中得到正面启发或反面启发,哪怕一点点,都会使你收益. 针对本文@Query的由来该项目开源后,有些习惯于繁杂编码的开发者表示,"使用 带条件查询// sql中的?1 表示对应当前方法的第1个参数// sql中的?2 表示对应当前方法的第2个参数// ?N 表示对应当前方法的第N个参数 // 查询返回数组格式@Query("select no,name,sex,age,dept from student s where s.sex=:sex and s.age > ?1")Student[] find(Integer age,@Param("sex")String sex); // 查询返回JSON格式@Query("select no, name, sex from student s where s.sex=:sex and s.age > ?2")JSONArray find(@Param("sex")String sex,Integer age); // 查询返回List Map@Query("select no, name, sex from student s where s.sex=?1 and s.age > :age")List<Map<String, Object>> findBy(String sex,@Param("age")Integer age);// 查询返回List 实体@Query("select id,name,age from `userinfo` as u where u.id>?1")List<UserInfo> findSome(@Param("id")Integer id); 参数较多时不建议使用问号(?)引用参数,因为它跟方法的参数顺序有关,不便维护,可以使用冒号(:)表达式,跟顺序无关, ":name" 表示引用标记有@Param("name")的那个参数. 注意: 在没有查询到数据的情况下,如果返回值是集合类型或 // 针对该方法,如果没有查询到数据,返回值的结果是一个长度为0的Student[]@Query("sql statements")Student[] find(Integer age,String sex); // 针对该方法,如果没有查询到数据,返回值的结果是一个空Map(非null)@Query("sql statements")Map<String,Object> find(Integer id);// 针对该方法,如果没有查询到数据,返回值的结果是一个空List<Map>(非null)@Query("sql statements")List<Map<String, Object>> find(String sex); 注意: 查询单个字段,还支持返回如下类型:
除了改操作或count外,查单个字段不能返回基本类型,因为:基本类型不能接受 // 查询单个字段,若没有查到,就返回空List<String>(非null)@Query("select name from Student limit 3")List<String> findNames(); 类属性名称与表字段不一致时,如何映射?为了说明这个问题先准备一个实体 public class UserInformation { private Integer uid; private String myname; private Integer myage; // getters / setters // ... ...} 而数据库中的表字段分别是id,name,age,通过 // 把查询到的结果映射给UserInformation@Query("select id as uid,name as myname,age as myage from UserInfo u where u.id = ?1")UserInformation findUserInfoById(Integer id); 动态条件查询采用 |
请发表评论