仿照ThinkPhp里的model类用JAVA封装了一个差不多的东西

ThinkPhp的model

有段时间在研究PHP,然后就接触了thinkphp,然后就结识了tp里边的model。
访问数据库 可以这样

table->where('a=1')->and('b>2')->select()

emmm,很牛X有没有?反正我觉得很牛X
好了,在这里这个东西就不多说了。
详细的话这个博客有讲解
tpmodel详细讲解
讲得十分详细,反正我是没看懂。

思路

要达到tp5里边那种效果,其实就是动态的去拼接查询语句,然后执行数据库操作,所以难点在于怎样进行语句的组装。
而要达到连点的效果,只要返回当前这个类就可以了。
大体思路就是这样的,然后我就动手开始做了。
建了一些有的没的的类。
还是贴一下代码吧

private String getSelectSql(Map tables,ConditionModel condition){
		//组装sql
		StringBuffer sql =new StringBuffer("select ");
		if(condition.getField()==null||condition.getField().size()==0){
			sql.append("* ");//没有字段要求则查找所有
		}else{
			for (String field : condition.getField()) {
				sql.append(field+",");//拼接查询字段
			}
			sql.deleteCharAt(sql.length()-1);//去掉末尾多余的字符
		}
		if(tables==null||tables.size()==0) new Exception("表名为空").printStackTrace();
		sql.append(" from ");
		for (String key : tables.keySet()) {
			sql.append(String.format("%s %s,", tables.get(key),key));//拼接表名和别名
		}
		sql.deleteCharAt(sql.length()-1);
		if(condition.getWhere()!=null&&!"".equals(condition.getWhere())){
			sql.append(String.format(" where %s", condition.getWhere()));
		}
		if(condition.getGroup()!=null&&!"".equals(condition.getGroup())){
			sql.append(" group by "+condition.getGroup());//拼接分组语句
			if(condition.getHaving()!=null&&!"".equals(condition.getHaving())){
				sql.append(String.format(" having %s", condition.getHaving()));
			}
		}
		if(condition.getOrder()!=null){
			sql.append(" order by "+condition.getOrder());//拼接排序
		}
		return sql.toString();
	}

以上就是我拼接查询语句的核心方法,写这个东西我是想了蛮久的,具体多久我不记得了,反正很久。

结果

经过一番努力,终于把代码写完了,然后就开始测试,于是我就写了一个demo

	public static void main(String[] args) {
		//实例化
		Model m = new Model();
		m.setConn("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "train", "train");//设置数据库连接
		m.OracleModel();//设定为oracle模式
		
		//单行查询
		show(m.From("user_tables").find(),"单行查询");
		
		//单行指定字段查询 注意如果没有重新使用From重置查询的表格,接下来的查询都会查询这张表格
		show(m.field("table_name,tablespace_name").find(),"单行指定字段");
		
		//单行条件查询
		show(m.where("instr(table_name,:name)>0").put("name","A").find(),"单行条件查询");//查找表名中包含A的记录的第一行
		
		//复合条件 and会在where的基础上添加条件,如果没有使用where直接使用and 等同于where
		show(m.and("instr(tablespace_name,:name)>0").put("name","U").find(),"复合条件查询");
		
		//多行查询 注意使用where 会清除前面用and或or添加的查询条件
		show(m.where("rownum<10").select(),"多行查询");
		
		//分组查询  注意field不更新会保持原来的设定 不使用 where("")清除查询条件,条件将会被保留
		show(m.field("count(1) c,substr(table_name,0,1) first").where("").GroupBy("substr(table_name,0,1)").select(),"分组查询");
		
		//分组查询二次筛选 筛选条件请一次写清除 例如 a>2 and b>3 or c<0
		show(m.Having("count(1)>1").select(),"分组查询二次筛选");
		
		//查询排序
		show(m.field("table_name,tablespace_name").where("rownum<11").GroupBy("").Having("").OrderBy("table_name desc").select(),"查询排序");
		
		//联合查询 注意 where会清除on的条件 on等价于and
		show(m.field("A.table_name,A.column_name,comments").From("user_tab_cols").join("user_col_comments").where("rownum<11").on("A.table_name=B.table_name").on("A.column_name=B.column_name").select(),"联合查询");
		
		//分页查询
		show(m.where("").page(2, 10).getResult(),"分页查询");
		
		//插入
		Map parms = new  HashMap();
		parms.put("k", "k");
		parms.put("v","v");
		m.From("tp_test").put(parms).insert();
		show(m.select(),"插入结果");
		
		//更新
		parms.put("v", "a");
		m.From("tp_test").where("k=:k").put(parms).update();
		show(m.select(),"更新后结果");
		
		//删除
		m.delete();
		show(m.select(),"删除后结果");
	}
	
	private static void show(Map map,String title){
		if(map!=null){
			System.out.println(title);
			ConsoleTable t = new ConsoleTable(map.keySet().size(), true);
			t.appendRow();
			for(String key : map.keySet()){
				t.appendColum(key);
			}
			t.appendRow();
			for(String key : map.keySet()){
				t.appendColum(map.get(key));
			}
			System.out.println(t.toString());
		}
	}
	
	private static void show(List> list,String title){
		if(list!=null&&list.size()!=0){
			System.out.println(title);
			ConsoleTable t = new ConsoleTable(list.get(0).keySet().size(), true);
			t.appendRow();
			for(String key : list.get(0).keySet()){
				t.appendColum(key);
			}
			for(Map row : list){
				t.appendRow();
				for(String key : row.keySet()){
					t.appendColum(row.get(key));
				}
			}
			System.out.println(t.toString());
		}
	}

里边的consoleTable 这个类是在网上找的,用于java控制台格式化输出表格
控制台格式化表格输出
测试结果是这样的
仿照ThinkPhp里的model类用JAVA封装了一个差不多的东西_第1张图片
emmm还是蛮好看的,目前就只是写了oracle的接口实现,下一步是完善mysql的实现
下面附上jar包的下载链接
https://download.csdn.net/download/qq_21327945/10873212
github源码地址
https://github.com/k297512373/javatp

你可能感兴趣的:(一些有趣的东西)