jdbc基础
1、什么是jdbc
sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来同一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了
2、使用jbdc发送sql的前提
登录数据库服务器(连接数据库服务器)
数据库的IP地址
端口
数据库用户名
密码
3、使用jdbc连接数据的步骤
1.注册数据库驱动
DriverManager.registerDriver(new Driver());//缺点一:观察mysqlDriver源码发现此方法导致了数据库驱动被注册了两次。缺点二:整个程序域mysql数据库驱动绑定增加了耦合性
Class.forName(“com.mysql.jdbc.Driver”);
2.获取连接
DriverManager.getConnection(url, user, password);
~url的写法:
Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
SqlServer—jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
MySql—jdbc:mysql://localhost:3306/sid
~url可以接的参数
user、password
useUnicode=true&characterEncoding=UTF-8
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day10", "root", "root");
3.获取传输器
createStatement():创建向数据库发送sql的statement对象。
prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
Statement stat = conn.createStatement();
4.利用传输器执行sql语句获取结果集
executeQuery(String sql) :用于向数据发送查询语句。
executeUpdate(String sql):用于向数据库发送insert、update或delete语句
execute(String sql):用于向数据库发送任意sql语句
ResultSet rs = stat.executeQuery("select * from user");
5.遍历结果集取出结构
ResultSet以表的样式在内存中保存了查询结果,其中还维护了一个游标,最开始的时候游标在第一行之前,每调用一次next()方法就试图下移一行,如果移动成功返回true;
ResultSet还提供了很多个Get方法,用来获取查询结果中的不同类型的数据
除了next方法,还有以下方法可以用来遍历结果集:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
while(rs.next()){
String name = rs.getString("name");
System.out.println(name);
}
6.释放资源
conn是一个有限的资源,用完立即要释放表
stat占用内存,所以使用完后也要释放
rs占用内存,所以使用完后也要释放
释放时后创建的先释放
rs.close();
stat.close();
conn.close();
4、jdbc接口的核心api
java.sql.* 和 javax.sql.*
|- Driver接口: 表示java驱动程序接口。所有的具体的数据库厂商要来实现此接口。
|- connect(url, properties): 连接数据库的方法。
url: 连接数据库的URL
URL语法: jdbc协议:数据库子协议://主机:端口/数据库
user: 数据库的用户名
password: 数据库用户密码
|- DriverManager类: 驱动管理器类,用于管理所有注册的驱动程序
|-registerDriver(driver) : 注册驱动类对象
|-Connection getConnection(url,user,password); 获取连接对象
|- Connection接口: 表示java程序和数据库的连接对象。
|- Statement createStatement() : 创建Statement对象
|- PreparedStatement prepareStatement(String sql) 创建PreparedStatement对象
|- CallableStatement prepareCall(String sql) 创建CallableStatement对象
|- Statement接口: 用于执行静态的sql语句
|- int executeUpdate(String sql) : 执行静态的更新sql语句(DDL,DML)
|- ResultSet executeQuery(String sql) :执行的静态的查询sql语句(DQL)
|-PreparedStatement接口:用于执行预编译sql语句
|- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML)
|-ResultSet executeQuery() : 执行预编译的查询sql语句(DQL)
|-CallableStatement接口:用于执行存储过程的sql语句(call xxx)
|-ResultSet executeQuery() : 调用存储过程的方法
|- ResultSet接口:用于封装查询出来的数据
|- boolean next() : 将光标移动到下一行
|-getXX() : 获取列的值
5、jdbc链接数据库的比较
import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.util.Properties; import org.junit.Test; /** * jdbc连接数据库 * * */ public class Demo1 { //连接数据库的URL private String url = "jdbc:mysql://localhost:3306/day17"; // jdbc协议:数据库子协议:主机:端口/连接的数据库 // private String user = "root";//用户名 private String password = "root";//密码 /** * 第一种方法 * @throws Exception */ @Test public void test1() throws Exception{ //1.创建驱动程序类对象 Driver driver = new com.mysql.jdbc.Driver(); //新版本 //Driver driver = new org.gjt.mm.mysql.Driver(); //旧版本 //设置用户名和密码 Properties props = new Properties(); props.setProperty("user", user); props.setProperty("password", password); //2.连接数据库,返回连接对象 Connection conn = driver.connect(url, props); System.out.println(conn); } /** * 使用驱动管理器类连接数据库(注册了两次,没必要) * @throws Exception */ @Test public void test2() throws Exception{ Driver driver = new com.mysql.jdbc.Driver(); //Driver driver2 = new com.oracle.jdbc.Driver(); //1.注册驱动程序(可以注册多个驱动程序) DriverManager.registerDriver(driver); //DriverManager.registerDriver(driver2); //2.连接到具体的数据库 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); } /** * (推荐使用这种方式连接数据库) * 推荐使用加载驱动程序类 来 注册驱动程序 * @throws Exception */ @Test public void test3() throws Exception{ //Driver driver = new com.mysql.jdbc.Driver(); //通过得到字节码对象的方式加载静态代码块,从而注册驱动程序 Class.forName("com.mysql.jdbc.Driver"); //Driver driver2 = new com.oracle.jdbc.Driver(); //1.注册驱动程序(可以注册多个驱动程序) //DriverManager.registerDriver(driver); //DriverManager.registerDriver(driver2); //2.连接到具体的数据库 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); } }
一个优化后的完整代码
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo1 { private String url = "jdbc:mysql://localhost:3306/mydata"; private String user = "root"; private String password = "root"; @Test public static void main(String[] args){ Connection conn = null; Statement stat = null; ResultSet rs = null; try{ //1.注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); /*//2.获取数据库连接 conn = DriverManager.getConnection("jdbc:mysql:///mydata?user=root&password=root");*/ //2.获取连接对象,上面一种方法也可以 conn = DriverManager.getConnection(url, user, password); //3.获取传输器对象 stat = conn.createStatement(); //4.利用传输器传输sql语句到数据库中执行,获取结果集对象 rs = stat.executeQuery("select * from user"); //5.遍历结果集获取查询结果 while(rs.next()){ String name = rs.getString("name"); System.out.println(name); } }catch (Exception e) { e.printStackTrace(); }finally{ //6.关闭资源(顺序:后打开的先关闭) if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ rs = null; } } if(stat!=null){ try { stat.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ stat = null; } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ conn = null; } } } } }
使用工具类优化后的代码
1、配置文件db.properties 放在src下
url=jdbc:mysql://localhost:3306/maydata user=root password=root driverClass=com.mysql.jdbc.Driver
2、工具类
/** * jdbc工具类 * * */ public class JdbcUtils { private static String url = null; private static String user = null; private static String password = null; private static String driverClass = null; /** * 静态代码块中(只加载一次) */ static{ try { //读取db.properties文件 Properties props = new Properties(); /** * . 代表java命令运行的目录 * 在java项目下,. java命令的运行目录从项目的根目录开始 * 在web项目下, . java命令的而运行目录从tomcat/bin目录开始 * 所以不能使用点. */ //FileInputStream in = new FileInputStream("./src/db.properties"); /** * 使用类路径的读取方式 * / : 斜杠表示classpath的根目录 * 在java项目下,classpath的根目录从bin目录开始 * 在web项目下,classpath的根目录从WEB-INF/classes目录开始 */ InputStream in = JdbcUtil.class.getResourceAsStream("/db.properties"); //加载文件 props.load(in); //读取信息 url = props.getProperty("url"); user = props.getProperty("user"); password = props.getProperty("password"); driverClass = props.getProperty("driverClass"); //注册驱动程序 Class.forName(driverClass); } catch (Exception e) { e.printStackTrace(); System.out.println("驱程程序注册出错"); } } /** * 抽取获取连接对象的方法 */ public static Connection getConn(){ try { Connection conn = DriverManager.getConnection(url, user, password); return conn; } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 释放资源的方法 */ public static void close(ResultSet rs, Statement stat,Connection conn){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ rs = null; } } if(stat!=null){ try { stat.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ stat = null; } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ conn = null; } } } }
3、使用工具类的实现数据的CRUD
public class JDBCDemo2 { @Test public void add() { Connection conn = null; Statement stat = null; try { // 1.注册数据库驱动 // 2.获取连接 conn = JDBCUtils.getConn(); // 3.获取传输器对象 stat = conn.createStatement(); // 4.执行sql语句 int count = stat.executeUpdate("insert into user values (null,'zhaoliu','123456','zhaoliu@qq.com','1999-09-09')"); // 5.处理结果 if (count > 0) { System.out.println("执行成功!影响到的行数为" + count); } else { System.out.println("执行失败!!"); } } catch (Exception e) { e.printStackTrace(); } finally { //6.关闭资源 JDBCUtils.close(null, stat, conn); } } } @Test public void delete(){ Connection conn = null; Statement stat = null; ResultSet rs = null; try{ conn = JDBCUtils.getConn(); stat = conn.createStatement(); stat.executeUpdate("delete from user where name='zhaoliu'"); }catch (Exception e) { e.printStackTrace(); }finally{ JDBCUtils.close(rs, stat, conn); } } @Test public void find(){ Connection conn = null; Statement stat = null; ResultSet rs = null; try{ conn = JDBCUtils.getConn(); stat = conn.createStatement(); rs = stat.executeQuery("select * from user where name='zhaoliu'"); while(rs.next()){ String name = rs.getString("name"); String password = rs.getString("password"); System.out.println(name+":"+password); } }catch (Exception e) { e.printStackTrace(); }finally{ JDBCUtils.close(rs, stat, conn); } } @Test public void update() { Connection conn = null; Statement stat = null; try{ conn = JDBCUtils.getConn(); stat = conn.createStatement(); stat.executeUpdate("update user set password=999 where name='zhaoliu'"); }catch (Exception e) { e.printStackTrace(); }finally{ JDBCUtils.close(null, stat, conn); } }