开源软件名称:ormybatis
开源软件地址:https://gitee.com/javahui/ormybatis
开源软件介绍:
比较MyBatis Generator ...- 单表操作只要po类Dao类不需要xml文件.
- 每个DAO对应的生成mapper xml几乎空白.
- 没有使用接口mapper方式。而使用Dao class的方式,这样service层的dao操作代码可以移到Dao层.
- insert时,自动设置当前日期为新增时间和修改时间 ,自动设置is_deleted为0.
- 查询时,自动加上is_deleted = 0条件.
- 所有操作至少一个查询条件,防止全表操作,select查询默认加上Limit 1000,防止查询大量记录.
- 使用bean方式加入Select查询条件,自动识别分页属性,时间范围查询。
1. 加入jar <dependency> <groupId>pers.richard</groupId> <artifactId>ormybatis-spring-starter</artifactId> <version>${project.version}</version> </dependency> 2. spring配置:XML配置文件方式<bean id="dataSource" ... /><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations"> <list> <!-- dao类自定义sql xml文件 --> <value>classpath:mapper/*.xml</value> <!-- ormybatis的sql xml,单表CRUD模板文件,必须 --> <value>classpath:ormybatis.xml</value> </list> </property> <property name="configuration"> <bean class="org.apache.ibatis.session.Configuration"> <property name="mapUnderscoreToCamelCase" value="true"/> </bean> </property> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <value> helperDialect=mysql </value> </property> </bean> </array> </property></bean>Springboot配置文件方式spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/d?useSSL=false&useUnicode=true&characterEncoding=utf-8 username: root password: 123456##### 3. 加入插件,生成基本代码 <plugin> <groupId>pers.richard</groupId> <artifactId>ormybatis-maven-plugin</artifactId> <version>1.0.0-SNAPSHOT</version> </plugin>##### 4. 在项目的 src/main/resources目录下增加ormybatis.properties文件用以生成代码 jdbc.url=jdbc:mysql://localhost:3306/dbName?useSSL=true jdbc.username=root jdbc.password=123456 table.name=user #生成src/main/resources路径下的文件夹名 sqlFile.path=mapper # DAO类包路径 dao.package.path=pers.richard.example.dao # po类包路径 domain.package.path=pers.richard.example.po #Dao类名(可选) dao.class.name= #Domain bean类名(可选) domain.class.name=##### 3. 运行mvn ormybatis:gen 生成dao类,po类,mapping xml文件###### 3.1. @DaoConfig注解 table(表名)###### 3.2. 查询demo```java@DaoConfig(table = "user")public class UserDao extends OrmybatisBaseDao<User>{ //主键id查询 public void selectId() { //一个id查询 User u1 = super.selectOne(1); User u2 = super.selectOne("1"); //Where id in (1,2) --多id查询 List<User> userList = super.selectList("1,2"); List<User> userList2 = super.selectList(Arrays.asList(1,2)); //Where id in (1,2,10,20) --多id查询 List<String> list = new ArrayList(); liset.add("1, 2"); liset.add("10, 20"); List<User> userList2 = super.selectList(list); } //一个条件查询 public void selectOneFieldWhere() { //默认1:没有设置order by排序,则默认加上order By id desc //默认2:默认加上Limit 1,防止查出多条查询 //WHERE age = 18 Limit 1 Order BY id desc User u1 = super.selectOne(Field.AGE, "18")//返回一个对象 User u2 = super.selectOne(Field.AGE, "")//传入空,不执行查询,返回null //传入空,不执行查询,selectList返回空集合,不是null List<User> list = super.selectList(Field.NAME, "") log.info(list.toString())//不会报NullPointException 返回[] } public void selectWhere(){ //默认1:如果没设置order by排序,则默认加上order By id desc //默认2:如果没设置limit,则默认加上Limit 5000,防止查出数据太多,导致jvm异常 //select * from user ORDER BY id desc limit 5000 List<Account> super.selectList(Select.create()); //select * from user ORDER BY age DESC limit 10 List<Account> super.selectList(Select.create().orderDesc(Field.AGE).limit(10)); Select select1 = Select.create() .eq(Field.NAME, "");//忽略空的查询条件 .eq(Field.STATUS, "0,1"); //自动为List<Integer>根据javaBean po中的类型 User u = super.selectOne(select1); //WHERE status in (0,1) ORDER BY id Limit 1 List<User> list = super.selectList(select1); //WHERE status in (0,1) ORDER BY id Limit 5000 //查询条件说明 Select s2 = Select.create() .eq(Field.AGE, "1234")// account_no = '1234' .like(Field.NAME, "wang")// account_no LIKE conat('wang', '%') .likeContains(Field.NAME, "wang") // account_no LIKE conat('%', 'wang', '%') .gt(Field.AGE, 101); // AGE > 101 .gte(Field.AGE, 100); // AGE >= 100 .lt(Field.AGE, 101); // AGE < 101 .lte(Field.AGE, 100); // AGE <= 100 .isNull(Field.AGE) // age is null .isNullString(Field.NAME) //age='' //时间范围的查询,如果Field字段是Date日期,同时使用 大于, 小于等范围查询,则自动转为(yyyy-MM-dd HH:mm:ss)格式 //传入值的格式支持各种形式 //WHERE create_time >= '2020-01-01 00:00:00' and create_time <= '2020-12-31 11:59:59' Select.create(Select.create().gte(Field.CREATE_TIME, '2020-01-01').lte(Field.CREATE_TIME, '2020-12-31')) Select.create(Select.create().betweenDate(Field.CREATE_TIME, '2020-01-01', '2020-12-31'))//效果一样 Map<String, Object> paramMap = new HashMap<>(); paramMap.put("age", 1234); // age='1234'(默认转为下划线命名法) paramMap.put("status", "0, 1")); // acc_status in (0, 1) 自动变成in多个值查询 Select.create(paramMap); //Where age=18 AND status= 0 ,忽略不存在字段名 Bean bean = new Bean().setAge("18").setStatus(0); Select.create(bean); //Where createTime>='2021-01-01 00:00:00' and create_time<='2021-10-01 00:00:00' limit 20 //自动识别时间的范围查询和分页查询 Bean bean = new Bean() .setPageNo(1) .setPageSize(20) .setStartTime("2021/01/01") .setEndTime("2021/10/01"); Select.create(bean); //Where create_time>='2000-01-01 00:00:00' AND create_time<='2020-12-31 23:59:59' Map map = new HashMap() map.put("startTime", "2000年");//bean有startTime属性则表示查询开始起始时间 map.put("endTime", "2020");//bean有endTime属性则表示查询开始结束时间 Select.create(map); Select.create(Field.STATUS,0).orderDesc(Field.ID).limit(5);//status=0按Id倒序前5 Select.create(Field.STATUS,0).orderDesc(Field.ID).limitPage(2,20); //status=0按Id倒序取第2页20条 Select.create().eval("age = 18"); //注入sql查询语句, where age = 18 Select.create().eval("{} = {}", "id", 100); //占位符形式, where id = 100 } //只查询指定的单条字段 public void selectField(){ //SELECT id FROM user WHERE stauts = 0 Order By id desc Limit 5000 List<Integer> ids = super.selectListByField(Field.ID, Select.create(Field.STATUS, 0)); //SELECT id FROM user WHERE stauts = 0 Order By id desc Limit 1 Integer id = super.selectOneByField(Field.ID, Select.create(Field.STATUS, 0)); } //查询记录数量 public void count(){ //查询 acc_stauts = 0的一共有多少记录数 Select s = Select.create(Field.STATUS, 0); Integer count = super.count(s); //效果同上 Map<String, Object> paramMap = Collections.singletonMap("status", 0); Integer count1 = super.count(paramMap); } //自定义SQL查询语句 public void getAgeByName(String name) { //默认按当前dao的方法名去查找mapper select id Map resultMap = super.selectOneMapperStatementByMethodName(name); List<Map> result1 = super.selectListMapperStatementByMethodName(name); //指定select id,不需要加namespace Map map2 = super.selectOneStatement("getAgeByName", name) List<Map> result2 = super.selectListStatement("getBalanceByAccountNo", accountNo) } public void insert() { Date now = new Date(); //setUpdateTime,setCreateTime可不写,自动为当前时间 User u = new User() .setName("1234") .setStatus(0) .setAge(18) .setCreateUser(当前操作userId) //可省略, .setUpdateTime(new Date()).setCreateTime(new Date());//可省略,自动会加createTime,updateTime super.insert(account1); //按id主键查询有则update,无则insert super.insertOrUpdate(u); //查询name='jack'的记录,有则忽略,无则insert操作 int insertResult = super.insertIfAbsent(u, Select.create(Field.NAME, "jack")); //查找account_no = '1234' 的记录,有则用bean去update这条记录,无则insert操作 int insertResult1 = super.insertOrUpdate(u, Select.create(Field.NAME, "jack")); //批量新增 List<User> list = ...; super.insertBatch(list); //批量新增 ,每100条做commit; super.insertBatch(list, 100); //手写sql,指定xml的insert id suer.insert("insertId", parameterObject); } //修改操作 public void update() { Date now = new Date(); User user = super.selectOne(1); user.setStatus(0); user.setUpdateTime(now);//可省略,自动设置当前时间 super.update(user); Update u1 = Update.create() .whereEq(Field.NAME, "1234") // where account_no = '1234' .updateEq(Field.STATUS, 0) //acc_status=0 .updateIncr(Field.AGE, 10);//age = age + 10 自增10 .updateReduction(Field.AGE, 10);//age = age - 10 自减10 updateNum = super.update(u1); //批量update,同批量insert类似 List<Account> list = ...; super.updateBatch(list); //update status = 0 Where id = 1; Update u2 = Update.create().updateEq(Field.STATUS, 0).whereEq(Field.ID, 1) int updateNum = super.update(u2); } public void delete(){ super.delete(Select.create(Field.ID, 1));//按查询条件删除,同update一样,必有一个查询条件,不支持全表删除 super.delete("1,2");//删除id in (1,2) }} account.xml 生成一个只有基本字段名的xml,用来写自定义sql,方便写sql复制字段名 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="user"> <sql id="columns"> t.ID "id", t.NAME "name", t.STATUS "status", t.AGE "age", t.CREATE_TIME "createTime", t.UPDATE_TIME "updateTime" </sql></mapper> java po 实体bean public class User extends AbstractDomain { private Integer id; //主键ID private String name; //名称 private Integer status; //状态 private BigDecimal balance; //年纪 private Date createTime; //创建时间 private Integer createUser; //创建时间 private Date updateTime; public User(){} public enum Field implements IField {//生成此处枚举,方便构造查询条件,代码联想功能 ID, NAME, STATUS, AGE, CREATE_TIME, UPDATE_TIME; } public Integer getId() {return id;} public Account setId(Integer id) {this.id = id;return this;} ......省略其它get set} |
请发表评论