对谷歌sql2o框架的简单封装

源码:https://github.com/fishlikewater/scorpio-jdbc

功能特点

轻量级,使用sql2o的api操作数据库
内置常用查询模板,快速使用
sql使用专门的资源文件维护,与代码分离
使用注解,最大化减少代码量

使用方式

1.首先将数据源注入
$ 1.1 javaConfig方式注入数据源

  @Bean
    public Sql2o sql2o(){
        BaseUtils.getBuilder.setDebug(Boolean.valueOf(debug));
        return BaseUtils.open(dataSource());
    }

$ 1.2 其他方式注入

这里留有几种方式初始化,只用在使用前调用这几个方法中一个就可以了

    BaseUtils.open(String url, String user, String password);
    BaseUtils.open(DataSource dataSource);
    BaseUtils.open(Sql2o sql2o_);

2.编写一个DAO 使其继承BaseDAO,在类上使用@Table注解,标明其对应的数据库表,以及主键和映射实体类 例如:

 @Table(pojo = AgendaDTO.class,table = "m_article", pk = "a_id")
  public class AgendaDAO extends BaseDAO {

    }

这里的主键pk也可以放在映射的实体中,使用@Id标注:

public class AgendaDTO extends BaseObject {

    @Transient
    private static final long serialVersionUID = 1L;
    @Id
    private String id;
    private String title;
    private String startTime;
    private String endTime;
    private Boolean allDay;
    private String color;
    private String url;
    private Boolean editable;
    private String className;//class
    private String backgroundColor;/
    private String borderColor;
    private String textColor;
    private String userId;
    private String isFinish;
    private String createTime;
}

  实体映射类需要继承BaseObject, 这里的 @Transient表示不是映射字段(主键默认字段名为idt)

api调用

到此就可以使用api来操作数据了

插入数据到数据库

    AgendaDAO agendaDAO = new AgendaDAO();
    AgendaDTO agendaDTO = new AgendaDTO();
    /** 设置属性省略 */
    articleDAO.create(agendaDTO);/** 设置有主键,或者主键自增 */
    articleDAO.createAndId(agendaDTO);/** 根据配置策略生成主键,目前默认为uuid */

    AgendaDTO[] agendaDTOs = new AgendaDTO[];
    articleDAO.createAndId(agendaDTOs);/** 批量创建 */

还有其他创建方式就不列出来了

删除数据

    AgendaDAO agendaDAO = new AgendaDAO();
    AgendaDTO agendaDTO = new AgendaDTO();
        /** 设置属性省略 */
    agendaDAO.remove(id);
    agendaDAO.removeByIds(ids);
    agendaDAO.removeByCondition(agendaDTO);
    agendaDAO.removeByCriteria(" title='test' and color='red'");/**自定义条件*/

还有其他删除方式就不列出来了

更新数据

    AgendaDAO agendaDAO = new AgendaDAO();
    AgendaDTO agendaDTO = new AgendaDTO();
        /** 设置属性省略 */
    agendaDTO.update(agendaDTO);
    agendaDTO.update(map);/** 可以是和映射实体对应的Map */
    agendaDTO.updateNotIgnoreNull(agendaDTO);
    agendaDTO.updateByCondtion(BaseObject data, BaseObject condition);
    agendaDTO.updateByConditionIgnoreEmpty(BaseObject data, BaseObject condition);

还有其他更新方式就不列出来了

  查询的方式比较多,可以将查询的结果封装成任意对应的对象,就不一一详说了,下面说一下模板.
  模板文件以.sqlmap为后缀,默认查找路径为当前DAO类同目录,可以通过@Table注解中的fileMapper配置,可以指定一个目录,也可以指定具体的文件 如果不配置fileMapper或者指定目录,默认查找文件名为当前类名。模板以键值对的形式保存

    queryLableName = SELECT name from article_lable where id in(${lableIds});

    updateStatus = update m_article set is_public=${status} where a_id=#${id}#;

    queryCountByTitle = select count(*) from m_article a left join article_type t on a.type_id=t.id where 1=1
                     <#if title??>
                       and a.name like #%${title}%#
                    ;

模板的写法可查看freemark语法(这里使用#${id}#,#包裹表示字符串),如此就可以使用DAO调用编写的sql

    Map paramMap = new HashMap<>(); 
    paramMap.put("title", title); 
    int count = articleDAO.queryCountByTpl("queryCountByTitle", paramMap);

这里的sql可以做缓存 只要配置BaseUtils.getBuilder().setDev(false)。dev默认为false,在开发时最好设置为true,这不会缓存sql,可随意更改sql,并立即生效。

支持表创建

如果需要在初始化的时候自动创建表,需要配置BaseUtils.getBuilder().setCreate(true),dto需要注解配置:

   @IdGenerator(value = Generator.DEFINED, idclass = MyIdFactory.class)
    private String aId;

    @Column(value = "name",type = Types.VARCHAR, length = 20,nullable = false)
    private String name;

    @Column(value = "flag",type = Types.BOOLEAN,defaultValue = "0")
    private Boolean flag;

@IdGenerator 注解中有属性 value 枚举表示生成主键的方式,枚举如下:

  public enum Generator {

        AUTO,UUID,DEFINED

    }

  AUTO表示数据库主键自增,uuid表示生成uuid主键,defined表示自定义生成,配置definedd时,一定要配置属性idclass,表示主键生成的类,这个类继承类IdDefined,实例如下:

   public class MyIdFactory implements IdDefined {
        @Override
        public String getId() {
            return "t_option"+UUIDUtils.get();
        }
    }

@Column拥有的属性如下:

   public @interface Column {

        String value();

        int type() default Types.VARCHAR;

        int length() default 255;

        boolean nullable() default false;

        String describe() default "";

        boolean index() default false;

        String columnDefined() default "";

        String defaultValue() default "";

    }

  其中 index 表示该列是否建立索引,columnDefined用来定义一些不好设置的数据类型如: decimal(10,2),defaultValue为默认值,如果类型为Types.BOOLEAN时,默认值用字符串"0","1"表示false与true。

注意:查询结果如果为list 那么所有的表头字段均被转换为小写。

2018-03-13 添加多数据源支持

  支持两种多数据的方式,1:使用@DS(value="dateSouceName“) 该方式使用了spring的aop 只支持spring。 2: 代码层面支持多只读数据源及多写数据源,需开启BaseUtils.getBuilder().setOPenReadyAndWrite(true), 使用public static void openOnlyReady(DataSource... dataSource)与public static void openWrite(DataSource... dataSource)分别注入数据源,在进行数据库操作时,自动通过sql语句判断读写,随机选择读或写的数据源。

你可能感兴趣的:(对谷歌sql2o框架的简单封装)