轻量级,使用sql2o的api操作数据库
内置常用查询模板,快速使用
sql使用专门的资源文件维护,与代码分离
使用注解,最大化减少代码量
2019-09-14 代码生成gui
public class TestTemplate {
@Test
public void testGui(){
CreateCodeUtils.main();
}
}
2019-08-13 优化枚举,灵活使用
public enum TypeEnum implements IEnum<Integer> {
TYPE1(1, "类型一"), TYPE2(2, "类型二");
private Integer code;
private String desc;
TypeEnum(Integer code, String desc){
this.code = code;
this.desc = desc;
}
public String getDesc(){
return desc;
}
@Override
public Integer getSaveField() {
return code;
}
}
新建的枚举实现IEnum 并实现 getSaveField 方法, 该方法返回枚举在数据库中存放的属性
2019-04-23 添加自动代码生成
public class TestTemplate {
@Test
public void testTpy(){
Properties p = new Properties();
p.setProperty("jdbc.url", "jdbc:sqlite:scorpio-jdbc.db");
p.setProperty("jdbc.username", "");
p.setProperty("jdbc.password", "");
p.setProperty("jdbc.driver", "org.sqlite.JDBC");
p.setProperty("table", "resources");
p.setProperty("pack", "com.test");
p.setProperty("fileMapper", "/mapper");
p.setProperty("basePath", "F:\\IdeaProjects\\easy-sql\\sql2o-core");
p.setProperty("templatePath", "F:\\IdeaProjects\\easy-sql\\sql2o-core\\src\\main\\resources");
CreateTemplate.init(p);
CreateTemplate.createMapper();
CreateTemplate.createModel();
CreateTemplate.createService();
}
}
2019-04-19 ActiveRecord 模式
@Data
@Table(fileMapper = "/Resources.sqlmap")
public class Resources extends BaseModel<Resources> {
@Id
private Integer id;
@Column("name")
private String name;
private String resUrl;
private Integer type;
private Integer parentId;
private Integer sort;
}
实体类(默认表名驼峰格式,可通过注解@Mapping table属性指定)继承BaseModel, 支持注解的注解@Table,@Id,@Column,@Transient
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 容器中需注入数据源)
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_);
spring boot 启动类上添加@EnableSql2o 注解(需maven添加自动配置依赖)
2.编写一个mapper 使其继承BaseMapper<'对应实体'>,在类上使用@Table注解,标明其对应的数据库表,以及主键和映射实体类 例如:
@Table(table = "m_article")
public class AgendaMapper extends BaseMapper<Agenda> {
}
在映射的实体中,使用@Id标注主键:
public class Agenda implements BaseModel {
@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;
}
实体映射类需要继承BaseModel, 这里的 @Transient表示不是映射字段
到此就可以使用api来操作数据了
插入数据到数据库
AgendaMapper agendaMapper = new AgendaMapper(); Agenda agenda = new Agenda(); /** 设置属性省略 */ agendaMapper.save(agenda);/** 设置有主键 */ agendaMapper.saveIgnoreId(agenda) /** 忽略主键 自增*/ Agenda[] agendas = new Agenda[]; agendaMapper.save(agendas, true);/** 批量创建 */
还有其他创建方式就不列出来了
删除数据
AgendaMapper agendaMapper = new AgendaMapper(); Agenda agenda = new Agenda(); /** 设置属性省略 */ agendaMapper.removeById(id); agendaMapper.removeByIds(ids); agendaMapper.remove(new UpdateModel());/** 通过UpdateModel 构造删除条件*/
更新数据
AgendaMapper agendaMapper = new AgendaMapper(); /** 设置属性省略 */ agendaMapper.update(new UpdateModel());/** 通过UpdateModel 构造更新条件*/
查询的方式比较多,可以将查询的结果封装成任意对应的对象,就不一一详说了,下面说一下模板:
模板文件以.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}#,#包裹表示字符串),如此就可以使用Mapper调用编写的sql
Map paramMap = new HashMap<>(); paramMap.put("title", title); int count = agendaMapper.count(new QueryModel().tpl("queryCount", paramMap)); int count = agendaMapper.update(new UpdateModel().tpl("queryCount", 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<map> 那么所有的表头字段均被转换为小写。