概述
在学习数据库期间,顺便也复习了一下Jdbc并给自己的一个常用数据表写了一个工具类。
总体是以MVC的方式来编写,在这里只是总结一下Dao接口的语句。
顺便一提,在这工具类编写时我犯了一个比较二的错误,就是在选择导包时导错了,然后为了能正确运行所以用了强转类型。虽然也影响不大吧。
Dao接口
感觉jdbc的编写在控制层与模型层上没有什么太多好说,在分离逻辑的接口层主要记录一下如何实现CRUD操作的吧。
关于连接
自己编写了一个DBUtil类来返回连接,然后在接口层中直接内部声明连接变量即可。
private static final Connection conn = DBUtil.getConnection();
连接池技术
当然数据库的连接也是可以通过连接池技术来实现的,一来我的工具类用于个人使用也用不着连接池,二来看了一下dbcp和c3p0的连接池技术,单单是获得连接的话主要还是通过配置表的方式,并不难,需要的时候再说吧。
增加操作
运用预加载语句,添加记录。
/**
* 向表中添加记录
*
* @param entity
* @throws SQLException
*/
public void add(Entity entity) throws SQLException {
String sql = "" + "insert into immoc_test" + "(user_name,sex,age,birthday,email,mobile)" + "values("
+ "?,?,?,?,?,?)";
PreparedStatement ptmt = (PreparedStatement) conn.prepareStatement(sql);
ptmt.setString(1, entity.getUser_name());
ptmt.setString(2, entity.getSex());
ptmt.setInt(3, entity.getAge());
ptmt.setDate(4, new Date(entity.getBirthday().getTime()));
ptmt.setString(5, entity.getEmail());
ptmt.setString(6, entity.getMobile());
ptmt.execute();
}
更新语句
与增加语句原理同理
/**
* 通过ID与已有的实体,更新记录
* @param id
* @param entity
* @throws SQLException
*/
public void update(int id , Entity entity) throws SQLException {
String sql = "" +
"update immoc_test" +
" set user_name = ? , sex = ? , age = ? , birthday = ? , email = ? , mobile = ?" +
"where id = ?";
PreparedStatement ptmt = (PreparedStatement) conn.prepareStatement(sql);
ptmt.setString(1, entity.getUser_name());
ptmt.setString(2, entity.getSex());
ptmt.setInt(3, entity.getAge());
ptmt.setDate(4, new Date(entity.getBirthday().getTime()));
ptmt.setString(5, entity.getEmail());
ptmt.setString(6, entity.getMobile());
ptmt.setInt(7, id);
ptmt.execute();
}
删除语句
同理
/**
* 根据id删除表中记录
* @param id
* @throws SQLException
*/
public void delete(int id) throws SQLException {
String sql = ""+
"delete from immoc_test " +
" where id =?";
PreparedStatement ptmt = (PreparedStatement) conn.prepareStatement(sql);
ptmt.setInt(1, id);
ptmt.execute();
}
查询语句
这个功能稍微有点意思,通过传入查询参数的映射的集合,来返回结果集合。
public List<Entity> query(List<Map<String,Object>> params ) throws SQLException {
List<Entity> list = new ArrayList<Entity> ();
if(params == null || params.size() == 0 ){
return list;
}
StringBuilder sb = new StringBuilder();
sb.append("select * from immoc_test where 1=1 ");
for(int i = 0 ;i<params.size() ;i ++){
Map<String, Object> map = params.get(i);
sb.append(" and + "+map.get("name") + map.get("rela")+map.get("value")+" ");
}
String sql = sb.toString();
Statement stmt = (Statement) conn.createStatement();
ResultSet rs = (ResultSet) stmt.executeQuery(sql);
while(rs.next()){
String name = rs.getString("user_name");
int age = rs.getInt("age");
String email = rs.getString("email");
Entity entity = new Entity();
entity.setAge(age);
entity.setUser_name(name);
entity.setEmail(email);
list.add(entity);
}
return list;
}
关于调用存储过程语句
分别是带有出参与入参的存储过程调用语句
public static int select_count () throws SQLException{
int ans = 0 ;
CallableStatement cs = (CallableStatement) conn.prepareCall("call sp_out(?)");
// 由于是出参,使用变量注册方法
cs.registerOutParameter(1, Types.SMALLINT);
cs.execute();
ans = cs.getInt(1);
return ans ;
}
public static List<Entity> select_filter (String pname) throws SQLException{
List<Entity> list = new ArrayList<Entity>();
CallableStatement cs = (CallableStatement) conn.prepareCall("call sp_filter(?)");
cs.setString(1, pname);
cs.execute();
ResultSet rs = (ResultSet) cs.getResultSet();
while(rs.next()){
System.out.println(rs.getString("name"));
}
return list;
}
事务管理
当我们在处理某些事物时比如对两张表的更新时出现了错误,导致事务的不同步性。由于jdbc技术是默认的自动提交,所以会出现表中记录的不同步。为了防止这种情况,我们可以通过取消自动提交的特性,然后在处理完所有事务以后再手动提交,如果发生异常,则数据回滚
public static Boolean Insert(Account to, Account from, int num) throws SQLException {
conn.setAutoCommit(false);
try {
String sql = "" + " insert into TransInfo (toname,fromname,value,toid,fromid) " + "values (?,?,?,?,?)";
PreparedStatement ptmt = conn.prepareStatement(sql);
ptmt.setString(1, to.getName());
ptmt.setString(2, from.getName());
ptmt.setInt(3, num);
ptmt.setInt(4, to.getId());
ptmt.setInt(5, from.getId());
to.setCount(to.getCount() + num);
from.setCount(from.getCount() - num);
AccountUpdate(to);
AccountUpdate(from);
ptmt.execute();
conn.commit();
return true;
} catch (Exception e) {
conn.rollback();
e.printStackTrace();
return false;
}
}