JDBC(Java Database Connectivity):java连接数据库的工具
1.1 什么是JDBC?
JDBC是java提供的一组API,用来提供连接数据库中需要用到的类和接口,也是一组规范,为不同数据库封装相同接口的一组规范,让程序更方便的连接数据库,JDBC负责提供接口,数据库厂商使用自己数据库的特点来实现接口。
1.2 目的
为了给程序员提供同一种方式连接不同的数据库
1.3 JDBC的连接步骤
1)加载驱动类
2)获取连接
3)执行sql
4)获取结果集
5)关闭连接
1.4 连接过程中需要用到的类和接口
1)Driver类 -- 驱动类
2)DriverManager类 -- 内部封装了获取连接的方法
3)Connection接口 -- 连接对象
4)Statement接口 -- 编译sql的接口
5)ResultSet接口 -- 结果集接口
1.5 需要导入第三方接口的jar包
mysql:mysql-connector-java-5.1.6-bin.jar
oracle:oracle14.jar,oracle6.jar
1.6 开发步骤
1)导入驱动包
在工程上右键创建文件夹lib--将驱动包导入到lib下,右键驱动包选择buildpath--Add to BuildPath
2)加载驱动类
Class.forName("com.mysql.jdbc.Driver");
3)获取连接
Connection conn = DriverManager.getConnection(url,user,password);
url:jdbc:mysql://localhost:3306/dbname
user:mysql服务器安装时的用户名
password:mysql服务器时的密码
4)执行sql
Statement st=conn.createStatement();
String sql="";
st.executeQuery(sql);执行DQL
st.executeUpdate(sql);执行DML,返回值为该条sql对整张表影响的记录数
st.execute(sql);执行DDL,返回值:sql为DQL,返回true,sql为DML或DDL,返回false
5)获取结果集
ResultSet -- java.sql.ResultSet
ResultSet rs = st.execute(sql);
int rows = st.executeUpdate(sql);
boolean b = st.execute(sql);
boolean next():用来判断结果集中是否有下一条记录,如果有,则返回true,将游标进行下移,果没有,则返回false
PS:默认ResultSet的游标位于结果集中的表头行上
int getInt(String str):返回结果集中某一条记录上的str字段的值
XXX getXXX(int index):返回结果集中某一条记录上的index位置的值
6)关闭连接
1.7 mysql数据库中文的问题
1)保证我们的数据库是支持中文的
create database jsd1707 default character set utf8
2)在获取连接时url的位置加入代码:?useUnicode=true&characterEncoding=utf8
url:jdbc:mysql://localhost:3306/jsd1707?useUnicode=true&characterEncoding=utf8
示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import org.junit.Test;
public class JDBCDemo {
@Test
public void testCreateDept() {
Connection conn=null;
PreparedStatement ps=null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql_zyd?useUnicode=true&characterEncoding=UTF-8","****","****");
String sql="CREATE TABLE Dept(deptno INT PRIMARY KEY AUTO_INCREMENT,dname VARCHAR(20))";
ps=conn.prepareStatement(sql);
ps.execute();
}catch(Exception e) {
e.printStackTrace();
}finally{
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
@Test
public void testDropDept() {
Connection conn=null;
PreparedStatement ps=null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql_zyd?useUnicode=true&characterEncoding=UTF-8","****","****");
String sql="DROP TABLE Dept";
ps=conn.prepareStatement(sql);
ps.execute();
}catch(Exception e) {
e.printStackTrace();
}finally{
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
运行结果:
注:@Test是用来做单元测试的,即可以通过方法名运行代码,该方法需要导org.junit.Test包