一、JDBC是什么
1.概念
JDBC是Java Database Connectivity的缩写,它是Java编程语言中用于访问关系型数据库的标准API。JDBC提供了一组接口,可以用来连接不同类型的关系型数据库,执行SQL语句并查询结果。通过JDBC API,Java程序员可以编写跨平台的数据库应用程序,这些应用程序可以在不同的操作系统和数据库管理系统上运行。
2.工作原理:
应用程序使用JDBC API来连接数据库,并发送SQL语句到数据库中。数据库管理系统接收到SQL语句后,执行相应的操作并返回结果集。JDBC API可以处理这些结果集,以便应用程序可以对他们进行操作。
JDBC提供了许多接口和类,包括DriverManyager、Connection、Statement、ResultSet等,用于连接数据库、执行SQL语句、处理结果集等操作。JDBC还支持事务管理、批量更新、元数据查询等高级功能,使得开发数据库应用程序更加方便和高效
3.JDBC好处:
- 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可随时替换底层数据库,访问
- 数据库的Java代码基本不变
步骤:
1.创建工程,导入驱动jar包 mysql-connector-java-5.1.48.jar
2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
3.获取连接
Connection conn = DriverManager.getConnection(url,username,password);
4.定义SQl语句
String sql = "update…";
5.获取执行SQL对象
Statement stmt = conn.createStatement();
6.执行SQL
stmt.executeUpdate(sql);
6.处理返回结果
7.释放资源
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/itcast";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String sql = "update demo set age = 30 where id = 1";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);
//6.处理结果
System.out.println(count);
//7.释放资源
stmt.close();
conn.close();
}
二、JDBC API
DriverManager
1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
2.获取连接
Connection conn = DriverManager.getConnection(url,username,password);
参数:
(1)url:连接路径
语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2…
如果连接的是本机mysql服务器,并且mysql服务器默认端口是3306,则url可以简写为:
jdbc:mysql:///数据库名称?参数键值对
(2)user:用户名
(3)password:密码
Connection
1.获取执行sql的对象
(1)普通执行sql对象
Statement createStatement()
(2)预编译sql的执行sql对象:防止sql注入
PreparedStatement prepareStatement(sql)
(3)执行存储过的对象
Callabl;eStatement prepareCall(sql)
2.事务管理
(1)MQSQL事务管理
开启事务:begin;/start transaction;
提交事务:commit;
回滚事务:pollback;
MYSQL默认自动提交事务
(2)JDBC 事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/itcast";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String sql1 = "update demo set age = 30 where id = 1";
String sql2 = "update demo set age = 40 where id = 2";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
try{
//开启事务
conn.setAutoCommit(false);
//执行sql1
int count1 = stmt.executeUpdate(sql1);
//处理结果
System.out.println(count1);
//执行sql2
int count2 = stmt.executeUpdate(sql2);
//处理结果
System.out.println(count2);
//提交事务
conn.commit();
}catch(Exception throwables){
//回滚事务
conn.rollback();
throwables.printStackTrace();
}
//7.释放资源
stmt.close();
conn.close();
}
Statement
1.执行sql语句
int executeUpdate(sql):执行DM(数据操作语言)L、DDL(数据定义语言)语句
返回值:(1)DML语句影响的行数 (2)DDL语句执行后,执行成功也可能返回0(删除)
String sql = "create database user";
String sql = "drop database user";
ResultSet executeQuery(sql):执行DQL语句
返回值:ResultSet 结果集对象
ResultSet
1.封装了DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
获取查询结果
boolean next():(1)将光标从当前位置向前移动一行 (2)判断当前行是否为有效行
返回值:
true:有效行,当前行有数据
false:无效行,当前行没有数据
xxx getXxx(参数):获取数据
xxx:数据类型:int getInt(参数) 、String getString(参数)
参数:
int:列的编号,从1开始
String:列的名称
使用步骤:
1.游标向下移动一行,并判断游标是否是最后一行末尾
2.获取数据:getXxx(参数)
//循环判断游标是否是最后一行末尾
while(rs.next()){
//获取数据
rs.getXxx();
}
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/itcast";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String sql = "select * from demo";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql);
//6.处理结果,遍历rs中的所有数据
//光标向下移动一行,并且判断当前行是否有数据
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String gender = rs.getString("gender");
int score = rs.getInt("score");
// int id = rs.getInt(1);
// String name = rs.getString(2);
// int age = rs.getInt(3);
// String gender = rs.getString(4);
// int score = rs.getInt(5);
System.out.println(id);
System.out.println(name);
System.out.println(age);
System.out.println(gender);
System.out.println(score);
System.out.println("---------");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
PreparedStatement
预编译SQL语句并执行:预防SQL注入问题
SQL注入:通过操作输入来修改实现定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/itcast";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String user_name = "zhx";
String pass_word = "123456";
String sql = "select * from tb_user where name = '"+user_name+"' and password = '"+pass_word+"'";
//4.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5.执行sql
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
String n = rs.getNString(1);
String pwd = rs.getNString(2);
System.out.println(n);
System.out.println(pwd);
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
步骤:
(1)获取PreparedStatement对象
//SQL语句中的参数值,使用?占位符替代
String sql = "select * from tb_user where name = ? and password = ?";
//通过Connection对象 获取,并传入对应的sql语句
PreparedStatement pstmt = conn.preparedStatement(sql);
(2)设置参数值
PreparedStatement对象:setXxx(参数1,参数2):给?赋值
Xxx:数据类型
参数:
参数1:?的位置编号,从1开始
参数2:?的值
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://localhost:3306/itcast";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url,username,password);
//3.定义sql
String user_name = "zhx";
String pass_word = "123456";
String sql = "select * from tb_user where name = ? and password = ?";
//4.获取执行sql的对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1,user_name);
pstmt.setString(2,pass_word);
//5.执行sql
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
String n = rs.getNString(1);
String pwd = rs.getNString(2);
System.out.println(n);
System.out.println(pwd);
}
//7.释放资源
rs.close();
pstmt.close();
conn.close();
}