Java语言中连接数据库采用的是JDBC(JavaDataBaseConnectivity)技术,JDBC提供了连接各种数据库的能力。
1)JDBC-ODBC桥连接 (JDK8已经丢弃了这种效率比较低的连接方式,但在JDK版本低于8的版本中该方法仍然适用 )
:将对JDBC API的调用转换为对另一组数据库连接API的调用
优点:可以访问所有ODBC可以访问的数据库。
缺点:执行效率低、功能不够强大。
2)纯Java驱动(常用)
:由JDBC驱动直接访问数据库
优点:100%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();
}
}
}