这篇文章最要是介绍对sql2o 简单封装,方便使用,项目地址[easy-sql](https://gitee.com/fishlikewater/easy-sql)
1.轻量级,使用sql2o的api操作数据库
2.内置常用查询模板,快速使用
3.sql使用专门的资源文件维护,与代码分离
4.使用注解,最大化减少代码量
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 BaseMapper {
}
这里的主键pk也可以放在映射的实体中,使用@Id标注:
public class AgendaDTO implements 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表示不是映射字段(主键默认字段名为id)
到此就可以使用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}%#
</#if>;
模板的写法可查看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 添加多数据源支持
代码层面支持多只读数据源及多写数据源,需开启BaseUtils.getBuilder().setOPenReadyAndWrite(true), 使用public static void openOnlyReady(DataSource… dataSource)与public static void openWrite(DataSource… dataSource)分别注入数据源,在进行数据库操作时,自动通过sql语句判断读写,随机选择读或写的数据源。
2018-12-30 添加多数据源支持
配置spring boot 注解自动配置 启动类上添加@EnableSql2o 注解(spring 容器中需注入数据源)