1、获取连接
能够通过JDBC获取数据库连接
讲解
API介绍
java.sql.DriverManager
类中有如下方法获取数据库连接
static Connection getConnection(String url, String user, String password)
连接到给定数据库 URL ,并返回连接。
参数说明
String url
:连接数据库的URL,用于说明连接数据库的位置String user
:数据库的账号String password
:数据库的密码
连接数据库的URL地址格式:协议名:子协议://服务器名或IP地址:端口号/数据库名?参数=参数值
MySQL写法:jdbc:mysql://localhost:3306/day04_db
如果是本地服务器,端口号是默认的3306,则可以简写:jdbc:mysql:///day04_db
注意事项
如果数据出现乱码需要加上参数: ?useUnicode=true&characterEncoding=utf8,表示让数据库以UTF8编码来处理数据。
如: jdbc:mysql://localhost:3306/day04_db?useUnicode=true&characterEncoding=utf8
使用步骤
1.DriverManager.getConnection(url, user, password); 传入对应参数即可
案例代码
public class Demo01 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
/*
1)使用DriverManager类中的静态方法获取和数据库的连接:
static Connection getConnection(String url, String user, String password)
参数:
url:表示建立和数据库服务器连接的地址,书写格式几乎是固定的。
jdbc:mysql://连接mysql服务器的ip地址:mysql服务器的端口号/连接的数据库名
补充:如果连接的数据库软件在本地,那么url可以简写为:jdbc:mysql:///连接的数据库名
user:连接mysql服务器的用户名,这里暂时书写root
password:接mysql服务器的密码
返回值:Connection,属于java.sql 包下的一个接口,表示连接接口,和数据库的连接。
*/
// 连接到MySQL
// url: 连接数据库的URL
// user: 数据库的账号
// password: 数据库的密码
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day04_db", "root", "1234");
System.out.println(conn);
}
}
案例效果
1.连接成功
2.连接失败
小结
-
JDBC获取数据库连接使用哪个API?
DriverManager.getConnection(数据库url, 账号, 密码)
-
通过JDBC连接mysql的URL写法?
jdbc:mysql://服务器ip地址:3306/数据库
3.如果连接mysql服务器在本地,那么url可以简写:
jdbc:mysql:///数据库
2、JDBC实现对单表数据增、删、改
目标
通过JDBC实现对单表数据增、删、改、查
讲解
JDBC实现对单表数据增、删、改
我们要对数据库进行增、删、改、查,需要使用Statement
对象来执行SQL语句。
API介绍
获取Statement对象
在java.sql.Connection
接口中有如下方法获取到Statement
对象
Statement createStatement()
创建一个 Statement 对象来将 SQL 语句发送到数据库
Statement的API介绍
-
int executeUpdate(String sql) 根据执行的DML(INSERT、UPDATE、DELETE)语句,返回受影响的行数
-
ResultSet executeQuery(String sql) 根据查询语句返回结果集,只能执行SELECT语句
注意:在MySQL中,只要不是查询就是修改。
executeUpdate:用于执行增删改
executeQuery:用于执行查询
使用步骤
- 注册驱动
- 获取连接
- 获取Statement对象
- 使用Statement对象执行SQL语句
- 释放资源
案例代码
public class Demo03 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");
System.out.println(conn);
/*
1)获取发送sql语句对象使用Connection连接接口对象调用Connection接口的方法:
Statement createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。
PreparedStatement prepareStatement(String sql) 创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
2)Statement和PreparedStatement都可以用来向数据库发送sql语句,Statement是PreparedStatement的父接口。
3)PreparedStatement 是安全的,Statement不安全的。并且Statement效率低,PreparedStatement效率高
4)Connection还可以手动控制mysql事务:
开启事务 void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。
autoCommit - 为 true 表示启用自动提交模式;为 false 表示禁用自动提交模式
1. conn.setAutoCommit(false);
一切正常提交事务 void commit()
2. conn.commit()
出现异常,回滚事务 void rollback()
3. conn.rollback()
*/
// 从连接中拿到一个Statement对象
Statement stmt = conn.createStatement();
/*
Statement向数据库发送sql语句,使用Statement中的不同的方法可以向数据库发送不同的sql语句:
1)DQL查询语句: ResultSet executeQuery(String sql) 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。
参数:sql - 要发送给数据库的 SQL 语句,通常为静态 SQL SELECT 语句
返回值:ResultSet用来存放查询的结果,表示结果集
2)DML增删改和DDL语句(创建表和数据库)使用的方法:
int executeUpdate(String sql)
执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句(DML),
或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。
返回值:
1) 对于 SQL 数据操作语言 (DML) 语句,返回行记录数,影响的行数
2) 对于什么都不返回的 SQL 语句,返回 0 ,执行DDL返回的是0 了解
*/
// 1.插入记录
String sql = "insert into user values(null, 'zhaoliu', 'abc')";
int i = stmt.executeUpdate(sql);
System.out.println("影响的行数:" + i);
// 2.修改记录
sql = "update user set username='tianqi' where username='zhaoliu'";
i = stmt.executeUpdate(sql);
System.out.println("影响的行数:" + i);
// 3.删除记录
sql = "delete from user where id=4";
i = stmt.executeUpdate(sql);
System.out.println("影响的行数:" + i);
// 释放资源
stmt.close();
conn.close();
}
}
3、JDBC实现对单表数据查询
目标
能够掌握JDBC实现对单表数据查询
讲解
ResultSet
用于保存执行查询SQL语句的结果。
我们不能一次性取出所有的数据,需要一行一行的取出。
ResultSet的原理
- ResultSet内部有一个指针,刚开始记录开始位置
- 调用next方法, ResultSet内部指针会移动到下一行数据
- 我们可以通过ResultSet得到一行数据 getXxx得到某列数据
ResultSet获取数据的API
其实ResultSet获取数据的API是有规律的get后面加数据类型。我们统称getXXX()
例如:
对于上图中的一行数据,我要获取username为zhangsan这列的值,有如下2种写法:
-
rs.getString(“username”); 通过列名获取该列的值。
-
rs.getString(2); 通过username列所在的第二个位置获取该列的值。
使用JDBC查询数据库中的数据的步骤
- 注册驱动
- 获取连接
- 获取到Statement
- 使用Statement执行SQL
- ResultSet处理结果
- 关闭资源
案例代码
public class Demo04 {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:///day04_db", "root", "1234");
Statement stmt = conn.createStatement();
String sql = "select * from user";
ResultSet rs = stmt.executeQuery(sql);
// 内部有一个指针,只能取指针指向的那条记录
while(rs.next()){// 指针移动一行,有数据才返回true
int id = rs.getInt("id");
String name = rs.getString(2);
String pwd= rs.getString(3);
System.out.println(id+"+++"+name+"++++"+pwd);
}
// 关闭资源
rs.close();
stmt.close();
conn.close();
}
}
小结
其实我们使用JDBC操作数据库的步骤都是固定的。不同的地方是在编写SQL语句
- 注册驱动
- 获取连接
- 获取到Statement
- 使用Statement执行SQL
- ResultSet处理结果
- 关闭资源
ResultSet如何获取数据?
- 调用next方法, ResultSet内部指针会移动到下一行数据
- 我们可以通过ResultSet得到一行数据 getXxx得到某列数据
4. 根据别名查询处理结果集扩展
package com.itheima.sh.a_jdbc_01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBC03Test {
public static void main(String[] args) throws Exception {
/*
需求:查询数据表user2所有数据输出到控制台
*/
//2.获取连接
String url = "jdbc:mysql://localhost:3306/day03_heima138";//连接mysql服务器地址
String username = "root";//连接mysql服务器用户名
String password = "1234";//连接mysql服务器密码,这里输入你的密码
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义sql
String sql = "select id,username,password pwd from user2";
//4.获取发送sql语句对象
Statement st = conn.createStatement();
//5.发送sql语句
/*
1.ResultSet 表示结果集,用来存放查询的结果,因为查询有可能是多行数据,所以使用集合存储
*/
ResultSet rs = st.executeQuery(sql);
//6.处理结果
while(rs.next()){
//获取数据
int id = rs.getInt("id");
String userName = rs.getString("username");
/*
对应处理结果集ResultSet中的getXxx(xxx 变量名):
1)根据第几列来获取字段值:例如password属于第三列,那么这里获取password值是:rs.getString(3);
2)根据字段名或者别名来获取字段值:如果sql语句某个字段有别名,那么只能书写别名,不能书写字段
sql语句:select id,username,password pwd from user2
获取密码值:rs.getString("pwd");
*/
String pwd = rs.getString("pwd");
//输出
System.out.println(id+"---"+userName+"---"+pwd);
}
//7.释放资源
rs.close();
st.close();
conn.close();
}
}