一:JDBC基础
JDBC全称为 Java Database Connectivity。即为java数据库连接,它是一种可执行SQL语句的API。程序可通过JDBC连接到关系型数据库,并且使用结构化查询语言(SQL数据库标准的查询语言)来完成对数据库的查询和更新。
与其他数据库编程环境相比,JDBC为数据库提供了标准的API。所以使用JDBC的数据库可以跨平台开发,如果全部使用标准的SQL语句,也可以说夸数据库开发。也就是说,如果使用一个JDBC开发一个数据库应用,那么该应用既可以在windows下运行,也可以在linux下运行,既可以使用Mysql数据库,也可以使用oracle数据库,而程序无须进行修改
1 JDBC简介
通过使用JDBC,就可以使用同一种API访问不同的数据库,换而言之,有了JDBC的API之后,你就不用为Sbase数据库学习一组API,又为Oracle数据库学习另一组API,开发人员使用标准的API编写程序,然后根据不同的数据库,加入不同的数据库驱动即可工作。当程序员使用JDBC编程时只要面向标准的JDBC的API编程即可,当进行数据库切换时候只需要更换不同的实现类即可,这就是面向接口编程的典型!
- 与数据库建立连接
- 执行SQL语句
- 获得SQL语句的执行结果
通过这三个步骤就可以通过JDBC操作数据库。
2 JDBC驱动程序类型
数据库驱动程序是JDBC和数据库之间的转换程序,数据库驱动负责将JDBC的调用映射成数据库的调用,
大部分是数据库都应用JDBC驱动程序例如Oracle和Sybase等,当连接特定的数据库时候,必须使用相应的数据库程序,但是对于一些数据的数据库,例如Access,可能使用JDBC-ODBC桥进行访问,关于ODBC就是JDBC的前辈了,这里不加以阐述!
二 JDBC编程步骤
- 加载数据库驱动
Class.forName(driverClass) //mysql加载驱动 Class.forName("com.mysql.jdbc.Driver") //Oracle加载驱动 Class,forName("oracle.jdbc.driver.OracelDriver")
- 获取数据库连接
DriverManger.getConnection(String url,String user,String pass)
- 通过connection 创建Statement对象,Connetion创建Statement的方法有如下三个
crateStatement()//创建其对象
prepareStatement(String sql) //根据sql语句创建预编译的statement对象
prepareCall(String sql) 根据sql语句创建callstatement
4.使用statement对象来执行sql语句,也有三种方式
1
excute //执行任何语句,但是比较麻烦
excuteUpdate()//主要执行DML和DDL语句,执行DML语句返回受影响的行数,执行DDL语句返回0
excuteQuery()//只用于查询语句,执行后放回查询的结果集ResultSet对象
5.操作结果集,对于执行sql语句的查询语句,将要返回一个ResultSet对象,该对象保存Sql语句的查询结果,程序可以通过操作ResultSet来取得查询结果
三 以连接Mysql为例子
private static final String PROP_FIlE= "database.ini";
//数据库8.0以下url后面加?serverTimezone=GMT%2B8 ,
private static String mysqlURl = "";
private static String mysqlUserName = "";
private static String mysqlUserPassword = "";
private static String mysqlDriver = "";
这里我们利用配置文件PROP_FILE来获取加载驱动参数,在项目中通常这么多
#数据库连接常用参数
mysqlURl = jdbc:mysql://localhost:3306/lvp_base?serverTimezone=GMT%2B8
mysqlUserName = root
mysqlUserPassword = 111111
mysqlDriver = com.mysql.cj.jdbc.Driver
对于Mysql的URL写法 jdbc:mysql://localname:port/databasename
如果不知道你的数据库端口号,可以查看如下
然后加载配置,获取这些配置参数
Properties properties = new Properties();
try {
properties.load(new FileInputStream(PROP_FIlE));
} catch (IOException e) {
e.printStackTrace();
}
mysqlDriver = properties.getProperty("mysqlDriver");
mysqlURl = properties.getProperty("mysqlURl");
mysqlUserName = properties.getProperty("mysqlUserName");
mysqlUserPassword = properties.getProperty("mysqlUserPassword");
然后我们加载驱动连接数据库
// 注册驱动
try {
Class.forName(mysqlDriver);
} catch (ClassNotFoundException e) {
System.out.println("未能成功加载驱动程序,请检查是否成功导入驱动程序");
e.printStackTrace();
}
//登录数据库
try {
System.out.println("读取配置信息:"+mysqlURl + "_" + mysqlUserName + "_" +mysqlUserPassword + "\t\n");
connection = DriverManager.getConnection(mysqlURl, mysqlUserName,mysqlUserPassword);
System.out.println("连接数据库成功");
return true;
} catch (SQLException throwable) {
System.out.println("连接数据库失败");
throwable.printStackTrace();
}
return false;
运行之后,我们可以看到运行成功
当然这样就连接成功了,我觉得不够直观,不过美观,我就用GUI界面操作连接更加直观化,这里我用Swing是java界面化开发语言,比AWT更出色,关于这部分我就不细说了。
//SWing 登录界面的GUI组件
private JFrame jFrame = new JFrame();
private JTextField userTextField = new JTextField(20);
private JTextField passTextField = new JTextField(20);
private JButton loginButton = new JButton("登录");
上面是界面的初始化,点击登录后输入账户和密码即可登录成功,这里用到的按钮的一个事件监听器,感觉就跟Qt的点击信号差不多意思,我就不瞎扯 了,哈哈哈,感觉就是!
//为登录按钮添加事件添加器
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(userTextField.getText() + passTextField.getText() +"," +mysqlUserName +mysqlUserPassword);
if(userTextField.getText().equals(mysqlUserName) && passTextField.getText().equals(mysqlUserPassword))
{
System.out.println("enter");
if(connectionFun())
{
JOptionPane.showMessageDialog(jFrame,"登录成功");
}else
{
JOptionPane.showMessageDialog(jFrame,"登录失败");
}
}
}
});
运行结果展示如下
源码如下
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
import java.sql.Statement;
import java.sql.PreparedStatement;
import javax.swing.*;
/*
* 连接数据库的步骤如下
* 1 加载数据库驱动
*
*
*
* */
public class connect_test {
private static final String PROP_FIlE= "database.ini";
//数据库8.0以下url后面加?serverTimezone=GMT%2B8 ,
private static String mysqlURl = "";
private static String mysqlUserName = "";
private static String mysqlUserPassword = "";
private static String mysqlDriver = "";
//执行JDBC操作的对象
private Connection connection = null;
private Statement statement = null;
//SWing 登录界面的GUI组件
private JFrame jFrame = new JFrame();
private JTextField userTextField = new JTextField(20);
private JTextField passTextField = new JTextField(20);
private JButton loginButton = new JButton("登录");
public void initParam()
{
Properties properties = new Properties();
try {
properties.load(new FileInputStream(PROP_FIlE));
} catch (IOException e) {
e.printStackTrace();
}
mysqlDriver = properties.getProperty("mysqlDriver");
mysqlURl = properties.getProperty("mysqlURl");
mysqlUserName = properties.getProperty("mysqlUserName");
mysqlUserPassword = properties.getProperty("mysqlUserPassword");
//为登录按钮添加事件添加器
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(userTextField.getText() + passTextField.getText() +"," +mysqlUserName +mysqlUserPassword);
if(userTextField.getText().equals(mysqlUserName) && passTextField.getText().equals(mysqlUserPassword))
{
System.out.println("enter");
if(connectionFun())
{
JOptionPane.showMessageDialog(jFrame,"登录成功");
}else
{
JOptionPane.showMessageDialog(jFrame,"登录失败");
}
}
}
});
jFrame.add(userTextField, BorderLayout.NORTH);
jFrame.add(passTextField);
jFrame.add(loginButton,BorderLayout.SOUTH);
jFrame.pack();
jFrame.setVisible(true);
}
public boolean connectionFun()
{
// 注册驱动
try {
Class.forName(mysqlDriver);
} catch (ClassNotFoundException e) {
System.out.println("未能成功加载驱动程序,请检查是否成功导入驱动程序");
e.printStackTrace();
}
//登录数据库
try {
System.out.println("读取配置信息:"+mysqlURl + "_" + mysqlUserName + "_" +mysqlUserPassword + "\t\n");
connection = DriverManager.getConnection(mysqlURl, mysqlUserName,mysqlUserPassword);
System.out.println("连接数据库成功");
return true;
} catch (SQLException throwable) {
System.out.println("连接数据库失败");
throwable.printStackTrace();
}
return false;
}
public void CloseFun()
{
if(connection != null)
{
try {
connection.close();
} catch (SQLException throwable) {
System.out.println("数据库关闭出现异常");
throwable.printStackTrace();
}
}
}
}
欢迎交流