JDBC及简单封装
2017-08-06 21:57
274 查看
JDBC:java 数据库连接,一般分为六个步骤:
1、加载数据库提供商提供的驱动
2、获取数据库连接对象
3、获取处理命令
4、执行sql语句
5、处理执行结果
6、回收资源
使用上述Java语句在真实使用时会用一定隐患:sql注入,而为防止sql注入我们使用预处理命令
而一般的sql语句分为更新和查询两种,同样的执行语句也分为两种如:
当sql语句为更新语句,即增、删、改时的执行语句如下:
当sql语句为查询语句时的操作如下:
为更好的使用jdbc,我们简单封装一下jdbc,如下:
public class DBConnection {
private static String DRIVER;
private static String URL;
private static String USER ;
private static String PASSWORD ;
//在静态块中加载驱动,防止反复加载
static{
try {
//获取属性对象
Properties props = System.getProperties();
//加载指定属性文件,根据属性名获取属性值
props.load(new FileInputStream("src/jdbc.properties"));
DRIVER = props.getProperty("driver");
URL = props.getProperty("url");
USER = props.getProperty("user");
PASSWORD = props.getProperty("password");
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取连接对象
public static Connection getConn(){
try {
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//资源回收
public static void close(ResultSet rs,PreparedStatement ps,Connection conn){
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
if(conn != null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
DBConnection.close(null, ps, conn);
}
}
其中对于抽象类CallBack<T>,使用jdk1.8版本的可以使用接口的方法:
public interface CallBack<T>{
default List<T> getDatas(ResultSet rs){
return null;
}
default T getData(ResultSet rs){
return null;
}
}
1、加载数据库提供商提供的驱动
2、获取数据库连接对象
3、获取处理命令
4、执行sql语句
5、处理执行结果
6、回收资源
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo { public static void main(String[] args) throws ClassNotFoundException, SQLException { // 1、加载数据库提供商提供的驱动 Class.forName("com.mysql.jdbc.Driver"); // 2、获取数据库连接对象 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","123456"); // 3、获取处理命令 Statement stmt = conn.createStatement(); // 4、执行sql语句 boolean b = stmt.execute("select * from mytable"); // 5、处理执行结果 System.out.println(b); // 6、回收资源 stmt.close(); conn.close();
使用上述Java语句在真实使用时会用一定隐患:sql注入,而为防止sql注入我们使用预处理命令
PreparedStatement ps = conn.prepareStatement("select * from mytable");
而一般的sql语句分为更新和查询两种,同样的执行语句也分为两种如:
当sql语句为更新语句,即增、删、改时的执行语句如下:
int i = ps.executeUpdate();
当sql语句为查询语句时的操作如下:
ResultSet rs = ps.executeQuery();
为更好的使用jdbc,我们简单封装一下jdbc,如下:
public class DBConnection {
private static String DRIVER;
private static String URL;
private static String USER ;
private static String PASSWORD ;
//在静态块中加载驱动,防止反复加载
static{
try {
//获取属性对象
Properties props = System.getProperties();
//加载指定属性文件,根据属性名获取属性值
props.load(new FileInputStream("src/jdbc.properties"));
DRIVER = props.getProperty("driver");
URL = props.getProperty("url");
USER = props.getProperty("user");
PASSWORD = props.getProperty("password");
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取连接对象
public static Connection getConn(){
try {
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//资源回收
public static void close(ResultSet rs,PreparedStatement ps,Connection conn){
try {
if(rs != null) rs.close();
if(ps != null) ps.close();
if(conn != null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
DBConnection.close(null, ps, conn);
}
}
} 我们看到对上述的代码块,并没有对于获取执行命令,执行sql语句和处理执行结果进行封装,这是因为我们对查询的sql语句不明确,于是我们有了如下处理:
public class DAOHelper { public static boolean execUpdate(Connection conn,String sql,Object ... objs){ PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < objs.length; i++) { ps.setObject(i+1, objs[i]); } int i = ps.executeUpdate(); return i > 0 ? true : false; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } public static <T> List<T> queryList(String sql,CallBack<T> call,Object ... objs){ Connection conn = DBConnection.getConn(); PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < objs.length; i++) { ps.setObject(i+1, objs[i]); } ResultSet rs = ps.executeQuery(); return call.getDatas(rs); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static <T> T queryOne(String sql,CallBack<T> call,Object ... objs){ Connection conn = DBConnection.getConn(); PreparedStatement ps = null; try { ps = conn.prepareStatement(sql); for (int i = 0; i < objs.length; i++) { ps.setObject(i+1, objs[i]); } ResultSet rs = ps.executeQuery(); return call.getData(rs); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static abstract class CallBack<T>{ public List<T> getDatas(ResultSet rs){ return null; } public T getData(ResultSet rs) { return null; } } }
其中对于抽象类CallBack<T>,使用jdk1.8版本的可以使用接口的方法:
public interface CallBack<T>{
default List<T> getDatas(ResultSet rs){
return null;
}
default T getData(ResultSet rs){
return null;
}
}
相关文章推荐
- j2ee规范-jdbc-简单封装
- 一个简单的jdbc连接封装
- 对JDBC操作数据库的简单封装
- hibernate对JDBC封装的简单分析
- 简单通用JDBC辅助类封装(实例)
- JDBC的一个简单封装类DBUtil
- JDBC(1) 简单的连接数据库和封装
- 一个简单的JDBC操作对象的封装
- 【一个简单封装的jdbc工具类】
- JDBC的简单封装
- JDBC连接MySQL-基于MVC架构进行简单封装
- JDBC的开发步骤以及连接的简单封装
- JDBC的简单封装,实现简单数据库操作工具类SQLHelper.
- 第十七天dbutils的使用------Commons DbUtils(Apache)第三方的:只是对JDBC编码进行了简单的封装
- java jdbc数据库连接简单封装
- 简单通用JDBC辅助类封装
- jdbc中对mysql数据库操作的简单封装--(仅做备忘记录)
- JDBC学习笔记(3)之jdbc简单封装
- 简单通用JDBC辅助类封装
- jdbc的简单封装(使用properties文件)