Skip to content
/ xuery Public

一个干净直接的sql构造工具,以及一个基于jdbcTemplate的增删改查工具

License

Notifications You must be signed in to change notification settings

shann09/xuery

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

一个干净直接的sql构造工具,以及一个基于jdbcTemplate的增删改查工具

  1. 实体类是干干净净的pojo,无注解,无extends其他框架类,方便在SQL和NoSQL之间重用实体类

  2. 自动将查询出的蛇形命名字段转成pojo中的小驼峰命名属性

  3. 自动将传入的pojo的小驼峰命名属性转成蛇形命名的sql

  4. Query类的toString方法可以打印出易读的sql,少量修改(或不需修改)后可以直接拿来执行,方便检查sql语法错误

  5. 只用少量的类和方法来完成sql构建,生成的Query实例也只是包含一个string和一个map

  //先搭建好数据库,并执行init.sql

  import com.alibaba.druid.pool.DruidDataSource;
  import org.junit.Test;
  import tech.shann.entity.User;
  import tech.shann.entity.model.UserModel;
  import tech.shann.xuery.*;
  
  import java.text.ParseException;
  import java.text.SimpleDateFormat;
  import java.util.*;
  import java.util.function.BiFunction;
  import java.util.function.BinaryOperator;
  
  /**
   * Created by shann on 17/6/15.
   */
  public class JdbcTest {
  
      private JDBC jdbc = null;
  
      {
          DruidDataSource dataSource = new DruidDataSource();
          dataSource.setDriverClassName("com.mysql.jdbc.Driver");
  
          dataSource.setUrl("jdbc:mysql://localhost:3306/wo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT");
          dataSource.setUsername("root");
          dataSource.setPassword("root");
  
          dataSource.setInitialSize(50);
          dataSource.setMinIdle(30);
          dataSource.setMaxActive(600);
          dataSource.setTimeBetweenEvictionRunsMillis(1000 * 30);
          dataSource.setMinEvictableIdleTimeMillis(1000 * 30);
          dataSource.setValidationQuery("SELECT 'x'");
          dataSource.setTestWhileIdle(true);
          dataSource.setTestOnBorrow(false);
          dataSource.setTestOnReturn(false);
          dataSource.setRemoveAbandoned(true);
          dataSource.setRemoveAbandonedTimeout(1200);
          dataSource.setLogAbandoned(false);
  
          jdbc = new JDBC(dataSource);
  
      }
  
      @Test
      public void testJoin(){
          Query q = new QueryBuilder()
                  .push("select " +
                          "u.id,u.user_name," +
                          "u.mobile," +
                          "u.create_time," +
                          "uc.company_id," +
                          "c.company_name " +
                          "from sys_user u")
                  .push("left join user_company uc")
                  .push("on(u.id = uc.user_id)")
                  .push("left join company c")
                  .push("on(uc.company_id = c.id)")
                  .push("where")
                  .push(new QueryField("u.mobile","=","111222333"))
                  .push("order by u.user_name")
                  .build();
          System.out.println(q);
          List<UserModel> l = jdbc.queryForBeanList(
                  q,
                  UserModel.class
          );
          System.out.println(l.size());
          System.out.println(l.get(0).getUserName());
          System.out.println(l.get(0).getCompanyId());
          System.out.println(l.get(0).getCompanyName());
      }
  
      @Test
      public void testModelCastToEntity(){
          UserModel a = new UserModel();
          a.setId(1l);
          a.setUserName("周瑜");
          a.setCompanyId(22l);
  
          jdbc.update(
                  new QueryBuilder()
                          .push("update sys_user set")
                          //虽然实例a是个Model,含有表中不存在的companyId和companyName,但通过传入User.class可以滤除多余字段
                          .push(new QueryFieldProp(a,User.class))
                          .push("where")
                          .push(new QueryField("id","=",a.getId()))
                          .build());
  
      }
  
      @Test
      public void testStream(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user")
                  .build();
  
          Map<String,User> am =
  //                new ArrayList<User>()
                  jdbc.queryForBeanList(q.getSqlStr(),q.getArgsMap(),User.class)
                  .stream()
                  .reduce(new HashMap<String, User>(),
                          new BiFunction<HashMap<String, User>, User, HashMap<String, User>>() {
                              @Override
                              public HashMap<String, User> apply(HashMap<String, User> m, User a) {
                                  m.put(a.getMobile(),a);
                                  return m;
                              }
                          },
                          new BinaryOperator<HashMap<String, User>>() {
                              @Override
                              public HashMap<String, User> apply(HashMap<String, User> m1, HashMap<String, User> m2) {
                                  m1.putAll(m2);
                                  return m1;
                              }
                          }
                  );
          System.out.println(am.size());
      }
      @Test
      public void testDate(){
          User u1 = new User();
          u1.setUserName("黄忠");
          u1.setMobile("88");
          u1.setCreateTime(new Date());
          jdbc.insertGenID("sys_user",u1,User.class,"id");
  
      }
  
      @Test
      public void testDuplicate(){
          User u1 = new User();
          u1.setUserName("诸葛亮1");
          u1.setMobile("66");
  
          User u2 = new User();
          u2.setUserName("诸葛亮2");
          u2.setMobile("66");
  
          try {
              jdbc.insertGenID("sys_user",u1,User.class,"id");
              jdbc.insertGenID("sys_user",u2,User.class,"id");
  
              System.out.println("yes");
          }catch (Exception e){
              Throwable cause = null;
              if(!((cause = e.getCause())!=null
                      && cause.getClass().getName().equals("com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException")
                      && cause.getMessage().startsWith("Duplicate entry"))){
                  throw e;
              }
              System.out.println("吃掉重复异常,其他异常重新抛出");
          }
      }
  
      @Test
      public void testDelete(){
          Query q = new QueryBuilder()
                  .push("delete from sys_user where")
                  .push(new QueryField("user_name", "=", "周瑜"))
                  .build();
          System.out.println(q.toString());
          int i = jdbc.delete(q.getSqlStr(),q.getArgsMap());
          //也能直接传query实例
  //        int i = jdbc.delete(q);
  
          System.out.println(i);
      }
      @Test
      public void testBatchInsert(){
          User u1 = new User();
          u1.setUserName("f");
          u1.setMobile("11");
  
          User u2 = new User();
          u2.setUserName("h");
          u2.setMobile("22");
  
          User u3 = new User();
          u3.setUserName("i");
          u3.setMobile("33");
  
          List<User> l = new ArrayList<User>(){{
              add(u1);
              add(u2);
              add(u3);
          }};
  
          //mobile是有唯一性索引字段
          //如果数据库中22存在,11不存在,33不存在
          // 那么抛出异常,但是11和33还是会插入到数据库中!
  
          jdbc.batchInsert("sys_user",l);
  
      }
      @Test
      public void testBatchInsert2(){
          UserModel u1 = new UserModel();
          u1.setUserName("f");
          u1.setMobile("11");
          u1.setCompanyId(1l);
  
          UserModel u2 = new UserModel();
          u2.setUserName("h");
          u2.setMobile("22");
          u2.setCompanyId(1l);
  
          UserModel u3 = new UserModel();
          u3.setUserName("i");
          u3.setMobile("33");
          u3.setCompanyId(1l);
  
          List<UserModel> l = new ArrayList<UserModel>(){{
              add(u1);
              add(u2);
              add(u3);
          }};
  
          //mobile是有唯一性索引字段
          //如果数据库中22存在,11不存在,33不存在
          // 那么抛出异常,但是11和33还是会插入到数据库中!
  
          jdbc.batchInsert("sys_user",l);
  
      }
  
      @Test
      public void testInsertGenID(){
          User u = new User();
          u.setUserName("e");
          u.setMobile("99");
  
          jdbc.insertGenID("sys_user",u,User.class,null);
          System.out.println(u.getId());
      }
      @Test
      public void testInsertGenID2(){
          UserModel u = new UserModel();
          u.setUserName("e");
          u.setMobile("88");
          u.setCompanyId(5l);
  
          jdbc.insertGenID("sys_user",u,User.class,null);
          System.out.println(u.getId());
      }
      @Test
      public void testInsert(){
          User u = new User();
          u.setId(3l);
          u.setUserName("d");
          u.setMobile("33");
  
          jdbc.insert("sys_user",u);
          System.out.println(u.getId());
      }
      @Test
      public void testInsert2(){
          UserModel u = new UserModel();
          u.setId(4l);
          u.setUserName("d");
          u.setMobile("44");
          u.setCompanyId(1l);
  
          jdbc.insert("sys_user",u);
          System.out.println(u.getId());
      }
  
      @Test
      public void testQueryForInt(){
          Query q = new QueryBuilder()
                  .push("select count(*) from sys_user")
                  .build();
          System.out.println(q.toString());
          int i = jdbc.queryForInt(q);
  
          System.out.println(i);
      }
      @Test
      public void testQueryForMap(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user where")
                  .push(new QueryField("id","=",1l))
                  .build();
          System.out.println(q.toString());
          Map<String,Object> m = jdbc.queryForMap(q);
  
          System.out.println(m.get("mobile"));
          System.out.println(m.get("user_name"));//对的
          System.out.println(m.get("userName"));//错的
      }
      @Test
      public void testQueryForMapList(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user")
                  .build();
          System.out.println(q.toString());
          List<Map<String,Object>> l = jdbc.queryForMapList(q);
          System.out.println(l.size());
          for(Map<String,Object> m:l){
              System.out.println(m.get("mobile"));
              System.out.println(m.get("user_name"));//对的
              System.out.println(m.get("userName"));//错的
  
          }
      }
  
      @Test
      public void testQueryForSingleValueList(){
          Query q = new QueryBuilder()
                  .push("select mobile from sys_user")
                  .build();
          System.out.println(q.toString());
          List<String> sl = jdbc.queryForSingleValueList(q,String.class);
          for(String s:sl){
              System.out.println(s);
          }
      }
  
      @Test
      public void testQueryForSingleValue(){
          Query q = new QueryBuilder()
                  .push("select user_name from sys_user where")
                  .push(new QueryField("id","=",1))
                  .build();
          System.out.println(q.toString());
          String s = jdbc.queryForSingleValue(q.getSqlStr(),q.getArgsMap(),String.class);
          System.out.println(s);
  
      }
  
      @Test
      public void testQueryForBeanList(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user")
                  .push("where")
                  .push(new QueryField("id","=",1))
                  .push("and")
                  .push(new QueryField("user_name","in",new ArrayList<String>(){{
                      add("周瑜");
                      add("诸葛亮");
                      add("刘备");
                  }}))
                  .build();
          System.out.println(q.toString());
          List<User> l = jdbc.queryForBeanList(q,User.class);
          System.out.println(l.size());
  
      }
  
      @Test
      public void testQueryForBeanAndUpdate(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user where")
                  .push(new QueryField("id","=",14))
                  .build();
          System.out.println(q.toString());
          User h = jdbc.queryForBean(q.getSqlStr(),q.getArgsMap(),User.class);
  
          h.setUserName("c");
          Query q1 = new QueryBuilder()
                  .push("update sys_user set ")
                  .push(new QueryFieldProp(h))
                  .push("where")
                  .push(new QueryField("id", "=", h.getId()))
                  .build();
          jdbc.update(q1);
  
      }
  
      @Test
      public void testRandomUpdate(){
          Query q = new QueryBuilder()
                  .push("update sys_user set")
                  .push(new QueryField("mobile", "=", "111222333"))
                  .push(",")
                  .push(new QueryField("user_name", "=", "刘备"))
                  .push("where")
                  .push(new QueryField("id","=",1))
                  .push("or")
                  .push(new QueryField("id","=",2))
                  .build();
          System.out.println(q.toString());
          int r = jdbc.update(q.getSqlStr(),q.getArgsMap());
          System.out.println(r);//返回被update的行数
          //如果更新字段违反了唯一性约束,那么任何一行都不会被更新
  
      }
  
      @Test
      public void testInAndNotIn(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user")
                  .push("where")
                  .push(new QueryField("id", "ni", new ArrayList<Long>(){{
                      add(11l);
                      add(22l);
                  }}))
                  .push("and")
                  .push(new QueryField("user_name", "in", new ArrayList<String>() {{
                      add("周瑜");
                      add("诸葛亮");
                      add("刘备");
                  }}))
                  .build();
          System.out.println(q.toString());
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
      }
  
      @Test
      public void testIsBlank(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .push("where")
                  .push(new QueryField("create_time", "ib",null))
                  .build();
          System.out.println(q.toString());
          //select * from sys_user u  where  ( create_time is null or create_time = '' )
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
      }
  
      @Test
      public void testNotBlank(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .push("where")
                  .push(new QueryField("mobile", "nb",null))
                  .build();
          System.out.println(q.toString());
          //select * from sys_user u  where  ( mobile is not null and mobile <> '' )
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
      }
  
      @Test
      public void testLargeThen(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .push("where")
                  .push(new QueryField("create_time", ">",new Date()))
                  .push("or")
                  .push(new QueryField("id",">=",1))
                  .build();
          System.out.println(q.toString());
          //select * from sys_user u  where  create_time > '2017-07-01'  or  id >= '1'
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
      }
  
      @Test
      public void testNotEqual() throws ParseException {
          Query q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .push("where")
                  .push(new QueryField("create_time", "<>",new SimpleDateFormat("yyyy-MM-dd").parse("2017-09-11")))
                  .push("and")
                  .push(new QueryField("mobile","!=","11"))
                  .build();
          System.out.println(q.toString());
          //select * from sys_user u  where  create_time <> '2017-09-11'  and  mobile != '11'
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
      }
  
      @Test
      public void testLike(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .push("where")
                  .push(new QueryField("mobile","like","111%"))
                  .build();
          System.out.println(q.toString());
          //select * from sys_user u  where  mobile like '111%'
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
      }
  
      @Test
      public void testLimit(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .push("where")
                  .push(new QueryField("id","nb",null))
                  .push("limit "+1+","+2)
                  .build();
          System.out.println(q.toString());
          //select * from sys_user u  where  ( id is not null and id <> '' )  limit 1,2
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
      }
  
      @Test
      public void testGroupBy(){
          Query q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .push("where")
                  .push(new QueryField("id","nb",null))
                  .push("group by id ")
                  .build();
          System.out.println(q.toString());
          //select * from sys_user u  where  ( id is not null and id <> '' )  group by id
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
      }
  
      @Test
      public void testPager(){
          //mysql default
          Query q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .setPager(new QueryPager(1,2))
                  .build();
          System.out.println(q.toString());
          //select * from sys_user u  limit 2 , 2
          List<User> users = jdbc.queryForBeanList(
                  q,
                  User.class
          );
          System.out.println(users.size());
  
  
          //oracle
          q = new QueryBuilder()
                  .push("select * from sys_user u")
                  .setPager(new QueryPager(1,2))
                  .setDbType("oracle")
                  .build();
          System.out.println(q.toString());
          //select * from (  select * ,rownum rn from sys_user u  where rownum< 5  ) where rn>= 3
  //        users = jdbc.queryForBeanList(
  //                q,
  //                User.class
  //        );
  //        System.out.println(users.size());
      }
  
  
  
  }

About

一个干净直接的sql构造工具,以及一个基于jdbcTemplate的增删改查工具

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages