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服务器的用户名,这里暂时书写rootpassword:接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()){// 指针移动一行,有数据才返回trueint 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.定义sqlString 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();}
}