引言
有关数据库的概念,将数据库和java结合起来说明。
什么是JDBC?
使用java程序发送sql语句到数据库服务器端执行,这叫用到了JDBC技术!!!!jdbc是Oracle-Sun公司设计的一套专门用于java程序操作数据库的接口。
如下图所示:
使用jdbc发送sql条件
连接mysql数据库:
数据库主机
端口
数据库用户名
数据库密码
连接的数据库
* JDBC的核心API*
Driver接口: 数据库驱动程序的接口,所有具体数据库厂商需要的驱动程序需要实现此接口。
Connection connect(String url, Properties info) 用于获取数据库连接
演示三种连接数据库的方式
package com.jdbc.a_driver;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import com.mysql.jdbc.Driver;
public class DriverStu {
//jdbc协议:mysql协议://主机地址:端口号/需要连接的数据库名称
private static String url="jdbc:mysql://localhost:3306/day20";
private static String user="root";
private static String password="root";
public static void main(String[] args) throws Exception {
//conn1();
//conn2();
conn3();
}
private static void conn3() throws Exception {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//连接数据库
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
//com.mysql.jdbc.JDBC4Connection@6d17b6ce
}
private static void conn2() throws Exception {
//使用驱动管理类,连管理我们的驱动程序,并获取连接
//注册驱动
Driver driver = new Driver();
DriverManager.registerDriver(driver);
//获取链接
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
//com.mysql.jdbc.JDBC4Connection@44e5f21e
}
//直连
private static void conn1() throws Exception {
//创建一个驱动类对象Driver
Driver dri = new com.mysql.jdbc.Driver();
//获取java连接数据库的连接
//Connection connect(String url,Properties info)throws SQLException
//创建一个properties集合
Properties prop = new Properties();
prop.setProperty("user", user);
prop.setProperty("password", password);
Connection connect = dri.connect(url, prop);
System.out.println(connect);
//com.mysql.jdbc.JDBC4Connection@73b9e5dc
}
}
相关的运行结果在代码中有注释。
后面为了方便与数据库进行连接,可以将与数据库连接的代码部分提取出来形成一个工具类,每一次与数据库建立连接时,只需要调用该类中的方法即可,该工具类如下所示:
package com.jdbc.Util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtil {
private static String url="jdbc:mysql://localhost:3306/day20";
private static String user="root";
private static String password="root";
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取链接
public static Connection getConn(){
//注册驱动
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException();
}
}
//释放资源
public static void close(Connection conn,Statement stmt,ResultSet rs){
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Connection接口:与具体的数据库的连接对象。
Statement createStatement() 创建一个静态sql语句对象
PreparedStatement prepareStatement(String sql) 创建预编译的sql语句对象
CallableStatement prepareCall(String sql) 创建存储过程的sql语句对象
Statement接口:用于执行静态 SQL 语句
int executeUpdate(String sql) 执行更新操作的sql语句 (create/alter/drop) DDL语句
(insert/update/delete)DML语句
ResultSet executeQuery(String sql) 执行查询操作的sql语句(select)(DQL查询语句)
相关代码如下(静态sql语句)
package com.jdbc.b_statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import com.jdbc.Util.JDBCUtil;
public class Stu_02 {
private static String url="jdbc:mysql://localhost:3306/day20";
private static String user="root";
private static String password="root";
public static void main(String[] args) {
//testInsert();//给数据库加入一条记录
//testUpdate();//修改数据库的记录
testDelet();//删除一条记录
}
private static void testDelet() {
Connection conn=null;
Statement stmt=null;
try{
//注册驱动,获取链接
conn = JDBCUtil.getConn();
//获取语句执行者
stmt = conn.createStatement();
//准备sql语句
String sql="DELETE FROM student WHERE id=1;";
//执行sql语句
int i = stmt.executeUpdate(sql);
System.out.println(i);
//1
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
}
}
private static void testUpdate() {
Connection conn=null;
Statement stmt=null;
try{
//获取链接
conn = JDBCUtil.getConn();
//获取语句执行着
stmt = conn.createStatement();
//准备sql
String sql="UPDATE student SET NAME='黄晓明' WHERE id=1;";
//执行sql语句
int i = stmt.executeUpdate(sql);
System.out.println(i);//1
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
JDBCUtil.close(conn, stmt, null);
}
}
private static void testInsert() {
Connection conn=null;
Statement stmt=null;
//注册驱动
try {
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
conn = DriverManager.getConnection(url, user, password);
//创建语句执行者
stmt = conn.createStatement();
//准备sql
String sql="INSERT INTO student VALUES(1,'薛之谦');";
//执行sql语句
int i = stmt.executeUpdate(sql);
System.out.println(i);//1
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放资源
if (conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
其中有关运行结果在代码中有注释
PreparedStatement接口:用于执行预编译的 SQL 语句(是Statement的子接口)
int executeUpdate() 执行更新操作的sql语句
ResultSet executeQuery() 执行查询操作的sql语句
ResultSet接口:结果集对象。 存储所有数据库查询的结果,用该对象进行数据遍历。
boolean next() : 把光标移动到下一行。如果下一行有数据,返回true,如果没有下一行数据,返回false。
getXXX(列索引|列字段名称): 获取字段的数据
相关代码如下(动态sql语句,在这里主要介绍静态语句中所不具备的select操作)
package com.jdbc.c_preparedstatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.jdbc.Util.JDBCUtil;
public class Stu_01 {
public static void main(String[] args) {
testSelect();
}
private static void testSelect() {
Connection conn=null;
PreparedStatement stmt=null;
ResultSet rs=null;
try{
//获取链接
conn = JDBCUtil.getConn();
//准备sql语句
String sql="SELECT *FROM student WHERE id=?;";
//预编译sql语句
stmt = conn.prepareStatement(sql);
//设置参数
stmt.setInt(1, 1);
//执行sql语句
rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id")+"--"+rs.getString("name"));//1--薛之谦
}
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
JDBCUtil.close(conn, stmt, rs);
}
}
结果在代码中显示
Statement和PreparedStatement的区别
一、语法结构不同
1)Statment执行静态sql语句,且sql可以拼接。
2)PreparedStatement可以先执行预编译的sql语句,在预编译sql语句中使用?进行参数占位,后面再进行参数赋值
二、原理不同
1)Statement不能进行sql缓存
2)而PreparedStatement可以进行sql缓存,执行效率会比Statement快!!!
三、安全性不同
1)Statement存在sql注入的风险(使用登录注册讲解sql注入)
2)而PreparedStatement可以有效防止用户注入。
CallableStatement接口:用于执行 SQL 存储过程的接口(是PreparedStatement的子接口)
ResultSet executeQuery() 执行存储过程的sql语句
package com.jdbc.d_callablestatement;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.jdbc.Util.JDBCUtil;
public class Stu {
public static void main(String[] args) {
testIn();
//testOut();
}
private static void testOut() {
Connection conn=null;
CallableStatement stmt=null;
ResultSet rs=null;
try{
conn = JDBCUtil.getConn();
String sql="CALL pro_testOut(?);";
stmt =conn.prepareCall(sql);
stmt.registerOutParameter(1, java.sql.Types.VARCHAR);
stmt.executeQuery();
System.out.println(stmt.getString(1));
//我是输出参数
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtil.close(conn, stmt, rs);
}
}
private static void testIn() {
Connection conn=null;
PreparedStatement stmt=null;
ResultSet rs=null;
try{
conn = JDBCUtil.getConn();
String sql="CALL pro_testIn(?);";
stmt = conn.prepareStatement(sql);
stmt.setInt(1, 2);
rs = stmt.executeQuery();
if (rs.next()) {
System.out.println(rs.getInt("id")+"--"+rs.getString("name"));
//2--方大同
}
}catch(Exception e){
e.printStackTrace();
}finally{
JDBCUtil.close(conn, stmt, rs);
}
}
}
相关运行结果在代码中注释