JDBC学习
JDBC学习
1.介绍
1.1 概念
jdbc:Java DataBase Connectivity
java,数据库连接,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(); } }
-
执行成功!
手敲不易,转载请注明出处;