有段时间在研究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
里边的consoleTable 这个类是在网上找的,用于java控制台格式化输出表格
控制台格式化表格输出
测试结果是这样的
emmm还是蛮好看的,目前就只是写了oracle的接口实现,下一步是完善mysql的实现
下面附上jar包的下载链接
https://download.csdn.net/download/qq_21327945/10873212
github源码地址
https://github.com/k297512373/javatp