JdbcTemplate使用总结

时间:2023-03-09 17:14:26
JdbcTemplate使用总结

Spring JdbcTemplate

在数据库的操作中,每个业务方法都要得到连接,开启事务,提交事务,回滚,关闭连接等,我们可以把这些做成一个模版,这样,在业务代码中只需要关注业务逻辑即可。

MyJdbcTemplte.java:

 package cn.itcast.gz.template;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; import javax.sql.DataSource; public class MyJdbcTemplte { DataSource dataSource = null;
Connection conn = null;
PreparedStatement ps = null; interface updateOperation{
void execute(Connection conn,PreparedStatement ps)throws Exception;
} //由于这里用了dbcp数据源,所以不用关闭连接
public void executeUpdate(updateOperation operation)
{
try {
dataSource = DbcpUtil.getDataSource();
conn=dataSource.getConnection();
conn.setAutoCommit(false);
//关键是这一步,dao的每个方法在这里得到调用
//http://www.cnblogs.com/roucheng/
operation.execute(conn, ps);
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}

PersonDaoImplTemplte.java:

 package cn.itcast.gz.template;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement; import cn.itcast.gz.template.MyJdbcTemplte.updateOperation; public class PersonDaoImplTemplte implements IPersonDao { private final MyJdbcTemplte jdbcTemplte = new MyJdbcTemplte(); @Override
public void save (final Person person) throws Exception{ jdbcTemplte.executeUpdate(new updateOperation() {
@Override
public void execute(Connection conn , PreparedStatement ps) throws Exception {
String sql = "insert into person(name,age) values(?,?)";
ps =conn.prepareStatement(sql);
ps.setString(1, person.getName());
ps.setInt(2, person.getAge());
ps.executeUpdate();
}
});
} @Override
public void delete(final Integer id) throws Exception{ jdbcTemplte.executeUpdate(new updateOperation() { @Override
public void execute(Connection conn , PreparedStatement ps) throws Exception { String sql = "delete from person where id=?";
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
ps.executeUpdate();
}
});
} @Override
public void updatePerson(final Person p,final Integer id) throws Exception{
jdbcTemplte.executeUpdate(new updateOperation() { @Override
public void execute(Connection conn , PreparedStatement ps) throws Exception { String sql = "update person set name=?,age=? where id=?";
ps = conn.prepareStatement(sql);
ps.setString(1, p.getName());
ps.setInt(2, p.getAge());
ps.setInt(3, id);
ps.executeUpdate();
}
});
}
}

DbcpUtil.java:

 package cn.itcast.gz.template;

 import java.io.IOException;
import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class DbcpUtil { private static DataSource dataSource = null; static
{
try {
Properties properties = new Properties();
properties.load(DbcpUtil.class.getClassLoader().getResourceAsStream("db.properties"));
dataSource = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
} public static DataSource getDataSource()
{
return dataSource;
}
}

就这个分享。。。有几个意见说下 
1. MyJdbcTemplte中的数据源不能变,建议添加一个带数据源的构造方法这样实例化的时候可以有不同的数据源以应对需要连接过个数据库的项目。
2. MyJdbcTemplte 这个只能执行更新的语句么,查询之类的不行,查询的话还要考虑赋值之类的问题,想想泛型

另外。。spring里有spring jdbctemplate,它提供的肯定是非常棒的,又是开源。。。只是个人觉得他的jdbctemplate中方法这么多有点晕。。。还好我顶住了自己整理了一些我要用的。。。。推荐楼主去看看它的源码吧。。