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

java 使用JBDC访问MySQL数据库

2018-03-16 20:29 399 查看

1)JBDC简介:

    JBDC 是java数据库链接技术的简称,提供链接各种常用数据库的能力
JBDC的工作原理:



JBDC API:
    提供者:Sun公司

    内容:供程序员调用的接口与类,集成在 Java.sql 和 javax.sql 包中,
    如:

    DriverManager 类:

    Connection接口:

    Statement接口:

    ResultSet接口:
DriverManager:
    提供者:Sun公司

    作用:管理各种不同的JBDC驱动

JBDC驱动:
    提供者:数据库厂商

    作用:负责链接各种不同的数据库

JBDC API主要功能:
    与数据库建立连接、执行SQL语句、处理结果



    DriverManager: 依据数据库的不同,管理JDBC驱动

    Connection:负责链接数据库并担任传送数据的任务

    Statement: 由Connection 产生、负责执行SQL语句

    ResultSet :负责保存Statement 执行后所产生的查询结果

2)连接数据库库

JBDC驱动由数据库厂商提供:
在个人开发测试中,可以使用JBDC-ODBC桥连方式
 在生产型开发中,推荐使用纯java 驱动方式



使用JBDC - OBDC 桥方式连接数据库
    将对JBDC API 的调用,转换为对另一组数据库连接API的调用

    优点:可以访问所有ODBC可以访问的数据库

    缺点:执行效率低、功能不够强大



=====================================================================
JDBC驱动:
    使用纯java方式连接数据库

    由JDBC驱动直接访问数据库

    优点:100% java,快又可跨平台

    缺点:访问不同的数据库需要下载专用的JDBC驱动

    


    在使用纯java方式连接数据库之前需要先引用相关架包

    下载地址:https://download.csdn.net/download/qq_41303423/10291176

    


    引用完后就可以使用了。以下代码演示,如若拷贝代码,请注释记录日志代码,以免有错误
    使用纯java方式连接数据库的步骤:

    1.加载驱动     2.建立连接    3.异常处理    4.关闭连接
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 纯java方式连接关闭数据库
*<p>Title:Text01</p>
*<p>Description:</p>
*<p>Company:</p>
* @author MLQ
* @date 2018年3月16日 下午5:21:42
*/
public class Text01 {
//记录日志
private static Logger log=LoggerFactory.getLogger(Text01.class);
public static void main(String[] args) {
Connection con=null;
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立连接
try {
/**
* localhost:3306 本地
* Library:要操作的数据库
* text:用户名
* 123:密码
*/
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
System.out.println("建立连接成功");
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(con!=null){
con.close();
System.out.println("关闭连接成功");
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}
}
}

3)使用 Statement 和 ResultSet

Statement常用方法:



ResultSet常用方法:



