客户端操作数据库的方式主要是三种:使用第三方客户端访问MySQL(比如:Navicat、MySQLWorkbench等)、使用MySQL自带的命令方式、通过Java来访问MySQL数据库。
在Java中,数据库存取技术可分为如下几类:
JDBC是(Java Database Connectivity)Java访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供
。
使用JDBC的好处:
JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接、执行SQL语句,并到得到返回结果等各类操作。声明在java.sql与javax.sql包中
。
会使用到的包 | 描述 |
---|---|
java.sql | 所有与JDBC访问数据库相关的接口和类 |
javax.sql | 数据库扩展包,提供数据库额外的功能。如:连接池 |
数据库的驱动 | 由各大数据库厂商提供 |
接口或类 | 描述 |
---|---|
DriverManager类 | 1) 管理和注册数据库驱动;2) 得到数据库连接对象 |
DriverManager类 | 一个连接对象,可用于创建 Statement 和 PreparedStatement 对象 |
Statement接口 | 一个 SQL 语句对象,用于将 SQL 语句发送给数据库服务器 |
PreparedStatement接口 | 一个 SQL 语句对象,是 Statement 的子接口 |
ResultSet接口 | 用于封装数据库查询的结果集,返回给客户端 Java 程序 |
选择项目—右键—New—Directory
拷贝jar包到lib目录下
将jar添加到Library,选中jar包—右键—Add as Library
加载并注册驱动:
加载驱动,把驱动类加载到内存
注册驱动,把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。
加载和注册驱动的方法 | 描述 |
---|---|
Class.forName(数据库驱动实现类) | 加载和注册数据库驱动,数据库驱动由 mysql 厂商 “com.mysql.jdbc.Driver” |
调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
//通过反射,加载与注册驱动类,解耦合(不直接依赖)
Class.forName("com.mysql.jdbc.Driver");
==疑问:为什么这样可以注册驱动? ==
因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例,所以可以换一种方式来加载驱动。(即只要想办法让驱动类的这段静态代码块执行即可注册驱动类,而要让这段静态代码块执行,只要让该类被类加载器加载即可)。
可以通过 DriverManager 类建立到数据库的连接Connection:
DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序。
DriverManager类中的静态方法 | 描述 |
---|---|
Connection getConnection(String url, String user, String password) | 通过连接字符串,用户名,密码来得到数据 库的连接对象 |
Connection getConnection(String, Properties info) | 通过连接字符串,属性对象来得到连接对象 |
JDBC连接数据库的四个参数 | 说明 |
---|---|
用户名 | 登录的用户名 |
密码 | 登录的密码 |
连接字符串URL | 不同的数据库 URL 是不同的,mysql 的写法jdbc:mysql://localhost:3306/数据库[?参数名=参数值] |
驱动类的字符串名 | com.mysql.jdbc.Driver |
协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值
//1、加载与注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取数据库连接
String url = "jdbc:mysql://localhost:3306/testdb";
Connection conn = DriverManager.getConnection(url, "root", "123456");
数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果。
其实一个数据库连接就是一个Socket连接。
在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式:
Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。
CallableStatement:用于执行 SQL 存储过程
通过调用 Connection 对象的 createStatement() 方法创建该对象,该对象用于执行静态的 SQL 语句,并且返回执行结果。
Statement中的方法
Statement接口中的方法 | 描述 |
---|---|
int executeUpdate(String sql) | 用于发送DML语句,增删改的操作:insert、update、delete;参数:SQL语句;返回值:返回对数据库影响的行数 |
ResultSet executeQuery(String sql) | 用于发送DQL语句,执行查询的操作:select;参数:SQL语句;返回值:查询的结果集 |
通过调用Statement对象的excuteQuery()方法创建该对。ResultSet对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现。
ResultSet对象维护了一个指向当前数据行的游标
,初始的时候,游标在第一行之前,可以通过ResultSet对象的next()方法移动到下一行。
ResultSet 接口的常用方法:
Connection、Statement、ResultSet都是应用程序和数据库服务器的连接资源,使用后一定要关闭,可以在finally中关闭。
创建包cn.maya.test01.jdbc
创建类TestJDBC.java
@Test
public void testAdd() throws Exception{
//1、注册驱动:把驱动类加载到内存,并且初始化这个类
Class.forName("com.mysql.jdbc.Driver");
//2、连接数据库(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
String url = "jdbc:mysql://localhost:3306/maya?useUnicode=true&characterEncoding=utf8";
Connection conn = DriverManager.getConnection(url, "root", "root");
//java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
//解决这个问题的思路:查看主机名,用户名,密码
System.out.println(conn.getClass());//获取运行时类型 class com.mysql.jdbc.Connection
//3、操作数据库
//这里我要添加一条记录到t_stu
//(1)编写sql
String sql = "INSERT INTO t_stu VALUES(NULL,'刘翔飞','男','123456789012345698','1987-09-09','极客玛雅')";
/*
* Connection好比网络编程中的Socket
* Statement好比和服务器进行数据读写的InputStream和OutputStream
*/
//(2)准备一个Statement
Statement st = conn.createStatement();
//(3)执行sql,通过Statement对象把Sql发给服务器,服务器执行Sql后,把结果返回
//insert ,update,delete语句都是通过这个方法执行
int len = st.executeUpdate(sql);
System.out.println(len>0?"添加成功":"添加失败");
//4、释放资源
st.close();
conn.close();
}
@Test
public void testSelect() throws Exception {
//1、注册驱动:把驱动类加载到内存,并且初始化这个类
Class.forName("com.mysql.jdbc.Driver");
//2、连接数据库(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
String url = "jdbc:mysql://localhost:3306/maya?useUnicode=true&characterEncoding=utf8";
Connection conn = DriverManager.getConnection(url, "root", "root");
//3、操作数据库
//(1)编写SQL
String sql = "SELECT * FROM t_stu";
//(2)准备一个Statement
Statement st = conn.createStatement();
//(3)执行sql,通过Statement对象把Sql发给服务器,服务器执行Sql后,把结果返回
//select语句用query方法
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
//是否有下一行
//取这一行的单元格
int sid = rs.getInt("sid");
String sname = rs.getString("sname");
String gender = rs.getString("gender");
System.out.println(sid + "\t" + sname + "\t" + gender);
}
//4、释放资源
st.close();
conn.close();
}