1.通过xml配置查询条件
<select>
<select_web value="select * from web t where t.id=? and t.name=?" >
<param value="1">id</param>
<param value="2">name</param>
</select_web>
</select>
加一点命名规则例如我数据库了里面的字段是 leave_msg
bean的字段就是leaveMsg
复杂的类型还没弄,只搞了个字符串
2.通过反射就可以统统执行了update、delete、insert了
/**
* 普通的sql执行 判断sql的标准是是数字 默认最大参数个是小于10
*
* @param sqlMsg
* @param obj
*/
public boolean execSql(Map<String, String> sqlMsg, Object obj) {
if (null != sqlMsg) {
String sql = "";
// 获取sql 重新填充值
for (String s : sqlMsg.keySet()) {
if (!s.matches("\\d{1}")) {
sql = s;
sqlMsg.remove(s);// 移除这个key值
//break;
}else{
if(null==obj)continue;
String key=s;
String value=sqlMsg.get(s);
try {
Field field=obj.getClass().getDeclaredField(s);//属性权威私有
value=field.get(obj).toString();
sqlMsg.put(key, value);
} catch (Exception e) {
logger.info("执行sql:"+sql+"参数装配的时候,异常了。"+e);
}
}
}
if(null==sql||"".equals(sql)){
logger.info("执行sql为空!");
return false;
}
int count=-1;
PreparedStatement psState=null;
try {
psState = this.con.prepareStatement(sql);
logger.info("执行的SQL为:"+sql);
int countParam=sqlMsg.size();
for(int i=1;i<=countParam;i++){
psState.setString(i, sqlMsg.get(String.valueOf(i)));
}
count=psState.executeUpdate();
con.commit();//事务提交
psState.close();
} catch (SQLException e) {
try {
con.rollback(); //回滚
if(null!=psState)
psState.close();//执行关闭
} catch (SQLException e1) {
logger.info("事务回滚失败了" + e);
}
logger.info("在执行sql的时候异常了\n" + e);
}
return count==-1?false:true;
}
return false;
}
3.通过发射装配下select
if(rs.next()){ //有数据
ResultSetMetaData msd=rs.getMetaData();
for(int i=0;i<msd.getColumnCount();i++){
String columnName=msd.getColumnName(i);
int type=msd.getColumnType(i);
switch(type){
case Types.VARCHAR:
break;
case Types.DATE:
break;
}
}
}
可以获取查询列的属性,名称,类型-》去装配这个obj
单条查询;
多条根据查询的结果可以反复组装
简单的数据类型应该还是好组装的,复杂类型有点困难了这里也不考虑哈哈
4.做一个简单的池子
1.池子在一个list里面;放着数据库链接的对象,对象有上面的工具类
private String username;
private String password;
private String url;
private String num;//编号
private Connection con;
private int status; // 0:free 其他 被使用
2.初始化的时候实例这个list;
3.获取 数据库链接对象 更具状态来
4.不够用就会涉及到添加进这个池子,并且操作完要摧毁的操作了(新添加是是从新实例化还是,克隆一个类的?)
5.够用直接通过状态获取(用完了该状态);
判断直接通过编号来