JDBC(Java Database Connectivity):Java数据库连接,它是与数据库进行连接的纽带(与数据库进行交互)。使用JDBC,可以在不同的数据库功能模块层次上提供统一的用户界面,可以建立与数据库的连接,发送SQL语句和处理结果。
JDBC是跨数据库平台的,我们可以在java编程时,统一接口,用于访问多种数据库;
但是它也是基于某一种数据库而言的,对于不同的数据库产品连接的这一端,数据库接口是不同的,所以不同JDBC需要不同的JDBC类库,因此要了解这个数据库的API。
JDBC的核心是为用户提供Java API类库,让用户能够创建是数据库连接、执行SQL语句、检索结果集、访问数据库元数据等。
连接数据库用到的类和接口:
java.sql.DriverManager:用于管理JDBC驱动程序
java.sql.Connection:用于建立与特定数据库的连接,一个连接就是一个会话
java.sql.PreparedStatement:用于创建一个SQL语句对象,该对象可以多次被使用,提高执行的效率
java.sql.ResultSet:用于返回SQL语句的结果集
创建数据库连接:是JDBC数据库应用的初步阶段,也是其他操作的基础。
JDBC编程步骤:
- 声明四个重要的参数(username、password、url、driver)
//用户名
private static String username="scott";
//密码
private static String password="tiger";
//连接的是本地的还是其他电脑的数据库
private static String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
//驱动类 连接的是什么类型的数据库
private static String driver="oracle.jdbc.driver.OracleDriver";
- 加载驱动Load the Driver:通过类加载器来加载驱动
//加载驱动类
Class.forName(driver);
三种数据库的固定写法:
Mysql:com.mysql.jdbx.Driver
Oracle:oracle.jdbc.driver.OracleDriver
Sqlserver:com.microsoft.sqlserver.jdbc.SQLServerDriver
- 连接数据库Connect to the DataBase
//获取链接 connection对象,通过DriverManager获取到数据库的连接
Connection con=DriverManager.getConnection(url, username, password);
- 执行SQL语句Execute the SQL
- PreparedStatement.executeQuery();用于查询
- PreparedStatement.executeUpdate();用于新增、修改、删除
//获取statement 只能查询一次 一般使用PreparedStatement
PreparedStatement ps=con.prepareStatement("Select * from test");
//执行sql语句 返回的是一个结果集
ResultSet rs= ps.executeQuery();
- Retrieve the result data返回结果集,通过循环遍历取得结果while(rs.next()),输出结果,通过get()方法取得结。
此外,需要封装一个po实体类,用来获取和设置值
public class User {
private String name;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
while (rs.next()) {//循环遍历
user=new User();
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex"));
}
//输出
System.out.println(user.getName());
- 关闭资源close
close the Resultset / close the PreparedStatement/close the Connection
//关闭
rs.close();
ps.close();
con.close();
注意:连接数据库还有最重要的一步是引入jar包,不同的数据库有不同的jar包。
封装JDBC:我们用的时候需要封装JDBC,主要是优化代码,减少重复代码块的书写。
封装之前要准备一个properties工具类,利用写好的这个属性值进行获取
相关代码块:
public class DbUtil {
private static String username=null;
private static String password=null;
private static String driver=null;
private static String url=null;
static{//必须是静态的,在加载类的时候加载
//创建Properties 读取JDBC的一些参数
Properties pro=new Properties();
//通过IO流读取 //通过类加载器获取到
InputStream in=DbUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
try {
pro.load(in); //加载
//获取各个参数
username=pro.getProperty("username");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
url=pro.getProperty("url");
//加载驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();}
}
//封装连接
public static Connection getConnection(){
Connection con=null;
try {
con=DriverManager.getConnection(url, username, password);
}
catch (SQLException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
return con;
}
//封装close(关闭资源)
public static void close(Connection con,PreparedStatement ps,ResultSet rs){
try {
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注意:封装完之后,我们可以测试一下是否连接成功,在主方法中输出一下;如果出现异常报错,检查是否是驱动配置错误,为了避免出现这个错误,我们可以提前测试一下驱动是否连接成功
1、点击以下标记的选项
2、右键新建一个
3、弹出Database Driver框
4、点击测试,输入密码后,弹出框连接成功,可把url,driver名称复制到代码块,以免出错
完全成功连接好数据库之后,就可以进行SQL操作,我们直接通过类来调用封装好的方法就可以了(因为方法是用static修饰的),以下是一个查询操作。
@Override
public List<User> selectAll() {
List<User> users=new ArrayList<User>();//创建list集合 返回的是一个集合
try {
//直接获取getConnection
con=DBUtil.getConnection();//静态方法可以直接通过DBUtil类调用 获取Connection
ps=con.prepareStatement("Select * from test");//通过连接直接获取到
//执行 返回的是一个结果集
ResultSet rs= ps.executeQuery();
//返回的对象类型
User user=null;
//while循环遍历
while(rs.next()){//判断是否有下一个
//创建对象
user=new User();
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex"));
//添加到集合中
users.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//关闭资源
DBUtil.close(con, ps, rs);
}
return users;//返回的类型
}