JDBC链接
一、JDBC简介:
JDBC是一个接口集合(JDBC API),一个链接并且操作数据库的准则(设计标准),它封装了对数据库进行链接及操作的一些方法,数据库厂商可以根据这个API及其相应的数据库协议编写相应的数据库驱动,通过这个驱动程序员可以运用JAVA语言对数据库进行操作。同时JDBC提供了一套简单的管理机制驱动管理器,管理第三方驱动程序向驱动管理器注册。
思想:根据API编写的程序都可以与驱动管理器进行通信,而驱动管理器通过驱动程序与实际数据库进行通信。
二、JDBC分类
第一类:JDBC/ODBC桥(不常用),驱动将JDBC翻译成ODBC,然后使用一个ODBC驱动程序与数据库进行通信。
第二类:驱动程序由部分Java代码(类库)和本地代码组成(与平台相关),用于与数据库的客户端API进行通信。(不常用)
第三种:驱动将一种与数据库无关的协议发送到服务器,通过服务器将请求转换成数据库相关的协议。
第四种:驱动程序是纯Java类库,将JDBC请求直接翻译成数据库相关的协议。(最常用)
目的:降低数据库使用者和数据库开发者之间的耦合。
三、连接方法
①直接连接
manager类:
package testJDBC; /** * @date:2017/11/26 * @time:19:53 */ public class Manager { private String name; private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "姓名:" + name +" "+ "密码" + password; } }
连接
package testJDBC; import java.sql.*; /** * @date:2017/11/26 * @time:15:39 * 功能:普通方法链接数据库 */ public class TJDBC { public static void main(String[] args) throws Exception { Manager manager = new Manager(); String result = null; Class.forName("com.mysql.jdbc.Driver"); //注册驱动程序 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/student", "root","123456"); //连接到数据库 Statement stat = connection.createStatement(); //得到活动,可同时创建一个或者多个,有些数据库只可创建一个 String si = "insert manager values('wang','0123');"; String sd = "delete from manager where username = 'yuang';"; String su = "update manager set username = 'yuang';"; stat.executeUpdate(sd); //删除数据库中的数据 stat.executeUpdate(si); //向数据库中从插入数据 stat.executeUpdate(su); //更新数据库的信息 String sm = "select * from manager;"; ResultSet rs = stat.executeQuery(sm); //得到查询返回集 //ResultSet rs1 = stat.executeQuery(sm); //一个statement对象只能有一个结果集 while (rs.next()){ manager.setName(rs.getString("username")); manager.setPassword(rs.getString("password")); result = manager.toString(); System.out.println(result); } connection.close(); //使用完之后应该立即关闭,可以放在带资源的try块中 stat.close(); rs.close(); } }
②读取配置文件
配置文件database.properties
jdbc.drivers com.mysql.jdbc.Driver jdbc.url jdbc:mysql://localhost:3306/student jdbc.username root jdbc.password 123456
连接数据库
package testJDBCExecSql; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class DAO { private static InputStream in = null; private static Properties pope = new Properties(); //读取数据库配置文件 private static Connection conn = null; //获得连接 public static Connection getConnectoin() { try { in = Files.newInputStream(Paths.get("E:\\IdeaWorkSpace\\database.properties")); pope.load(in); String driver = pope.getProperty("jdbc.drivers"); String url = pope.getProperty("jdbc.url"); String username = pope.getProperty("jdbc.username"); String password = pope.getProperty("jdbc.password"); conn = DriverManager.getConnection(url, username, password); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static void closeConnecton() { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
注:注册数据库驱动有两种方法,上面例子介绍了最常用的方法。
第二种方法:System.setProperty("com.mysql.jdbc.Driver");
这种方法可以提供多个数据库驱动,中间用“,”隔开。
四、操作数据库
①常规方法:
package testJDBCExecSql; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.sql.*; import java.util.Properties; /** * @date:2017/11/27 * @time:12:07 * 功能:通过配置文件链接数据库 * 功能:通过配置文件链接数据库,普通方法对数据库进行操作 */ public class ExecSQL { public static void main(String[] args){ ManagerS manager = null; // Properties props = new Properties(); //读取java的配置文件, Connection conn = null; String result = null; Statement stat = null; //得到活动,可同时创建一个或者多个,有些数据库只可创建一个 ResultSet rs = null; String si = "insert manager values('wang','0123');"; String sd = "delete from manager where username = 'yuang';"; String su = "update manager set username = 'yuang';"; try (InputStream in = Files.newInputStream( //应用文件存储连接数据库的信息,然后读取数据库.相对路径默认是工程路径 Paths.get("src\\testJDBCExecSql\\database.properties") )){ // props.load(in); //从流中读取键值对 // // String drivers = props.getProperty("jdbc.drivers"); //通过键值获取相应的数据 // // if(drivers != null) // Class.forName(drivers); //注册数据库驱动 // // // String url = props.getProperty("jdbc.url"); //获取连接url // String username = props.getProperty("jdbc.username"); //获取用户名 // String password = props.getProperty("jdbc.password"); //获取密码 // conn = DriverManager.getConnection(url,username,password); //连接数据库 // // System.out.println(drivers); //将数据库连接的基本数据输出 // System.out.println(url); // System.out.println(username); // System.out.println(password); conn = DAO.getConnectoin(); stat = conn.createStatement(); stat.executeUpdate(sd); //删除数据库中的数据 stat.executeUpdate(si); //向数据库中从插入数据 stat.executeUpdate(su); //更新数据库的信息 String sm = "select * from manager;"; rs = stat.executeQuery(sm); //得到查询返回集 //ResultSet rs1 = stat.executeQuery(sm); //一个statement对象只能有一个结果集 while (rs.next()){ manager = new ManagerS(); //刚才忘了定义所以报错,空指针 manager.setName(rs.getString("username")); manager.setPassword(rs.getString("password")); result = manager.toString(); System.out.println(result); // manager.setName(rs1.getString("username")); // manager.setPassword(rs1.getString("password")); // result = manager.toString(); // System.out.println(result); } } catch (IOException e) { System.out.println("找不到文件"); } catch (SQLException e1) { System.out.println("数据库异常"); } finally { try { conn.close(); //使用完之后应该立即关闭,可以放在带资源的try块中 stat.close(); rs.close(); } catch (SQLException e) { System.out.println("关闭失败"); } } } }
②预处理方式
package testJDBCExecSql; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.sql.*; import java.util.Properties; import java.util.Scanner; /** * @date:2017/11/27 * @time:16:52 * * 功能:通过配置文件链接数据库,同时通过预备查询,来查询数据 */ public class Prepared { public static void main(String[] args){ Properties pops = new Properties(); Connection conn = null; int stuno = 0; Scanner s = new Scanner(System.in); PreparedStatement pstat = null; try { conn = DAO.getConnectoin(); String select = "select stuno,stuname,stusex from t_student where stuno = ? "; //预定义的查询语句 pstat = conn.prepareStatement(select); //得到一个活动 System.out.println("请输入学生学号(如:001):"); pstat.setString(1,s.nextLine()); //根据宿主变量的序号来绑定宿主变量的值,宿主变量的值一旦绑定就会存在, //除非调用clearParameters 来清空或者重新绑定新的值 ResultSet rs = pstat.executeQuery(); while (rs.next()){ System.out.print("姓名:"+rs.getString("stuname") + " "); System.out.println("性别:"+rs.getString("stusex")); } } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); pops.clear(); pstat.close(); } catch (SQLException e) { e.printStackTrace(); } } } }注:一个Connection对象可以创建一个或者多个Statement对象,但是一个Statement对象,只能有一个打开的结果集。使用完这些链接资源之后必须及时的关闭。
预处理语句在涉及到变量的时候应用,一般不用,相应的查询被预备两次,数据库通常会直接重用查询策略。
能用sql解决不用java语句。