Java-JDBC的对象DriverManager,Connection,ResultSet,PreparedStatement,工具类:JDBCUTILS,JDBC控制事务
1. 概念
- Java DataBase Connectivity Java 数据库连接 Java语言操作数据库
- JDBC本质:其实是官方(sun)公司的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类 Person接口 Worker类 Person p=new Worker p.eat()
2.快速入门
2.1 步骤
* 导入驱动jar包
* 注册驱动
* 获取数据库连接对象 Connection
* 定义sql
* 注意:参数使用?作为占位符
* 获取执行sql语句的对象 Statement
* 执行sql 接受返回的结果
* 处理结果
* 释放资源
2.2 举例
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
//jdbc的快速入门
public class JdbcDemo1 {
public static void main(String[] args) throws Exception {
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据的链接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "123456");
//4.定义sql语句
String sql="UPDATE account set balance=500 WHERE id=1";
//5.获取执行sql的对象 Statement
Statement stmt= connection.createStatement();
//6.执行sql
int count=stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
connection.close();
}
}
3 详解各个对象
3.1 DriverManager:驱动管理对象
注册驱动:告诉程序该使用哪一个数据库驱动jar
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager
写代码使用: Class.forName("com.mysql.jdbc.Driver");
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块
static{
try{
java.sql.DriverManger.registerDriver(new Driver());
}catch(SQLException E){
throw new RuntimeException("Can't register driver!");
}
}
注意:mysql5之后的驱动jar包可以忽略注册驱动的步骤
获取数据库连接
- 方法:static Connection getConnection(String url,String user,String password)
- 参数:
- url:指定连接的路径
- 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
- 例子:jdbc:mysql://localhost:3306/db3
- user:用户名
- password:密码
- url:指定连接的路径
3.2 Connection:数据库连接对象
获取执行sql的对象
- Statement createStatement()
- PreparedStatement preparedStatement(String sql)
管理事务
- 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false。即开启事务
- 提交事务:commit()
3.3 Statement:执行sql的对象
- 执行sql
- boolean excute(String sql):可以执行任意的sql语句
- int excuteUpdata(String sql):执行DDL语句(create,alter,drop),执行DML语句(insert,update,delete)
- 返回值:影响的行数,可以通过这个影响的行数来判断语句是否执行成功,返回值大于0则执行成功,反之,失败
- ResultSet excuteQuery(String sql):执行DQL语句(select)
举例
package cn.itcast.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcDemo5 {
public static void main(String[] args){
Statement stmt=null;
Connection connection=null;
//1.导入驱动jar包
//2.注册驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//4.定义sql语句
String sql="CREATE TABLE studentone(id int,name varchar(20))";
//3.获取数据的链接对象
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "123456");
//5.获取执行sql的对象 Statement
stmt= connection.createStatement();
//6.执行sql
int count=stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
if (count>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//8.释放资源
//避免空指针异常
// stmt.close();
if (stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
3.4 ResultSet:结果集对象
- Boolean next():游标向下移动一行
- getXxx(参数):获取数据
- Xxx:代表数据类型 如 int getInt(),String getString()
- 参数:
- 1.int:代表列的编号,从1开始 如:getString(1)
- 2.String:代表列名称,如:getDouble("balance")‘
- 注意:
- 使用步骤:
- 游标向下移动一行
- 判断是否有数据
- 获取数据
- 使用步骤:
举例
//6.执行sql
resultSet =stmt.executeQuery(sql);
//7.处理结果
//游标下移一行
while(resultSet.next()){
//获取数据
int id=resultSet.getInt(1);
String name=resultSet.getString("name");
double balance =resultSet.getDouble(3);
System.out.println(id+"-----"+name+"------"+balance);
}
3.5 PreparedStatement:执行sql的对象
- SQL注入问题:在拼接SQL时,有一些SQL的特殊关键字参与字符串的拼接。会造成安全性问题
- 输入用户随便,输入密码:'a' or 'a'='a'
- SQL:select * from user where username='FHDSJKF' and password='a' or 'a'='a'
- 解决SQL注入问题:使用PreparedStatement对象来解决
- 预编译的SQL:参数使用?作为占位符
- 步骤:
- 步骤:
- 导入驱动jar包
- 注册驱动
- 获取数据库连接对象 Connection
- 定义sql
- 注意:参数使用?作为占位符 如:select * from user where username=? and password=?
- 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)
- 给?赋值
- 方法:setXxx(参数1,参数2)
- 参数1:?的1位置编号从1开始
- 参数2:?的值
- 方法:setXxx(参数1,参数2)
- 执行sql 接受返回的结果,不需要传递SQL语句
- 处理结果
- 释放资源
- 注意:后期都会使用ReparedStatement来完成增删查改的所有操作
- 可以防止SQL注入
- 效率更高
4.定义一种方法,查询emp表的数据将其封装成对象,然后装载集合,返回
4.1 定义emp类
package cn.itcast.domain;
import java.util.Date;
//封装Emp表的JavaBean
public class Emp {
private int id;
private String ename;
private int job_id;
private int mgr;
private Date joindate;
private double salary;
private double bounds;
private int dept_id;
public Emp(int id, String ename, int job_id, int mgr, Date joindate, double salary, double bounds, int dept_id) {
this.id = id;
this.ename = ename;
this.job_id = job_id;
this.mgr = mgr;
this.joindate = joindate;
this.salary = salary;
this.bounds = bounds;
this.dept_id = dept_id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getJob_id() {
return job_id;
}
public void setJob_id(int job_id) {
this.job_id = job_id;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public Date getJoindate() {
return joindate;
}
public void setJoindate(Date joindate) {
this.joindate = joindate;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public double getBounds() {
return bounds;
}
public void setBounds(double bounds) {
this.bounds = bounds;
}
public int getDept_id() {
return dept_id;
}
public void setDept_id(int dept_id) {
this.dept_id = dept_id;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", ename='" + ename + '\'' +
", job_id=" + job_id +
", mgr=" + mgr +
", joindata=" + joindate +
", salary=" + salary +
", bounds=" + bounds +
", dept_id=" + dept_id +
'}';
}
}
4.2 定义方法 public List findAll(){}
package cn.itcast.jdbc;
import cn.itcast.domain.Emp;
import cn.itcast.utils.JDBCutils;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
//定义一个方法,查询emp表的数据将其封装成对象,然后装载集合,返回
public class JdbcDemo9 {
public List findAll(){
Statement stmt=null;
Connection connection=null;
ResultSet resultSet=null;
List list=new ArrayList();
Emp emp=null;
//1.导入驱动jar包
//2.注册驱动
try {
// Class.forName("com.mysql.jdbc.Driver");
// //3.获取数据的链接对象
// connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "123456");
connection=JDBCutils.getConnection();
//4.定义sql语句
String sql="select * from emp";
//5.获取执行sql的对象 Statement
stmt= connection.createStatement();
//6.执行sql
resultSet =stmt.executeQuery(sql);
//7.处理结果
//游标下移一行
while(resultSet.next()){
//获取数据
System.out.println("----------1-----------");
int id=resultSet.getInt("id");
String ename=resultSet.getString("ename");
int job_id=resultSet.getInt("job_id");
int mgr=resultSet.getInt("mgr");
Date joindate=resultSet.getDate("joindate");
double salary=resultSet.getDouble("sarlary");
double bounds=resultSet.getDouble("bonus");
int dept_id=resultSet.getInt("dept_id");
//创建emp对象
emp=new Emp(id,ename,job_id,mgr,joindate,salary,bounds,dept_id);
//装载集合
list.add(emp);
// System.out.println(list);
}
}catch (SQLException e) {
e.printStackTrace();
}finally {
//8.释放资源
//避免空指针异常
//未使用jdbcutil工具类简化
// stmt.close();
// if (resultSet!=null){
// try {
// resultSet.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
// }
// if (connection!=null){
// try {
// connection.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
// }
JDBCutils.close(resultSet,stmt,connection);
}
return list;
}
public static void main(String[] args) {
List<Emp> list=new JdbcDemo9().findAll();
System.out.println(list);
}
}
4.3 实现方法 select * from emp
public static void main(String[] args) {
List<Emp> list=new JdbcDemo8().findAll();
System.out.println(list);
}
}
5.抽取JDBC工具类:JDBCUTILS
package cn.itcast.utils;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
//jdbc工具类
public class JDBCutils {
private static String url;
private static String user;
private static String password;
private static String driver;
//文件的读取,只需读取一次就可的导这些值,使用静态代码块
static {
//读取资源文件,获取值
//1.创建Properties集合类
Properties properties=new Properties();
//获取src路径下的文件的方式--->ClassLoader 类加载器
ClassLoader classLoader=JDBCutils.class.getClassLoader();
URL res=classLoader.getResource("jdbc.properties");
String path=res.getPath();
System.out.println(path);
//加载文件
try {
properties.load(new FileReader("E:\\Idea Project\\yonghucase\\out\\production\\jdbc test\\jdbc.properties"));
// properties.load(new FileReader(path));
//获取属性赋值
url=properties.getProperty("url");
user=properties.getProperty("user");
password=properties.getProperty("password");
driver=properties.getProperty("driver");
//注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url,user,password);
}
//释放资源
public static void close(Statement statement,Connection connection){
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet resultSet,Statement statement, Connection connection){
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5.1 目的:简化书写
- 分析:
- 注册驱动也抽取
- 抽取一个方法获取连接对象
- 需求:不想传递参数,还得保证工具类的通用性
- 解决:配置文件
jdbc.properties
url=
user=
password=
- 抽取一个方法释放资源
5.2 练习:通过键盘录入用户名和密码,判断用户是否登录成功
package cn.itcast.jdbc;
import cn.itcast.domain.Emp;
import cn.itcast.utils.JDBCutils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
public class JdbcDemo10 {
public static void main(String[] args){
//键盘录入,接受用户名和密码
Scanner scanner=new Scanner(System.in);
System.out.println("请输入用户名");
String username=scanner.nextLine();
System.out.println("请输入密码");
String password=scanner.nextLine();
//调用方法
boolean flag=new JdbcDemo10().login(username,password);
//判断结果,输出不同数据
if(flag){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
//登录方法
public boolean login(String username,String password){
if(username==null||password==null){
return false;
}
Connection connection=null;
Statement stmt=null;
ResultSet resultSet=null;
// //3.获取数据的链接对象
try {
connection = JDBCutils.getConnection();
//定义sql
String sql="select * from user where username='"+username+"' and password='"+password+"'";
//获取执行sql的对象
stmt=connection.createStatement();
//执行查询
resultSet=stmt.executeQuery(sql);
return resultSet.next();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.close(resultSet,stmt,connection);
}
//连接数据库判断是否成功
return false;
}
}
6.JDBC控制事务
6.1 事务
- 一个包含多个步骤的业务操作。如果业务操作被事务管理,则多个步骤要么同时成功。要么同时失败
6.2 操作
- 开启事务
- 提交事务
- 回滚事务
6.3 使用Connection对象来管理事务
- 开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false。即开启事务
- 提交事务:commit()
- 回滚事务:rollback()
6.4 实例
package cn.itcast.jdbc;
import cn.itcast.utils.JDBCutils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcDemo12 {
public static void main(String[] args){
Connection connection=null;
PreparedStatement preparedStatement1=null;
PreparedStatement preparedStatement2=null;
ResultSet resultSet=null;
//获取连接
try {
connection= JDBCutils.getConnection();
String sql1="update account set balance=balance-? where id=?";
String sql2="update account set balance=balance+? where id=?";
preparedStatement1=connection.prepareStatement(sql1);
preparedStatement2=connection.prepareStatement(sql2);
//设置参数
preparedStatement1.setDouble(1,500);
preparedStatement1.setInt(2,1);
preparedStatement2.setDouble(1,500);
preparedStatement2.setInt(2,1);
preparedStatement1.executeUpdate();
preparedStatement2.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.close(preparedStatement1,connection);
JDBCutils.close(preparedStatement2,connection);
}
}
}
Java-JDBC的对象DriverManager,Connection,ResultSet,PreparedStatement,工具类:JDBCUTILS,JDBC控制事务的更多相关文章
- 将java中Map对象转为有相同属性的类对象(json作为中间转换)
java中Map对象转为有相同属性的类对象(json作为中间转换) 准备好json转换工具类 public class JsonUtil { private static ObjectMapper o ...
- MySQL_(Java)提取工具类JDBCUtils
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...
- Java集合 Map 集合 与 操作集合的工具类: Collections 的详细说明
Java集合 Map 集合 与 操作集合的工具类: Collections 的详细说明 每博一文案 别把人生,输给心情 师父说:心情不是人生的全部,却能左右人生的全部. 你有没有体会到,当你心情好的时 ...
- Java并发(十六):并发工具类——Exchanger
Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法交换数 ...
- Java匹马行天下之JavaSE核心技术——工具类
Java匹马行天之JavaSE核心技术——工具类 一.Object类 java.lang.ObjectObject类是所有类直接或间接的父类 常用的方法: toString():以字符串形式返回对象的 ...
- Java并发(十五):并发工具类——信号量Semaphore
先做总结: 1.Semaphore是什么? Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源. 把它比作是控制流量的红绿灯,比如XX马路要 ...
- Java并发(十四):并发工具类——CountDownLatch
先做总结: 1.CountDownLatch 是什么? CountDownLatch 允许一个或多个线程等待其他线程(不一定是线程,某个操作)完成之后再执行. CountDownLatch的构造函数接 ...
- Java并发编程系列-(2) 线程的并发工具类
2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...
- Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable
Java容器类Collection,List,Set,Map.,Iterator,Collections工具类,Arrays工具类,Comparable接口,泛型 Collection,List,Se ...
- 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类
一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...
随机推荐
- windows下使用winget快速安装nvm
前置条件: 操作系统 >= win10 安装 首先使用winget搜索nvm包 winget search nvm #搜索结果如下图 安装nvm winget install CoreyButl ...
- docker资源限制与数据持久化
1. docker简介和核心概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.容器是完全使 ...
- Dockerfile PHP镜像制作
1 PHP镜像制作: 1.1 php-dockerfile FROM centos:7 LABEL maintainer www.chenleilei.net RUN yum install -y c ...
- itestwork(爱测试) 开源一站式接口测试&敏捷测试工作站 9.0.2Rc2发布
(一)itest 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest work 包 ...
- Java爬虫-爬取疫苗批次信息
今年3月份开始,就接到通知, 根据<关于开展有关人群第二剂次脊髓灰质炎灭活疫苗补种工作的通知>国疾控卫免发[2024]1号文件要求,在2016年3月1日至2019年9月30日之间出生的儿童 ...
- umount 报错umount: /new_room: target is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1))
挂载逻辑卷后,尝试更新逻辑卷的文件系统 [root@server lost+found]# umount /new_room/ umount: /new_room: target is busy. ( ...
- SCOI 回旋退役记
02.21 day -2 开始写了,期望这不是真的退役记吧.但是不是的概率好小-- 这几天一直考试,怎么说呢,到差不差的,也就那个样子. 归根结底,菜是原罪,和那些大佬相比我真的很很很菜啊.当时看 c ...
- 使用itextPDF实现PDF电子公章工具类
使用itextPDF实现PDF电子公章工具类 一.制作公章 在线网站:印章生成器 - Kalvin在线工具 (kalvinbg.cn) 然后对公章进行下载保存 盖章图片: 二.生成数字签名 2.1: ...
- System.lineSeparator()行分隔符的用法
System.lineSeparator()具体含义 从JDK的源码中,可以看出:它是从JDK1.7之后开始有的这个方法. 在UNIX系统下,System.lineSeparator()方法返回&qu ...
- 私密信息管理工具 Vault 快速入门
什么是 Vault Vault 是一个基于身份的秘密和加密管理系统.秘密是您想要严格控制访问的任何内容,例如 API 加密密钥.密码和证书. Vault 提供由身份验证和授权方法控制的加密服务.使用 ...