学一个东西前,要知道它是什么,它有什么用,那么先来简单阐述下:
1、JDBC的简介
1) SUM公司针对java对数据库进行操作,开发出的一套标准接口,各个数据库只需要实现这个接口就可以了 ,
这套标准的接口就是jdbc,而我们就要学习这套标准接口在java中是如何使用的。
2)安装数据库驱动,导入Jar包
不同的数据库厂商编写了各自实现jdbc接口的jar包,我们只需要导入jar包到项目里面,相当于安装了数据库的驱动
首先创建一个文件夹 lib,把jar包复制到lib里面,选中jar包右键点击build path -- add to build path,jar包前面的图标
变成了“奶瓶”图标,表示导入jar成功
2、JDBC中的常用接口和类
1.)DriverManager对象 (在java.sql包里面) :它是用来加载数据库驱动的
方法: 加载驱动
registerDriver(Driver driver) :参数是数据库的驱动,这个驱动是由数据库提供的
(1)这个方法在实际开发中,一般不使用,因为这个方法会加载驱动两次
(2)一般在开发中使用反射的方式加载数据库的驱动
Class.forName("com.mysql.jdbc.Driver");
得到数据库的连接
getConnection(String url, String user, String password),返回Connection
参数:1.表示要连接的数据库
jdbc:mysql://数据库的ip:数据库的端口号/连接的数据库的名称
( jdbc:mysql://localhost:3306/csdnData)
2.表示连接数据库的用户名
3.表示连接数据库的用户密码
2.)Connection对象(在java.sql包里面) :它代表数据库的连接,是接口
方法:创建statement对象
createStatement() 返回 Statement 对象
创建预编译对象 PreparedStatement
prepareStatement(String sql) 返回 PreparedStatement 对象
3.)Statement对象(在java.sql包里面):它是用来执行SQL的,是接口
方法:执行查询操作方法
executeQuery(String sql) 返回查询的结果集对象 ResultSet
执行增加 修改 删除的方法
executeUpdate(String sql) ,返回成功的记录数 int
执行sql语句的方法
execute(String sql) ,返回是布尔类型 boolean
执行批处理的方法
addBatch(String sql):把多个sql语句放到批处理里面
int[] executeBatch():执行批处理里面的所有的sql
4.)ResultSet对象(在java.sql包里面):代表查询之后返回的结果,是接口
方法:遍历结果集
在最开始的时候在第一行之前,当执行了next方法之后,一行一行的向下进行遍历,
在默认的情况下,只能向下,不能向上,在遍历出来的结果也是不能修改的
next()
得到数据的具体值
string类型,使用getString("字段的名称")
int类型,使用getInt("字段的名称")
不知道类型,使用getObject("字段的名称")
3.jdbc的释放资源
jdbc的操作会占用数据库资源,对此官方有一套标准的释放资源的代码写法
关闭的原则:谁最先打开,谁最后关闭
//封装释放资源的代码
public static void clearConn(Connection conn,Statement stmt,ResultSet rs) {
if(rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null) {
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null) {
try {
conn.close();
}
catch (Exception e) {
e.printStackTrace();
}
conn = null;
}
}
4.jdbc工具类的封装
1.)我使用ResourceBundle类 读取的配置文件 db.properties 里存储的数据库信息
private static String driverName;//驱动名称
private static String url;//数据库连接地址
private static String userName;//用户名
private static String userPassword;//密码
private static final ResourceBundle RB= ResourceBundle.getBundle("db");
/***
* 静态代码块加载配置信息
*/
static {
driverName=RB.getString("drivername");
url=RB.getString("url");
userName = RB.getString("username");
userPassword = RB.getString("password");
}
2.)写了一个获取数据库连接的方法
/**
* 获得数据库连接
*/
protected static Connection getConnection() {
Connection conn = null;
try{
Class.forName(driverName);//加载驱动
conn = DriverManager.getConnection(url, userName, userPassword);
}
catch(Exception e){
e.printStackTrace();
}
return conn;
}
3).关闭数据库连接的方法
./***
* 关闭数据库连接
*/
protected static void clearConn(Connection conn,Statement stmt,ResultSet rs) {
if(rs != null) {
try {
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
rs = null;
}
if(stmt != null) {
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null) {
try {
conn.close();
}
catch (Exception e) {
e.printStackTrace();
}
conn = null;
}
}
4).更新数据的方法
public static int update(String strSql,List<Object> para){ //如果要执行不带参数的SQL更新,第二个参数可以传入null
int rowCount = -1; //执行更新后被影响的行数
Connection conn= null;//连接对象
PreparedStatement stmt = null;//预编译对象
try{
conn= MyUtilsJDBC.getConnection(); //获得连接
stmt= conn.prepareStatement(strSql);//预编译SQL语句
if(para!=null){ //参数不为null时,循环参数集合,并设置值
for (int i = 0; i < para.size(); i++) {
stmt.setObject(i+1,para.get(i));
}
}
rowCount = stmt.executeUpdate();//执行操作,并返回受影响行数
}
catch(Exception e){
e.printStackTrace();
}
finally{
MyUtilsJDBC.clearConn(conn, stmt, null);//释放资源
}
return rowCount;//返回受影响行数
}
5).查询数据并返回一个集合的方法
public static List<Map<String, Object>> query(String Strsql,List<Object> para) {//如果查询不带参数,该方法第二个参数可传入NULL
List<Map<String, Object>> list = null; //返回的集合对象
Connection conn= null; //连接对象
PreparedStatement stmt= null; //预编译对象
ResultSet rs= null; //结果集对象
try {
conn= MyUtilsJDBC.getConnection();//获得连接
stmt= conn.prepareStatement(strSql); //预编译SQL
if (para != null) { //获得参数集合 并设置值
for (int i = 0; i < para.size(); i++) {
stmt.setObject(i + 1, para.get(i));
}
}
rs= stmt.executeQuery(); //执行查询操作,并返回结果集
if (rs!= null) {
list = new ArrayList<Map<String, Object>>();
ResultSetMetaData rsmd= rs.getMetaData();// 获得结果集相关属性描述对象
int rowColumn = rsmd.getColumnCount(); // 获得数据列的数量
while (rs.next()) { // 循环遍历每一行数据,将行数据存进HashMap
Map<String, Object> dataRow = new HashMap<String, Object>(); // 创建一个HashMap,以“键值对”的方式存储字段名和值
for (int i = 1; i <= rowColumn; i++) { // 循环获得每列数据的列名和值并放进HashMap
dataRow.put(rsmd.getColumnName(i),rs.getObject(i));
}
list.add(dataRow); // 向数据集合里添加一行数据
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
MyUtilsJDBC.clearConn(conn, stmt, rs);//释放资源
}
return list;
}