您的位置:首页 > 编程语言

JDBC编程基础

2017-06-08 18:36 399 查看

jdbc基本概念

jdbc是java database connection,即java数据库连接,是java操作数据库的接口。

在只有数据库服务器和客户端的情况下,我们只能使用客户端连接到MySQL服务器,然后发送sql语句到MySQL服务器进行执行,返回结果。

现在,需要在一定的背景下操作数据库,这就用到了java操作数据库。

使用jdbc发送sql语句到Mysql服务器,需要连接到MySQL数据库,需要以下信息:

1. 数据库主机

2. 端口号

3. 数据库用户名

4. 数据库密码

5. 连接的数据库名字

这里数据库主机就使用本台电脑,为localhost,端口号为MySQL默认端口,3306,用户名为root,密码为root。

JDBC的核心API

MySql数据库实现了一个接口,使java编程人员可以使用该接口连接MySQL连接数据库,并进行相关操作。

1. Driver接口:

数据库驱动程序的接口,所有具体数据库厂商需要的驱动程序需要实现此接口。

Connection connect(String url, Properties info)  用于获取数据库连接


2. Connection接口:与具体的数据库的连接对象。

Statement createStatement()    创建一个静态sql语句对象

PreparedStatement prepareStatement(String sql)  创建预编译的sql语句对象

CallableStatement prepareCall(String sql)   创建存储过程的sql语句对象


3. Statement接口:用于执行静态 SQL 语句

int executeUpdate(String sql)  执行更新操作的sql语句
(create/alter/drop) DDL语句
(insert/update/delete)DML语句

ResultSet executeQuery(String sql)  执行查询操作的sql语句
(select)(DQL查询语句)


3.1 PreparedStatement接口:用于执行预编译的 SQL 语句(是Statement的子接口)

int executeUpdate()  执行更新操作的sql语句
ResultSet executeQuery()  执行查询操作的sql语句


3.1.1 CallableStatement接口:用于执行 SQL 存储过程的接口(是PreparedStatement的子 接口)

ResultSet executeQuery()  执行存储过程的sql语句


4. ResultSet接口:结果集对象。 存储所有数据库查询的结果,用该对象进行数据遍历。

boolean next() :开始值为-1,在第一行的前面。 把光标移动到下一行。如果下一行有数据,返回true,如果没有下一行数据,返回false。
getXXX(列索引|列字段名称): 获取字段的数据


java连接数据

代码如下:

package com.wy.jdbcpac;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JDBCTest1 {
public static void main(String[] args) throws Exception {
/*使用三种方法分别测试连接数据库是否成功;
* 成功返回Connection
*/
//openConnection1();
//openConnection2();
openConnection3();
}
private static void openConnection3() throws Exception {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "root";
//使用驱动管理
/*DriverManager中的方法:
* public static Connection getConnection(String url,String user,String password)
*                      throws SQLException
*/
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}

private static void openConnection2() throws Exception {
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "root";
Driver driver = new com.mysql.jdbc.Driver();
//需要注册driver
DriverManager.registerDriver(driver);
/*
* DriverManager类的方法:
* public static Connection getConnection(String url,
* String user, String password) throws SQLException;
*/
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}

private static void openConnection1() throws SQLException {
//直接连接数据库
Driver driver = new com.mysql.jdbc.Driver();
String url = "jdbc:mysql://localhost:3306/testdb";
Properties prop = new Properties();
prop.put("user", "root");
prop.put("password","root");
/*Driver类的一个方法
* Connection connect(String url, java.util.Properties info)throws SQLException;
*/
Connection conn = driver.connect(url, prop);
System.out.println(conn);
}
}


在实际开发中,一般使用上面的第三种方法,因此,现在使用第三种方法建立一个工具类,以便后面连接数据库使用。

package com.wy.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/testdb";
private static String user = "root";
private static String password = "root";
private static Connection conn = null;
private static Statement stmt = null;

public static Connection getConn(){
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,user,password);

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}

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();
}
}
}
}


Statement 接口示例

package com.wy.statement;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.wy.util.JDBCUtil;

public class StatementTest {
public static void main(String[] args) {
//当执行完之后,可以在testdb数据库中进行查看
stmtCreateTest();
//stmtUpdateTest();
//stmtSelectTest();
//stmtDeleteTest();

}

private static void stmtCreateTest() {
Connection conn = null;
Statement stmt = null;

conn = JDBCUtil.getConn();
try {
stmt = conn.createStatement();
//创建sql语句
String sql = "CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20),age INT);";
//执行结果是影响的行数,这里是创建,返回结果应该是0;
int count = stmt.executeUpdate(sql);
System.out.println(count);
//d
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn, stmt, null);
}
}

