JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范,JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC只规范定义接口,具体的实现由各大数据库厂商来实现。 JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个 数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即 可,数据库驱动由数据库厂商提供。
(1) 程序员如果要开发访问数据库的程序,只需要会调用 JDBC 接口中的方法即可,不用关注类是如何实现的。
(2) 使用同一套 Java 代码,进行少量的修改就可以访问其他 JDBC 支持的数据库
接口或类 | 作用 |
---|---|
DriverManager 类 | (1) 管理和注册数据库驱动( 2) 得到数据库连接对象 |
Connection 接口 | 连接对象,可用于创建 Statement 和 PreparedStatement 对象 |
Statement 接口 | SQL 语句对象,用于将 SQL 语句发送给数据库服务器。 |
PreparedStatemen 接口 | SQL 语句对象,是 Statement 的子接口 |
ResultSet 接口 | 用于封装数据库查询的结果集,返回给客户端 Java 程序 |
mysql数据库的驱动包,我这里提供两个版本的,mysql数据库版本8.0以上的用第二个,
mysql数据库版本5.x以上的用第一个。下载请点击https://blog.csdn.net/weixin_43951932/article/details/88911164
(1) 注册和加载驱动(可以省略)
(2) 获取连接
(3) Connection 获取 Statement 对象
(4) 使用 Statement 对象执行 SQL 语句
(5) 返回结果集
(6) 释放资源
(1)导入mysql驱动包,创建java项目,右键src创建lib文件夹,如图所示。
(2)将准备好的Mysql驱动包复制到lib下,展开lib,选中mysql -connector-java-8.0.12,右键build path,选择Add to Build Path.出现如图所示的小奶瓶即可。
(3)建立testss数据库,准备数据库表user,在mysql下面建表。添加数据。
create table user(
username varchar(45),
password varchar(45)
)
insert into user values(‘juhao’,‘123456’)
insert into user values(‘huhahei’,‘8888’)
insert into user values(‘wyywywy’,‘99999’)
public class Test {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testss";
String user = "root";//mysql数据库的用户
String pword = "root";//mysql数据库的密码
Connection con = null;
Statement st = null;
try {
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.创建连接
con = DriverManager.getConnection(url,user,pword);
//3.创建statement对象
st = con.createStatement();
String sql = "select * from user";
//4.使用 Statement 对象执行 SQL 语句
ResultSet resultSet = st.executeQuery(sql);
//5.获得结果集对结果集进行处理
while(resultSet.next()) {
String username = resultSet.getString("username");
String password = resultSet.getString("password");
System.out.println(username+" "+password);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//6.关闭连接,释放资源
try {
if(st !=null) {
st.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(con !=null) {
con.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
通过反射,加载数据库的驱动包。
注意:对于mysql的8.0版本应该写Class.forName(“com.mysql.cj.jdbc.Driver”);
其中三个参数分别表示,url 需要连接数据库的位置(网址),user用户名 ,password 密码url比较复杂,下面是mysql5.5以下的url:
url = “jdbc:mysql://localhost:3306/testss”
JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔。
(1) 第一部分是jdbc,这是固定的;
(2)第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了;
(3)第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及DATABASE名称(testss)组成。
(4)注意:对于mysql的8.0版本应该写"jdbc:mysql://localhost:3306/要连接的数据库名称?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8",
这是由于mysql5.5+要求加时区等参数。其中的characterEncoding用于设置编码格式,防止乱码。
String sql = "select * from user ";
获取Statement语句执行平台:Statement st = con.createStatement();
其中的常用方法:
方法名称 | 作用 |
---|---|
int executeUpdate(String sql); | 执行insert update delete语句 |
ResultSet executeQuery(String sql); | 执行select语句 |
boolean execute(String sql) | 执行select返回true 执行其他的语句返回false. |
ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同个,列从1开始)来获取指定列的数据:
rs.next();//指向第一行
rs.getInt(1);//获取第一行第一列的数据
常用方法:
方法名称 | 作用 |
---|---|
Object getObject(int index) | 获得任意对象 |
String getString(int index) / Object getObject(String name) | 获得字符串 |
int getInt(int index) / Object getObject(String name) | 获得整形 |
double getDouble(int index) | 获得双精度浮点型 |
与IO流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class loginTest {
public static String login(String username,String password){
String url = "jdbc:mysql://localhost:3306/testss";
String user = "root";//mysql数据库的用户
String pword = "root";//mysql数据库的密码
String result = "登录失败";
Connection conn = null;
Statement stat = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,user,passwordjdbc);
stat = conn.createStatement();
String sql = "select * from user where username='"+username+"' and password='"+password+"'";
System.out.println(sql);
rs = stat.executeQuery(sql);
//如何能知道这个人登录成功还是失败呢?
if (rs.next()){
result = "登录成功";
}
} catch (Exception e) {
e.printStackTrace();
} finally{
//无论出现什么情况 都必须保证关闭是执行的
try {
if (rs != null){
rs.close();
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
if (stat != null){
stat.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (conn != null){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
public static void main(String[] args) {
String s = login("juhao","123456");
System.out.println(s);
String ss = login("juhao","XXX' or 'a'='a");
System.out.println(ss);
}
}
结果为:
由结果可以看出,输入正确的用户名和密码,用户正常登录成功,但是输入"XXX’ or ‘a’='a"这种形式的东西,用户也正常登录了,这就是jdbc中的sql注入问题。由此产生的问题在下一篇博文将会详细。请注意查看。