JDBC
概念
JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。通过JDBC,Java代码能够访问数据库读写数据。
使用步骤
1.导入专用的jar包(不同的数据库需要的jar包不同)
2.获取和数据库的连接(用户名、密码)
3.创建Statement或者PreparedStatement接口,执行SQL语句
4.处理和显示结果
idea导入jar包
jar包的下载官网地址:https://dev.mysql.com/downloads/connector/j/,我们选择Platform Independent,如下图:
点击下载,下载好之后,再对其进行解压,解压后会发现里面有一个jar包:
首先创建一个项目 我们先命名为stage:
在没有导入jar包的情况下External Libraries应该只有jdk,所以我们此时通过以下步骤导入jar包:
点击Project Structure
点击‘+’号,在电脑中选择jar包的路径,进行导入。
获取与数据库的连接
已知信息:
数据库服务端的IP地址:
127.0.0.1 (这是本机,如果连接其他电脑上的数据库,需填写相应的IP地址)
数据库的端口号: 3306 (mysql专用端口号)
数据库名称 data(根据你自己数据库中的名称填写)
编码方式 UTF-8
账号 root
密码 root(填写自己设置的密码)
数据库连接专用方法
import java.sql.*;
public class start {
/**
* 取得数据库的连接
* @return 一个数据库的连接
*/
public static Connection getConnection(){
Connection con = null;
try {
//初始化驱动类com.mysql.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/exam?characterEncoding=UTF-8","root", "root");
//该类就在 mysql-connector-java-5.0.8-bin.jar中,如果忘记了第一个步骤的导包,就会抛出ClassNotFoundException
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
return con;
}
}
执行SQL语句
使用Statement接口
Statement接口创建之后,可以执行SQL语句,完成对数据库的增删改查。其中 ,增删改只需要改变SQL语句的内容就能完成,然而查询略显复杂。在Statement中使用字符串拼接的方式,该方式存在句法复杂,容易犯错等缺点。
主要格式如下:
int executeUpdate(String sql) //executeQuery 用于发送 select 语句
用于发送 DML 语句,增删改的操作,insert、update delete
参数:SQL 语句
返回值:返回对数据库影响的行数
举一个实例:
void executeUpdate(String sql){
Statement s = conn.createStatement();
// 准备sql语句
// 注意: 字符串要用单引号'
String sql = "insert into t_courses values(null,"+"'数学')";
//在statement中使用字符串拼接的方式,这种方式存在诸多问题
s.execute(sql);
System.out.println("执行插入语句成功");
}
使用PreparedStatement接口
与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。这种方式除了避免了statement拼接字符串的繁琐之外,还能够提高性能。
举一个给数据库添加课程的小例子:
(关闭资源的两个方法 DbUtil.close(pstmt); DbUtil.close(conn)下文会介绍)
public void addCourse(String courseName){
String sql = "insert into t_course(course_name) values(?)";
//该语句为每个 IN 参数保留一个问号(“?”)作为占位符
Connection conn = null; //和数据库取得连接
PreparedStatement pstmt = null; //创建statement
try{
conn = DbUtil.getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, courseName); //给占位符赋值
pstmt.executeUpdate(); //执行
}catch(SQLException e){
e.printStackTrace();
}
finally{
DbUtil.close(pstmt);
DbUtil.close(conn);
}
}
处理和显示结果
基本语法:
ResultSet rs = s.executeQuery(sql);
利用While(ResultSet.next()){…}循环可以将集合ResultSet中的结果遍历出来。ResultSet.getXX(); 这里的get方法的括号里面填属性值。
释放资源
在JDBC编码的过程中我们创建了Connection、ResultSet等资源,这些资源在使用完毕之后是一定要进行关闭的。释放原则:先开的后关,后开的先关:ResultSet、Statement、Connection。
基本语法:
rs.close();
stmt.close();
con.close();
这三个关闭操作的方法也写到一个类中便于调用:
import java.sql.*;
public class close{
public static void close(PreparedStatement pstmt){
if(pstmt != null){ //避免出现空指针异常
try{
pstmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
public static void close(Connection conn){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
public static void close(ResultSet rs){
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
execute和executeUpdate的区别
相同点:二者都能够执行增加、删除、修改等操作。
不同点:
1、execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
2、execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。