private static void stmtUpdateTest() {
/*
* 更新操作包括DDL,DML
* DDL是创建数据库
* DML是数据库管理语言,包括插入,删除,更新,这里只选择了插入数据更新数据库
*/
Connection conn = null;
Statement stmt = null;

conn = JDBCUtil.getConn();
try {
stmt = conn.createStatement();
String sql = "INSERT INTO student VALUES(1,'xcc',12);";
//影响的行数为1,返回结果为1;
int count = stmt.executeUpdate(sql);
System.out.println(count);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn, stmt, null);
}

}

private static void stmtSelectTest() {
Connection conn = null;
Statement stmt = null;

conn = JDBCUtil.getConn();
try {
stmt = conn.createStatement();
String sql = "SELECT * FROM student;";
//查询结果返回一个结果集
ResultSet rs = stmt.executeQuery(sql);
//将结果集中的数据打印到控制台
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
int age = rs.getInt(3);
System.out.println("id:" + id + ",name :" + name + ",age:" + age);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

private static void stmtDeleteTest() {
Connection conn = null;
Statement stmt = null;

conn = JDBCUtil.getConn();
try {
stmt = conn.createStatement();
String sql = "DELETE FROM student WHERE id=1;";
//影响的结果为1,返回1
int count = stmt.executeUpdate(sql);
System.out.println(count);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtil.close(conn, stmt, null);
}
}
}


PreparedStatement 接口示例

package com.wy.prepared;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.wy.util.JDBCUtil;

public class PreparedTest {
public static void main(String[] args) {
//preparedInsertTest();
//preparedUpdateTest();
//preparedSelectTest();
preparedDeleteTest();
}

private static void preparedInsertTest() {
Connection conn = JDBCUtil.getConn();
PreparedStatement pstmt = null;
String sql = "insert into student(name,age) values(?,?)";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "aaa");
pstmt.setInt(2, 45);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.close(conn, pstmt, null);
}
}

private static void preparedUpdateTest() {
Connection conn = JDBCUtil.getConn();
PreparedStatement pstmt = null;
String sql = "UPDATE student SET NAME = 'newname' WHERE id = ?;";
try {
//给?号赋值
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 2);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.close(conn, pstmt, null);
}
}

private static void preparedSelectTest() {
Connection conn = JDBCUtil.getConn();
PreparedStatement pstmt = null;
String sql = "SELECT * FROM student WHERE id = ?;";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 2);
ResultSet rs = pstmt.executeQuery();
//因为这里只有一行数据,所以直接使用if语句
if(rs.next()){
int id= rs.getInt(1);
String name = rs.getString(2);
int age = rs.getInt(3);
System.out.println("id :"+id+",name:"+name+",age:"+age);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.close(conn, pstmt, null);
}
}

private static void preparedDeleteTest() {
Connection conn = JDBCUtil.getConn();
PreparedStatement pstmt = null;
String sql = "DELETE FROM student WHERE NAME=?;";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "newname");
int count = pstmt.executeUpdate();
System.out.println(count);

} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.close(conn, pstmt, null);
}
}
}


CallableStatement 接口示例

package com.wy.callable;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

import com.wy.util.JDBCUtil;

public class CallableTest {

public static void main(String[] args) {
in_outTest();
}
private static void in_outTest() {
//首先在数据库中创建一个存储过程
/*
* DELIMITER $
* CREATE PROCEDURE pro_QueryNameById(IN sId INT,OUT sName VARCHAR(20))
* BEGIN
*     SELECT NAME INTO sName FROM student WHERE id=sId;
* END$
* CALL pro_QueryNameById(1,@sName);
* SELECT @sName;
*/
Connection conn = JDBCUtil.getConn();
CallableStatement cstmt = null;
String sql = "CALL pro_QueryNameById(?,?);";
try {
cstmt = conn.prepareCall(sql);
//给第一个参数赋值为1
cstmt.setInt(1,1);
//设置第二个输出参数的类型

9dda
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
cstmt.executeQuery();
//打印cstmt里面保存的输出的值
System.out.println(cstmt.getString(2));

} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtil.close(conn, cstmt, null);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 mysql jdbc