Java笔记——第十二章 (Ⅰ) 用JDBC技术访问数据库

第十二章 用JDBC技术访问数据库

Java语言中连接数据库采用的是JDBC(JavaDataBaseConnectivity)技术,JDBC提供了连接各种数据库的能力。


JDBC工作原理:

在这里插入图片描述

JDBC连接方式

1)JDBC-ODBC桥连接 (JDK8已经丢弃了这种效率比较低的连接方式,但在JDK版本低于8的版本中该方法仍然适用 )
:将对JDBC API的调用转换为对另一组数据库连接API的调用

优点:可以访问所有ODBC可以访问的数据库。
缺点:执行效率低、功能不够强大。
在这里插入图片描述

2)纯Java驱动(常用)
:由JDBC驱动直接访问数据库

优点:100%Java,快又可跨平台
缺点:访问不同的数据库需要下载专用的JDBC驱动。
在这里插入图片描述

总结纯Java驱动的JDBC数据库连接步骤

1)注册数据库驱动(加载驱动)
Class.forName(驱动类),同时必须把数据库厂商提供的驱动包导入到项目中。
若未导入驱动包,则产生ClassNotFoundException此处必须处理异常

2)获取数据库连接

 Connection conn = DriverManager.getConnection (url,dbname,dbpass) ;

3)获取PreparedStatement对象,执行sql语句

 PreparedStatementpstmt=conn.prepareStatement(sql语句); 

查询:ResultSetrs=pstmt.executeQuery() //返回查询结果集

增删改:intlineNumber=pstmt.executeUpdate(); //返回更新记录条数

4)关闭资源(一定要)
一个一个关闭,注意一定要从最后调用的依次向前进行关闭,否则会发生空指针异常。

try {
   if(rs != null) {
   rs.close();
   }
   if(pstmt != null) {
   pstmt.close();
   }
   if(conn != null) {
   conn.close();
   }
   //到着关,防止出现空指针异常
  } catch (SQLException e) {
   e.printStackTrace();
  } 

代码实现:

我的数据库名TextDB、表名Studnet
在这里插入图片描述
在这里插入图片描述
创建 p2.util包、 DBUtil工具类

package p2.util;
//工具类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtil {

 public Connection conn = null;      //建立数据库连接
 public PreparedStatement pstmt = null;    //预编译SQL语句
 public ResultSet rs = null; //结果集
 
 //获取连接
 public Connection getConn() {
//1、注册驱动类,加载jar包
  try {
   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //请填写驱动类
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
  //2、获取数据库连接
   try {
    conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=TextDB","sa","root");
   } catch (SQLException e) {
    e.printStackTrace();
   }
return conn;
 }
 
 //释放资源
 public void closeAll() {
  try {
   if(rs != null) {
   rs.close();
   }
   if(pstmt != null) {
   pstmt.close();
   }
   if(conn != null) {
   conn.close();
   }
   //到着关,防止出现空指针异常
  } catch (SQLException e) {
   e.printStackTrace();
  } 
 }
 }

增删改查 与 main方法


import p2.util.DBUtil;
import java.sql.SQLException;

public class JDBCTest extends DBUtil {
 public static void main(String[] args) {
  JDBCTest jj = new JDBCTest();
  jj.select();
 }
 
// 查询
 public void select() {
  getConn(); // 从父类继承的
  try {
   // 预编译SQL语句,处理结果
   String sql = "select * from Studnet";
   pstmt = conn.prepareStatement(sql);
   rs = pstmt.executeQuery();
   while (rs.next()) { // rs指向数组头,rs的下一个不为空
    String id = rs.getString("id"); // 根据列名
    String name = rs.getString("name");
    String sex = rs.getString(3); // 根据第几列也可,例第三列
    System.out.println(id + "\t" + name + "\t" + sex);
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   closeAll();
  }
 }

// 删除
 public void delete() {
  getConn();
  try {
   // 3、预编译SQL语句,处理结果
   String sql = "delete from Studnet where name=?";
   pstmt = conn.prepareStatement(sql);
   pstmt.setString(1, "刘一");
   int line = pstmt.executeUpdate();
   if (line > 0) {
    System.out.println("删除" + line + "条记录!");
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   closeAll();
  }
 }

// 插入
 public void add() {
  getConn();
  try {
   // 3、预编译SQL语句,处理结果
   String sql = "insert into Studnet values(?,?,?)"; // 我的表中有三个字段
   pstmt = conn.prepareStatement(sql);
   pstmt.setString(1, "192011");
   pstmt.setString(2, "天天");
   pstmt.setString(3, "男");
   int line = pstmt.executeUpdate(); // executeUpdate()···更新,返回值为int类型,返回的是更新的行数
   if (line > 0) {
    System.out.println("插入" + line + "条记录!");
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   closeAll();
  }
 }

// 修改
 public void alter() {
  getConn();
  try {
   // 3、预编译SQL语句,处理结果
   String sql = "update Studnet set name=? where id=?";
   pstmt = conn.prepareStatement(sql);
   pstmt.setString(1, "一一");
   pstmt.setString(2, "192005");
   int line = pstmt.executeUpdate();
   if (line > 0) {
    System.out.println("修改" + line + "条记录!");
   }
  } catch (SQLException e) {
   e.printStackTrace();
  } finally {
   closeAll();
  }
 }

}

运行结果截图:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值