> 文章列表 > JDBC编程

JDBC编程

JDBC编程

目录

概念

JDBC示例

JDBC API

1.DriverManager

2.Connection

3.Statement

4.ResultSet

 5.PreparedStatement

数据库连接池

DataSource

Druid


概念

        JDBC全称Java DataBase Connectivity (java数据库连接),是一套操作关系型数据库的javaAPI。

        数据库驱动jar包:JDBC接口的实现类,由数据库厂商实现。

意义:

        面向接口编程,java代码不需要针对不同的数据库分别开发。

        在更换底层数据库时,也不需要大量更改代码。

JDBC示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;public class Main {public static void main(String[] args) throws Exception{//1.注册驱动//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略//2.获取连接//String url="jdbc:mysql://127.0.0.1:3306/mybase";//本机的mysql且端口为默认3306,可简写String url="jdbc:mysql:///mybase";String username="root";String password="111111";Connection conn=DriverManager.getConnection(url,username,password);//3.定义SQLString sql="update student set age=18 where name='wj'";//4.获取执行sql的对象 StatementStatement stmt=conn.createStatement();//5.执行sqlint count=stmt.executeUpdate(sql);//6.处理结果System.out.println(count);//7.释放资源stmt.close();//先conn.close();//后}
}

JDBC API

1.DriverManager

        驱动管理类        工具类,全是静态方法

作用:

        1.注册驱动

static void registDriver(Driver driver)

#Driver类中静态代码块中调用了该方法。        

        2.获取数据库连接

static Connection getConnection(String url,String user,String password)

 String url="jdbc:mysql://127.0.0.1:3306/mybase";

url: jdbc:mysql://ip地址或域名:端口号/数据库名称?参数键值对1&参数键值对2...

        连接本机mysql服务器,并且服务器默认端口3306,可简写。

2.Connection

        与特定的数据库连接,执行SQL语句并在连接的上下文返回结果

作用:

        1.获取执行SQL的对象

i.普通执行SQL对象  Statement createStatement()

ii.预编译SQL的执行SQL对象:防止SQL注入  PreparedStatement preparedStatement(sql)

iii.执行存储过程的对象  CallableStatement prepareCall(sql)

        2.管理事务

i.开启事务  setAutoCommit(boolean autoCommit);//true为自动提交,false手动

ii.提交事务  commit();

iii.回滚事务  rollback()

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class connection {public static void main(String[] args) throws Exception{//1.注册驱动//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略//2.获取连接//String url="jdbc:mysql://127.0.0.1:3306/mybase";//本机的mysql且端口为默认3306,可简写String url="jdbc:mysql:///mybase";String username="root";String password="111111";Connection conn= DriverManager.getConnection(url,username,password);//3.定义SQLString sql1="update student set age=20 where name='wj'";//check约束,0--100String sql2="update student set sex='男' where name='wj'";//有check约束,只能说男/女//4.获取执行sql的对象 StatementStatement stmt=conn.createStatement();//5.执行sql//6.处理结果try {conn.setAutoCommit(false);int count1=stmt.executeUpdate(sql1);System.out.println(count1);int count2=stmt.executeUpdate(sql2);System.out.println(count2);conn.commit();} catch (SQLException e) {conn.rollback();throw new RuntimeException(e);}//7.释放资源stmt.close();//先conn.close();//后}
}

3.Statement

作用:执行SQL语句

执行DML和DDL语句  int executeUpdate(sql);

                                   //DML语句返回影响的行数,DDL执行成功有可能返回0

执行DQL语句        ResultSet executeQuery(sql);//返回ResultSet结果集对象

4.ResultSet

        结果集对象  封装了DQL查询语句的结果

ResultSet stmt.executeQuery(sql);//返回ResultSet结果集对象

获取查询结果

  1. boolean next();//将光标下移,判断是否为有效行
  2. xxx getXxx(参数);//参数为:列号(从1开始)或列名;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class resultset {public static void main(String[] args) throws Exception{//1.注册驱动//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略//2.获取连接//String url="jdbc:mysql://127.0.0.1:3306/mybase";//本机的mysql且端口为默认3306,可简写String url="jdbc:mysql:///mybase";String username="root";String password="111111";Connection conn= DriverManager.getConnection(url,username,password);//3.定义SQLString sql="select * from student";//4.获取执行sql的对象 StatementStatement stmt=conn.createStatement();//5.执行sqlResultSet rs=stmt.executeQuery(sql);//6.处理结果//6.1光标向下移动while(rs.next()){//6.2 获取数据 getXxx()int id=rs.getInt(1);String name=rs.getString(2);int age=rs.getInt(3);String sex=rs.getString(4);String address=rs.getString(5);System.out.println(id);System.out.println(name);System.out.println(age);System.out.println(sex);System.out.println(address);System.out.println("-------------");}//7.释放资源stmt.close();//先conn.close();//后}
}

 5.PreparedStatement

        继承自Statement

作用:预编译SQL语句并执行:预防SQL注入

SQL注入:通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。

        String name="' or '1'='1";System.out.println(name);//3.定义SQLString sql="update student set age=18 where name='"+name+"'";

 通过操作name,使得where语句恒为true

PreparedStatement的使用:

1.sql语句中的参数值用占位符?替代  where name = ?

2.获取PreparedStatement对象  PreparedStatement pstmt=conn.preparedStatement(sql);

3.设置参数  pstmt.setXxx(参数1,参数2);//给?赋值。

        Xxx为数据类型,参数1为?的位置从1开始,参数2为?的值

4.执行SQL  pstmt.executeUpdate();或executeQuery();  不需要传参

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;public class preparedStatement {public static void main(String[] args) throws Exception{//1.注册驱动//Class.forName("com.mysql.jdbc.Driver");//加载类,8.0可以省略//2.获取连接//String url="jdbc:mysql://127.0.0.1:3306/mybase";//本机的mysql且端口为默认3306,可简写String url="jdbc:mysql:///mybase?&uesServerPrepStmts=true";String username="root";String password="111111";Connection conn= DriverManager.getConnection(url,username,password);//3.定义SQLString sql="update student set age=8 where name=?";//4.获取执行sql的对象PreparedStatement pstmt=conn.prepareStatement(sql);//给?赋值pstmt.setString(1,"wj");//5.执行sqlint count=pstmt.executeUpdate();//6.处理结果System.out.println(count);//7.释放资源pstmt.close();//先conn.close();//后}
}
String url="jdbc:mysql:///mybase?&uesServerPrepStmts=true";
uesServerPrepStmts=true开启预编译功能

预编译,性能更高

 相同模板的sql,只需要进行一次检查和编译

数据库连接池

        一个容器,负责分配、管理数据库连接

        应用程序从连接池里面取出现有的数据库连接,不需要重新建立一个(资源再用,提高速度)

        还会释放空闲时间过长的连接,避免遗漏

DataSource

        数据库连接池接口,由厂商实现

Druid

        德鲁伊数据库连接池

配置文件

#druid????
driverClassName = com.mysql.jdbc.Driver
#url
url=jdbc:mysql://127.0.0.1:3306/mybase?&uesServerPrepStmts=true
username=root
password=111111
#初始化连接数
initialSize = 5
#最大连接数
maxActive = 10
#最大等待时间
maxWait = 3000
import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Properties;public class druid {public static void main(String[] args) throws Exception{//1.导入jar包druid//2.定义配置文件druid.properties//3.加载配置文件Properties prop=new Properties();prop.load(new FileInputStream("src/druid.properties"));//4.获取连接池对象DataSource dataSource= DruidDataSourceFactory.createDataSource(prop);//5.获取数据库连接Connection conn= dataSource.getConnection();System.out.println(conn);//System.out.println(System.getProperty("user.dir"));}
}