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语句。