当前位置:网站首页>JDBC的学习以及简单封装
JDBC的学习以及简单封装
2022-07-23 05:38:00 【紫青宝剑】
JDBC学习
1.介绍
1.1 概念
jdbc:Java DataBase Connectivityjava,数据库连接,Java语言操作数据库;
1.2 本质
JDBC本质是由(SUN公司)定义的一套操作所有关系型数据库的规则,各个数据库厂商去实现这套接口,提供驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类;
1.3 快速入门
步骤
- 1.导入驱动
jar包- 创建目录libs将包
mysql-connector-java-5.1.37.jar导入;使用后修改jar包的版本为8.0.17,与本机数据库的版本相互对应 - addlibary

- 创建目录libs将包
- 2.注册驱动
jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC;根据版本的不同选择是否写?serverTimezone=UTC
- 3.获取数据库连接对象
Connection - 4.定义SQL语句
- 5.获取执行语句的对象
Statement - 6.执行SQL,接收返回结果
- 7.处理结果
- 8.释放资源
- 1.导入驱动
代码示例
package cn.sql.one; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JabcDemo { public static void main(String[] args) throws Exception{ //1.jar包放入对应的libs文件夹,Mysql版本对应的不同的jar包 //2.注册驱动;使用反射,将字节码文件加载进内存 Class.forName("com.mysql.jdbc.Driver");//需要抛出异常,在主方法头部进行抛出 //3.获取数据库连接对象;数据库连接引擎:jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567"); //4.定义sql语句,修改语句 String sql="update t1 set username='章北海' where id=1"; //5.获取执行sql的对象Statement Statement stmt = conn.createStatement(); //6.执行sql int conut=stmt.executeUpdate(sql); //7.处理结果 System.out.println(conut); //8.释放资源 stmt.close(); conn.close(); } }
2.基本使用
2.1详解各个对象
1.DriverManager(驱动管理对象)
1.注册驱动
通过静态代码块进行的注册
Class.forName("com.sql.Driver")
2.获取数据库连接
jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC- url,指定连接路径
- test:数据库名
- 如果连接的是本机mysql服务器且mysql服务默认端口是3306,则url可以简写为
jdbc:mysql:///数据库名称 - user:用户名
- password:密码
2.Connection
数据库连接对象
1.获取执行sql的对象
- Statement
- PreparedStatement(参数化)
2.管理事务
- 开启事务 : setAutoCommit(boolean autoCommit),调用该方法设置参数为
false,即开启事务; - 提交事务:commit()
- 回滚事务:rollback()
- 开启事务 : setAutoCommit(boolean autoCommit),调用该方法设置参数为
3.Statement
执行sql的对象
执行静态sql语句,返回结果对象
1. boolean execute(sql)
- 执行任意sql,返回布尔值
2. int executeUpdate(sql)
- 执行**DML(增、删、改)**语句;**DDL(表和库的增、删、改)**语句,DDL一般不在程序中使用。
- 返回值
INT类型,返回受影响的行数。通常可以根据返回值是否大于0,检查DML语句是否运行成功;
3.ResultSet executeQuery(String sql)
- 执行**DQL(select)**语句;
4.ResultSet
结果集对象,封装查询结果
next()方法
- 游标向下获取一行,返回布尔值;
- 当到最后一行则返回False;
getXXX():获取数据
- 如getInt()方法
- 参数
- getString(“username”),参数传入列名;
使用方式
- 游标向下移动一行
- 判断是否有数据
- 获取数据
5.PreparedStatement
- 继承于(Statement),主要用与格式化SQL语句执行,动态,可能还具备防守SQL注入的操作;

package cn.sql.one;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.PreparedStatement;
public class TestPstmt {
public static void main(String[] args) throws Exception {
//1.jar包放入对应的libs文件夹,Mysql版本对应的不同的jar包
//2.注册驱动;使用反射,将字节码文件加载进内存
Class.forName("com.mysql.jdbc.Driver");//需要抛出异常,在主方法头部进行抛出
//3.获取数据库连接对象;数据库连接引擎:jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
Connection conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
//4.定义sql语句,修改语句
String sql="update t1 set username=? where id=?";
//5.获取执行sql的对象Statement
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1,"章北海");
pstmt.setString(2,"1");
//6.执行sql,此时不需要在传入对应的sql
int conut=pstmt.executeUpdate();
//7.处理结果
System.out.println(conut);
//8.释放资源
pstmt.close();
conn.close();
}
}
2.2 添加语句
package cn.sql.one;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcDemo2 {
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;//方便在finally进行管比的操作;
try{
//1.
Class.forName("com.mysql.jdbc.Driver");
String sql="insert into t1(username,age)values('程心',30)";
conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
stmt=conn.createStatement();
int count=stmt.executeUpdate(sql);
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 {
//释放资源之前先检查对象是否为引用数据类型的默认类型;
if(stmt !=null){
try{
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn !=null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
增加为此程序,如果要使用UPDATE或者是insert,delete语句程序同上,但是需要把SQL语句改为对应的SQL语句;
2.3 查询语句
package cn.sql.one;
import java.sql.*;
public class JdbcQuery {
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try{
Class.forName("com.mysql.jdbc.Driver");
String sql="select * from t1";
conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
stmt=conn.createStatement();
//执行查询语句
rs=stmt.executeQuery(sql);
//处理查询结果,使用next判断是否为最后一行
while (rs.next()){
String name=rs.getString("username");
int age= rs.getInt("age");
System.out.println(name+"========"+age);
}
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch ( SQLException e){
e.printStackTrace();
}finally {
if(rs !=null){
try{
rs.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(stmt !=null){
try{
stmt.close();
}catch (SQLException e){
e.printStackTrace();
}
}
if(conn !=null){
try{
conn.close();
}catch (SQLException e){
e.printStackTrace();
}
}
}
}
}
2.4 查询结合集合存储对象
package cn.sql.demo;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class JdbcDemoMain {
public static void main(String[] args) {
List<Person> list=new JdbcDemoMain().show();
System.out.println(list);
}
public List<Person> show(){
//将需要用到的对象资源定义在外面,引用数据类型的默认值都是null;
Connection conn=null;//数据库连接对象
Statement stmt =null;//执行sql语句的对象
ResultSet rs=null;//查询结果集的操作
List<Person> list=null;//存储结果的集合,没有数据则直接返回null;
try {
//1.加载数据库的驱动进入内存
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
conn= DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC","root","1234567");
//3.定义sql语句
String sqlstr="select * from t1";
//4.获取执行sql语句的对象
stmt=conn.createStatement();
//5.执行sql语句
rs=stmt.executeQuery(sqlstr);
Person per =new Person();
list =new ArrayList<>();
while (rs.next()){
int id = rs.getInt("id");
String username=rs.getString("username");
int age=rs.getInt("age");
per.setId(id);
per.setUsername(username);
per.setAge(age);
list.add(per);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}finally {
//释放资源,注意顺序;
if(rs!=null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return list;
}
}

2.5 控制事务

package cn.sql.demo;
import cn.sql.utils.DButils;
import java.sql.Connection;
import java.sql.SQLException;
//实现事务的控制
public class Affairs {
public static void main(String[] args) {
DButils db= new DButils();
Connection conn=db.getConn();
try {
// conn.setAutoCommit(false);//设置为False,自动开启事务
String sqlstr1="update t1 set username='东方' where id=1";
String sqlstr2="update t1 set username='章北海' where id=2";
PreparedStatement pstmt1=conn.prepareStatement(sqlstr1);
PreparedStatement pstmt2=conn.prepareStatement(sqlstr2);
pstmt1.executeUpdate();
int r=3/0;
pstmt2.executeUpdate();
} catch (Exception throwables) {
throwables.printStackTrace();
}finally {
db.close();
}
}
}

制造异常,第一句执行成功但是第二句没有执行成功,不符合事务的特性;下面开启事务。
package cn.sql.demo;
import cn.sql.utils.DButils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
//实现事务的控制
public class Affairs {
public static void main(String[] args) {
DButils db= new DButils();
Connection conn=db.getConn();
try {
conn.setAutoCommit(false);//设置为False,自动开启事务
String sqlstr1="update t1 set username='东方' where id=1";
String sqlstr2="update t1 set username='章北海' where id=2";
PreparedStatement pstmt1=conn.prepareStatement(sqlstr1);
PreparedStatement pstmt2=conn.prepareStatement(sqlstr2);
pstmt1.executeUpdate();
int r=3/0;//删除掉此句即可成功执行事务;
pstmt2.executeUpdate();
conn.commit();//提交事务
} catch (SQLException throwables) {
try {
conn.rollback();//进行事务的回滚
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
db.close();
}
}
}

3.封装使用
3.1 简单封装(工具类)
package cn.sql.utils;
import java.sql.*;
/*实现将操作类进行封装*/
public class DButils {
private String user="root";
private String password="1234567";
private String database="test";
private String port="3306";
private String ipaddres="127.0.0.1";
private Connection conn=null;
private Statement statm=null;
private ResultSet rs=null;
private String sqlconnstr="";
private int res;
private PreparedStatement pstatm=null;
public DButils(){
//使用无参构造方法,直接使用默认变量的默认值构造数据库连接字符串;
sqlconnstr="jdbc:mysql://"+ipaddres+":"+port+"/"+database+"?serverTimezone=UTC";//注:?号后面的数据根据情况删除或保留
}
//地址端口数据库不同使用 此构造方法
public DButils(String database, String port, String ipaddres) {
this.database = database;
this.port = port;
this.ipaddres = ipaddres;
sqlconnstr="jdbc:mysql://"+this.ipaddres+":"+this.port+"/"+this.database+"?serverTimezone=UTC";//注:?号后面的数据根据情况删除或保留
}
//只有数据库不同的时候使用此构造方法
public DButils(String database) {
this.database = database;
sqlconnstr="jdbc:mysql://"+ipaddres+":"+port+"/"+this.database+"?serverTimezone=UTC";//注:?号后面的数据根据情况删除或保留
}
//使用不同地址,不同数据库的方法
public DButils(String ipaddres,String database){
this.database=database;
this.ipaddres=ipaddres;
sqlconnstr="jdbc:mysql://"+this.ipaddres+":"+port+"/"+this.database+"?serverTimezone=UTC";//注:?号后面的数据根据情况删除或保留
}
//获取连接对象
public Connection getConn(){
try {
//1.使用反射将字节码文件写入内存
Class .forName("com.mysql.jdbc.Driver");
//2.获取连接对象
conn= DriverManager.getConnection(sqlconnstr,user,password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e){
e.printStackTrace();
}
return conn;
}
public void close(){
if(rs!= null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(statm!= null){
try {
statm.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!= null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//获取Statement的对象
public Statement getStatm(){
conn=getConn();
try {
statm=conn.createStatement();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return statm;
}
//执行查询语句,获取查询结果的返回值
public ResultSet executQuery(String sqlstr){
statm=getStatm();
try {
rs=statm.executeQuery(sqlstr);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return rs;
}
//执行增删改语句
public int executUpdate(String sqlstr){
statm=getStatm();
try {
res=statm.executeUpdate(sqlstr);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return res;
}
public PreparedStatement getPstatm(String sql){
conn=getConn();
try {
pstatm=conn.prepareStatement(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return pstatm;//此时返回的对象可以自行使用设置参数方法;
}
}
简单测试
package cn.sql.demo; import cn.sql.utils.DButils; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestDButils { public static void main(String[] args) throws SQLException { DButils db= new DButils("testlearn"); String sqlstr="INSERT into student(sname,gender,class_id)VALUES('东方延续','女',3)"; int res=db.executUpdate(sqlstr); System.out.println(String.format("数据库成功插入了%s条数据",res )); String sqlstr2="select * from student"; ResultSet rs=db.executQuery(sqlstr2); while (rs.next()){ System.out.println(rs.getInt("sid")); System.out.println(rs.getString("sname")); System.out.println(rs.getString("gender")); } db.close(); PreparedStatement pstatm= db.getPstatm(sqlstr); pstatm.executeUpdate(); db.close(); } }
执行成功!
手敲不易,转载请注明出处;
边栏推荐
- Redis源码与设计剖析 -- 5.整数集合
- C language n battle -- linked list (IX)
- Concepts et différences de bits, bits, octets et mots
- Switch exchanges
- [information system project manager] Chapter VI recheck schedule management knowledge structure
- TS type gymnastics intermediate type gymnastics challenge closing battle
- Meyer burger Siemens industrial computer maintenance and machine tool maintenance
- 【达人专栏】还不会用Apache Dolphinscheduler吗,大佬用时一个月写出的最全入门教学【二】
- 6、重心坐标插值和图形渲染管线
- pyqt5使用QPainter绘制坐标轴并显示散点图
猜你喜欢

Meyer burger Siemens industrial computer maintenance and machine tool maintenance

【Anaconda 环境管理与包管理】

村田muRata电源维修交换机服务器电源维修及主要功能特点

【达人专栏】还不会用Apache Dolphinscheduler吗,大佬用时一个月写出的最全入门教学【二】

Detailed explanation of structure

Cadence (IX) 17.4 rules and spacing settings

pycharm占用c盘

海德堡CP2000电路板维修印刷机主机控制器操作及保养注意事项

Dynamic memory management

Redis source code and design analysis -- 9. String object
随机推荐
H1--HDMI接口测试应用2022-07-15
Detailed explanation of structure
使用pytorch实现基于VGG 19预训练模型的鲜花识别分类器,准确度达到97%
Compare the advantages and disadvantages of RDB and AOF modes of redis
Why does MySQL index use b+ tree?
讲师征集令 | Apache DolphinScheduler Meetup分享嘉宾,期待你的议题和声音!
QT style syntax definition access, can check the data, can be automatically generated
华为高层谈 35 岁危机,程序员如何破年龄之忧?
Redis source code and design analysis -- 12. Collection objects
Concepts et différences de bits, bits, octets et mots
Huck hurco industrial computer maintenance winmax CNC machine tool controller maintenance
FFmpeg 音频编码
Redis源码与设计剖析 -- 5.整数集合
Understand asp Net core - Cookie based authentication
又更新了, IDEA 2022.2 正式发布
图片模糊处理批量生产模糊数据集
Mysql-8.0.28 user operation or user permission Operation
IO should know and should know
疫情时期加中年危机——游荡在十字街口的三个月
Redis源码与设计剖析 -- 7.快速列表