代码演示向数据库添加信息:package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Text02 {
private static Logger log=LoggerFactory.getLogger(Text02.class);
public static void main(String[] args) {
//连接数据库
Connection con=null;
//向数据库发送信息
Statement stmt=null;
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立连接
try {
/**
* localhost:3306 本地
* Library:要操作的数据库
* text:用户名
* 123:密码
*/
StringBuffer sql=new StringBuffer();
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
//发送给数据库命令,并执行sql语句
stmt=con.createStatement();
//拼接sql语句
//INSERT INTO `reader` VALUES('006','测试',4,'吴名区');
sql.append("INSERT INTO `reader` VALUES(");
sql.append("'007',");
sql.append("'测试1',");
sql.append("4,");
sql.append("'吴名区1');");
//执行sql
//boolean flog=stmt.execute(sql.toString());
int num=stmt.executeUpdate(sql.toString());
if(num>0)
{
System.out.println("插入成功");
}else
{
System.err.println("插入失败!!!");
}
// if(flog)
// {
// System.out.println("插入成功");
// }else
// {
// System.err.println("插入失败!!!");
// }

} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(stmt!=null)
{
stmt.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}
}
}
//对数据库进行修改public static void main(String[] args) {
//连接数据库
Connection con=null;
//向数据库发送信息
Statement stmt=null;
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立连接
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
//发送给数据库命令,并执行sql语句
stmt=con.createStatement();
int num = stmt.executeUpdate("UPDATE `reader` SET `rName`='测试数据' WHERE `Rid`='007';");
if(num>0)
{
System.out.println("修改成功");
}else
{
System.err.println("修改失败!!!");
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(stmt!=null)
{
stmt.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
} //查询数据库中一张表的信息
public static void main(String[] args) {
//连接数据库
Connection con=null;
//向数据库发送信息
Statement stmt=null;
//定义一个容器
ResultSet set=null;
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立连接
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
//发送给数据库命令,并执行sql语句
stmt=con.createStatement();
set=stmt.executeQuery("select * from reader");//把查询到的信息保存到一个容器里面
//循环读取
System.out.println("编号\t姓名\t测试\t地址");
while(set.next())
{//循环所有行
System.out.print(set.getInt(1)+"\t");//输出每一列
System.out.print(set.getString(2)+"\t");
System.out.print(set.getInt(3)+"\t");
System.out.println(set.getString(4));
}
} catch (SQLException e)
b25f
{
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(stmt!=null)
{
stmt.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}

4)PreparedStatement接口: 

使用PreparedStatement接口
    继承自Statement接口

    比Statement对象使用起来更加灵活,更有效率

    






代码演示:public static void main(String[] args) {
//连接数据库
Connection con=null;
//向数据库发送信息
PreparedStatement stmt=null;
//1.加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
log.error(e.toString());
}
//2.建立连接
try {
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
//发送给数据库命令,并执行sql语句
stmt=con.prepareStatement("UPDATE `reader` SET `rName`=? WHERE `Rid`=?;");
stmt.setString(1, "判断");
stmt.setInt(2, 007);
int num=stmt.executeUpdate();
if(num>0)
{
System.out.println("修改成功");
}else
{
System.err.println("修改失败!!!");
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
finally
{
try {
if(stmt!=null)
{
stmt.close();
}
if(con!=null){
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
log.error(e.toString());
}
}
}

}

5)PreparedStatement  与  Statement  执行SQL时的差异区别

数据库User表  UserId为:2018   密码UserPwd:123
测试结果如下:
调用:statementText() 方法时可以登录成功
调用:preparedStatementText() 方法时登陆失败
具体详情请参考以下代码:

Statement  工具类:package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class ToolClass {
//加载驱动
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static Connection con=null;

//向数据库发送信息
private static Statement stmt=null;
/**
* @return the stmt
*/
public static Statement getStmt() {
return stmt;
}
/**
* @return the con
*/
public static Connection getCon() {
if(con==null)
{
try {//建立连接
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
} catch (SQLException e) {
e.printStackTrace();
}
try {
stmt=con.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
return con;
}
public static void close()
{
try {
stmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}PreparedStatement 工具类:package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;
public class ToolClass1 {
public static void main(String[] args) {
try {//加载驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static Connection con=null;
//向数据库发送信息
private static PreparedStatement preparedStatement=null;
/**
* @return the stmt
*/
public static PreparedStatement getStmt() {
return preparedStatement;
}
/**
* @return the con
*/
public static Connection getCon(String sql) {
if(con==null)
{
try {//建立连接
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/Library","text","123");
} catch (SQLException e) {
e.printStackTrace();
}
try {
preparedStatement=con.prepareStatement(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
return con;
}
public static void close()
{
try {
preparedStatement.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
调用测试类:package jdbc;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TextJd5 {
public static void main(String[] args) {
//preparedStatement方式
//preparedStatementText();
//Statement方式
//statementText();
}
/**
* preparedStatement方式登陆
*/
public static void preparedStatementText() {
// 创建存储容器
ResultSet set = null;
// 1.加载驱动
ToolClass1.main(null);
// 2.建立连接并执行SQL语句
ToolClass1.getCon("SELECT * FROM `user` WHERE `UserId`=? AND `UserPwd`=?");
try {
ToolClass1.getStmt().setInt(1, 2018);
//ToolClass1.getStmt().setString(2, "123");
ToolClass1.getStmt().setString(2, "12'or'1'='1");
set = ToolClass1.getStmt().executeQuery();
if (set.next()) {
System.out.println("登陆成功");
} else {
System.err.println("登陆失败!!!");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
ToolClass1.close();
}
}
/**
* Statement方式登陆
*/
public static void statementText()
{
// 创建存储容器
ResultSet set = null;
// 1.加载驱动
ToolClass.main(null);
//打开与数据库通道
ToolClass.getCon();
String text="12'or'1'='1";
//执行SQL
try {
set=ToolClass.getStmt().executeQuery("SELECT * FROM `user` WHERE `UserId`=2018 AND `UserPwd`='"+text+"'");
if(set.next())
{
System.out.println("登陆成功");
}else
{
System.out.println("登陆失败!!!");
}
} catch (SQLException e) {
e.printStackTrace();
}
finally
{
ToolClass.close();
}
}
}PreparedStatement接口继承自Statement接口
提高了代码的可读性和维护性
提高了SQL语句执行性能和安全性

<--------仅供参考------->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: