新JDBC黑马程序员详解
Posted 做一枚简单快乐的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新JDBC黑马程序员详解相关的知识,希望对你有一定的参考价值。
01-JDBC简介&快速入门
- JDBC简介
- JDBC概念:
- JDBC就是使用Java语言操作关系型数据库的一套API
- 全称:(Java DataBase Connectivity)Java数据库连接
- JDBC本质:
- 官方定义的一套操作所有关系型数据库的规则,接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
- JDBC好处:
- 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
- 可随时替换底层数据库,访问数据库的Java代码基本不变
-
JDBC的快速入门
0. 创建工程,导入驱动jar包mysql-connectior-java-5.1.48.jar
- 注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
2. 获取连接Connection conn = DriverManger.getConnection(url,usename,password);
3. 定义SQL语句String sql =“update…”;
4. 获取执行SQL对象Statement stmt=conn.createStatement();
5. 执行SQLstmt.executeUpdate(sql);
6. 处理返回结果
7. 释放资源
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*
JDBC快速入门
*/
public class JDBCDemo
public static void main(String[] args) throws ClassNotFoundException, SQLException
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/class";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义语句
String sql = "UPDATE score set grade =50 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
- Connection
- Statement
- ResultSet
- PreparedStatement
-
DriverManager (驱动管理类)作用:
- 注册驱动
Class.forName("com.mysql.jdbc.Driver");
查看源码
Static try DriverManger.registerDriver(new Driver()); catch(SQLException var1) throw new RuntimeException("can't register driver!");
提示:
- Mysql 5 之后的驱动包,可以省略注册驱动的步骤
- 自动加载jar包中的驱动类
- 获取数据库连接
static Connection getConnerction(String url,String user,String password)
- 参数
- url:连接路径
语法:jdbc:mysql://ip地址域名:端口号/数据库名称?参数键值对1&参数键值对2... 实例:jdbc:mysql:///127.0.0.1:3306/db1 细节:1.如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称?参数键值对 2.配置useSSL=false参数,禁止用安全连接方式,解决警告提示
- user:用户名
- password:密码
- Connection(数据库连接对象)作用:
- 获取执行SQL的对象
-
普通执行SQL对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
- 执行存储过程的对象
CallableStatement prepareCall(sql)
- 管理事务
* Mysql事务管理
开启事务:BEGIN;/START TRANSACTION;
提交事务:COMMIT;
回滚事务:ROLLBACK;
MySQL默认自动提交事务
* JDBC事务管理:Connection接口中定义了3个对应的方法
开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务
提交事务:commit()
回滚事务:rollback()
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*
事务
*/
public class JDBCDemo3_Connection
public static void main(String[] args) throws ClassNotFoundException, SQLException
//1.注册驱动
// Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql://127.0.0.1:3306/class?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义语句
String sql1 = "UPDATE score set grade =50 where id=1";
String sql2 = "UPDATE score set grade =50 where id=2";
//4.获取执行sql的对象statement
Statement stmt = conn.createStatement();
try
//开启事务
conn.setAutoCommit(false);
//执行sql
int count1 = stmt.executeUpdate(sql1);
//处理结果
System.out.println(count1);
int i=3/0;
//执行sql
int count2 = stmt.executeUpdate(sql2);
//处理结果
System.out.println(count2);
//提交事务
conn.commit();
catch (Exception throwable)
//滚动事务
conn.rollback();
throwable.printStackTrace();
//7.释放资源
stmt.close();
conn.close();
JDBC API详解
- Statement
- 执行SQL语句
- 执行SQL语句
int executeUpdate(sql): 执行DDL(主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等),DML语句(主要是对数据进行查询操作。常用关键字有 SELECT、FROM、WHERE 等)
返回值:1.DML语句影响的行数 2.DDL语句执行后,执行成功也可能返回0
DDL语句
/*
JDBC API详解:Statement 执行DML语句
*/
public class JDBCDemo4_Statement
@Test
public void testDML() throws Exception
//1.注册驱动
// Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql:///class?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义语句
String sql = "UPDATE score set grade =80 where id=20";
//4.获取执行sql的对象statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//执行DML语句,受影响的行数
//6.处理结果
// System.out.println(count);
if(count>0)
System.out.println("修改成功");
else
System.out.println("修改失败");
//7.释放资源
stmt.close();
conn.close();
DML语句
/*
DML语句
*/
@Test
public void testDDL() throws Exception
//1.注册驱动
// Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
String url = "jdbc:mysql:///class?useSSL=false";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
//3.定义语句
String sql = "drop database class2";
//4.获取执行sql的对象statement
Statement stmt = conn.createStatement();
//5.执行sql
int count = stmt.executeUpdate(sql);//执行DDL语句,受影响的行数,可能返回0
//6.处理结果
System.out.println(count);
// if(count>0)
// System.out.println("修改成功");
//
//
// else
// System.out.println("修改失败");
//
//7.释放资源
stmt.close();
conn.close();
ResultSet executeQuery(sql): 执行DQL语句
返回值:ResultSet结果集对象
-
ResultSet(就是Statment执行executeQuery返回值)
- Result(结果集对象)作用:
封装DQL查询语句的结果
ResultSet stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象
- 获取查询结果
boolean next():1.将光标从当前位置向前移动一行 2.判断当前行是否为有效行 返回值: true:有效行,当前行有效数据 false:无效行,当前行没有数据
xxx getXxx(参数):获取数据 xxx:数据类型; 如int getInt(参数); String getString(参数) 参数: int:列的编号,从1开始 String:列的名字
-
使用步骤:
- 游标向下移动一行,并判断该行是否有数据:next()
- 获取数据:getXxx(参数)
//循环判断游标是否是最后一行末尾 while(rs.next()) //获取数据 rs.getXxx(参数);
package com.itheima.jdbc; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /* 执行DQL语句 */ public class JDBCDemo4_Result @Test public void testResultSet() throws Exception //1.注册驱动 // Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 String url = "jdbc:mysql:///class?useSSL=false"; String username = "root"; String password = "123456"; //3.定义sql语句 String sql = "select * from score"; Connection conn = DriverManager.getConnection(url, username, password); //4.获取statement对象 Statement stmt = conn.createStatement(); //5.执行sql ResultSet rs = stmt.executeQuery(sql); //6.处理结果,遍历rs中所有数据 //6.1光标向下移动一行,并且判断当前行是否有数据 //行输出 while(rs.next()) //6.2获取数据 getXxx() int id = rs.getInt(1); String name = rs.getString(2); int number = rs.getInt(3); int grade =rs.getInt(4); System.out.println(id); System.out.println(name); System.out.println(number); System.out.println(grade); System.out.println("-------------------"); // //列输出 while(rs.next()) //6.2获取数据 getXxx() int id = rs.getInt("id"); String name = rs.getString("c_name"); int number = rs.getInt("stu_id"); int grade =rs.getInt("grade"); System.out.println(id); System.out.println(name); System.out.println(number); System.out.println(grade); System.out.println("-------------------"); //7.释放资源 rs.close(); conn.close(); stmt.close();
- 案例分析:ResultSet案例
需求:查询account账户表数据,封装Account对象中,并且存储ArrayList集合中
表中数据->java对象->ArrayList
package com.itheima.jdbc; import com.itheima.pojo.Account; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.List; /* *需求:查询account账户表数据,封装Account对象中,并且存储ArrayList集合中 *1.定义实体类Account *2.查询数据,封装Account对象中 *3.将Account对象存入ArrayList集合中 */ public class JDBCDemo4_Result @Test public void testResultSet2() throws Exception //1.注册驱动 // Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 String url = "jdbc:mysql:///class?useSSL=false"; String username = "root"; String password = "123456"; //3.定义sql语句 String sql = "select * from account"; Connection conn = DriverManager.getConnection(url, username, password); //4.获取statement对象 Statement stmt = conn.createStatement(); //5.执行sql ResultSet rs = stmt.executeQuery(sql); //创建一个集合 List<Account> list = new ArrayList<Account>(); while (rs.next()) Account account = new Account(); //6.2获取数据 getXxx() int id = rs.getInt("id"); String name = rs.getString("name"); double money = rs.getDouble("money"); //赋值 account.setId(id); account.setName(name); account.setMoney(money); //存入集合 list.add(account); System.out.println(list); //7.释放资源 rs.close(); conn.close(); stmt.close();
-
PreparedStatement
- 利用密码登入sql 演示SQL注入 需求:完成用户登入
package com.itheima.jdbc; import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; /* * */ public class JDBCDemo5_UserLogin //2. 获取连接 @Test public void testResultSet2() throws Exception //1.注册驱动 // Class.forName("com.mysql.jdbc.Driver"); //2.获取连接 String url = "jdbc:mysql:///class?useSSL=false"; String username = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url,username,password); String name ="zhangsan"; String pwd ="123"; String sql ="select * from tb_user where username =' "+name+" ' and passward =' "+pwd+" ' "; //获取stmt对象 Statement stmt = conn.createStatement(); //执行sql语句 ResultSet rs = stmt.executeQuery(sql); //判断登录是否成功 if(rs.next()) System.out.println("登入成功"); else System.out.println("登入失败"); //释放资源 stmt.close(); rs.close(); conn.close(); /* SQL注入 */ @Test public void testLogin_Inject() throws Exception 以上是关于新JDBC黑马程序员详解的主要内容,如果未能解决你的问题,请参考以下文章
Java基础黑马程序员教材 案例3-2银行存取款,3-4学生投票代码详解
黑马程序员-MyBatis 框架-最全入门笔记阿伟看了都得说真大真细真全!!!