一、概述

  本文主要介绍Java接连数据库的基本方法和步骤,并对其中的几个要点进行简要说明。

二、数据库访问步骤

  在Java中连接数据库进行的访问主要有以下几个步骤:

  1. 加载数据库驱动
  2. 注册数据库驱动
  3. 建立到数据库的连接
  4. 访问数据库

  首先,要调用Class.ForName()加载并注册mysql驱动程序类,加载驱动程序驱动类后,需要注册驱动程序类的一个实例,DriverManager类负责管理驱动程序,这个类提供了registerDriver()方法来注册驱动程序类的实例,并且我们不需要亲自调用这个方法,因为Drive接口的驱动程序类都包含了静态代码块,在这个代码块中会调用registerDriver()方法来注册自身的一个实例。

  然后调用DriverManager类的getConnection方法建立到数据库的连接。在建立连接后,需要对数据库进行访问。在java.sql包中定义了三个接口:Statement、PrepareStatement和CallableStatement,分别对应不同的调用方式。其中:  

  Statement:用于执行静态的sql语句。

  PrepareStatement:从Statement接口继承而来,它的对象表示一条预编译过的sql语句,通过调用Connection对象的prepareStatement()方法得到。

  CallableStatement:用于执行sql存储过程,该接口从PrepareStatement接口继承而来,通过调用Connection对象的prepareCall()方法得到CallableStatement对象。

  完整的访问数据库代码如下:

package com.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class CreateDB
{
public static void main(String[] args)
{
String url="jdbc:mysql://localhost:3306";
String user="root";
String password="281889";
String driverclass="com.mysql.jdbc.Driver";//JDBC类名
try
{
//加载JDBC驱动,当这个类被加载时,类加载器会执行该类的静态代码块从而注册驱动程序的一个实例
Class.forName(driverclass); //建立数据库的连接
Connection conn=DriverManager.getConnection(url,user,password); //访问数据库
Statement stmt=conn.createStatement();
stmt.execute("use information_schema");
int i=0;
ResultSet rs1=stmt.executeQuery("SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='student'");
while(rs1.next()) //判断是否含有student数据库
i++;
if(i==0)
stmt.executeUpdate("create database student"); stmt.executeUpdate("use student"); int j=0;
ResultSet rs2=stmt.executeQuery("select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='student' and TABLE_NAME='stuinfo' ");
while(rs2.next()) //判断数据库中是否含有stuinfo表
j++;
if(j==0)
stmt.executeUpdate("create table stuinfo(sno INT not null primary key,name VARCHAR(50) not null,age int,sex VARCHAR(50))"); stmt.addBatch("insert into stuinfo values(0420,'阿斌',25,'男')");
stmt.executeBatch();
stmt.close();
stmt=null;
conn.close();
conn=null;
}
catch (ClassNotFoundException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
catch (SQLException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}

三、要点说明

  1、execute(String sql)、executeUpdate(String sql)和executeQuery(String sql)的区别:

  execute:执行返回多个结果集的sql语句。

  Returns:true if the first result is a ResultSet object

       false if it is an update count or there are no results

  executeUpdate:执行类似insert、update或者delete的sql语句。

  Returns:(1) the row count for SQL Data Manipulation Language (DML) statements

        (2) 0 for SQL statements that return nothing     

  executeQuery:执行指定的sql语句,返回一个ResultSet对象,用于查看执行的结果。

  Returns:a ResultSet object that contains the data produced by the given query;

  ps:executeQuery返回的ResultSet永远都不会为null

  2、ResultSet对象

  ResultSet对象以逻辑表格的形式封装了执行数据库操作的结果集,其对象维护了一个指向当前数据行的游标,初始状态下游标在第一行之前,可以通过next()方法移动游标到下一行。

  3、Statement 与 PreparedStatement的区别(摘录自http://www.jb51.net/article/58343.htm):

1.语法不同

Statement只支持静态编译,SQL语句是写死的。

PreparedStatement支持预编译,用?号来占位。

2.效率不同

Statement每次都要发送一条SQL语句,不支持缓存,执行效率低。

PreparedStatement支持预编译,缓存在数据库,只需发送参数,执行效率快。

3.安全性不同

Statement容易被注入。

注入:狡猾的分子可以编写特殊的SQL语句来入侵数据库。

例如:要查询某个用户的信息

一般情况:SELECT * FROM user_list where username=xxx and password=xxx;(这里的xxx本应为用户填写自己的用户名和密码)

注入情况:SELECT * FROM user_list where username='abc' or 1=1 -- password=xxx;

这样1=1恒等,而且在password前加上了“--”号,后面的内容成为了注释不被执行。也就是说,这样就能不用密码地查询所有的用户信息。

PreparedStatement,因为规定了SQL语句中的参数,所以可以防止注入。

4、判断mysql中是否已存在某数据库:

  stmt.execute("use information_schema");
int i=0;
ResultSet rs1=stmt.executeQuery("SELECT * FROM information_schema.SCHEMATA where SCHEMA_NAME='student'");
while(rs1.next()) //判断是否含有student数据库
i++;
if(i==0)
   stmt.executeUpdate("create database student");

  5、判断数据库中是否已存在某表:

  int j=0;
ResultSet rs2=stmt.executeQuery("select * from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='student' and TABLE_NAME='stuinfo' ");
while(rs2.next()) //判断数据库中是否含有stuinfo表
j++;
if(j==0)
stmt.executeUpdate("create table stuinfo(sno INT not null primary key,name VARCHAR(50) not null,age int,sex VARCHAR(50))");

  

Java访问数据库Mysql的更多相关文章

  1. JAVA与数据库MySQL相连接

    JDBC(Java数据库连接体系结构): 是Java实现数据库访问的应用程序编程接口,主要功能是管理存放在数据库中的数据.通过接口对象,应用程序可以完成与数据库的连接,执行SQL语句,从数据库中获取结 ...

  2. JavaSE学习总结(九)—— Java访问数据库(JDBC)

    一.JDBC简介 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java ...

  3. Vert.x 异步访问数据库 MySQL

    Vert.x提供异步访问数据库的API,数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程,导致整体性能下降,因此我们对于数据库操作,需要使用Vert.x提供的异步API. Vert.x提供的 ...

  4. oracle 事务简介,锁的概念,java访问数据库注意事项

    java链接oracle和连接其他数据库一样有两种方式:1 桥接 jdbc-obdc2 jbdc insert语句一次插入大量数据 insert into table (列1,列2,列3) selec ...

  5. java 访问数据库公共类

    package com.javaweb.mvc; import java.sql.*; /** * @author 公共数据访问类 * * Statement 和 PreparedStatement之 ...

  6. 使用Tomcat数据源的方式访问数据库(MySql) --Struts2框架应用与开发

    1.为方便测试首先创建数据库和表,然后插入测试数据   2.打开Tomcat服务器安装目录的conf/下的context.xml,配置context.xml文件. 在<Context>标签 ...

  7. java链接数据库--Mysql

    /************************************************************************* > File Name: Mysql.jav ...

  8. java访问数据库被拒绝,不能连接数据库ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    错误原因:mysql数据库只允许本地ip访问: 解决方法:修改mysql表设置所有ip都可以访问: 登录数据库 使用以下命令: use mysql; grant all privileges on * ...

  9. java 访问数据库

    Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);//依据不同数据库,加载不同驱动 String url = “jdbc:sq ...

随机推荐

  1. SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.了解SpringBoot的基本概念 2.具体内容 在之前所建立的 SpringBoot 项目只是根据官方文档实现的一个基础程 ...

  2. Java如何处理已检查异常?

    在Java编程中,如何处理已检查异常? 此示例显示如何使用catch块处理已检查的异常. package com.yiibai; public class HandleCheckedException ...

  3. JDBC插入数据实例

    在本教程将演示如何在JDBC应用程序中向数据库的一个表中插入数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中数据库表中插入数据记录. 要执行以下示例, ...

  4. C# 中委托和代理是一个概念吗??

    刚刚看了一下资料,发现有些资料说的是代理,有的说是委托,但都是指同一样东西delegate,委托和事件是有关的,因为事件的本质就是多播委托,关于多播委托楼主可以找找资料就知道了. 不过个人觉得这两个概 ...

  5. 初步了解学习将传统单机应用改造成Dubbo服务的过程

    Dubbo作为RPC框架,实现的效果就是调用远程的方法就像在本地调用一样.如何做到呢?就是本地有对远程方法的描述,包括方法名.参数.返回值,在Dubbo中是远程和本地使用同样的接口:然后呢,要有对网络 ...

  6. 使用sphinx创建和查看文档

    1. 安装pip $ sudo apt-get install python-pip 2. 安装全文本浏览器lynx $ sudo apt-get install lynx 3. 使用pip安装sph ...

  7. Python——pyiso8601

    该模块不是Python内建的模块,为Python补充了 ISO 8601 解析——将常见的 ISO 8601 日期字符创转化为 Python 的 datetime 对象. 安装 $ pip insta ...

  8. Java虚拟机性能管理神器 - VisualVM(2) 入门

    一下载VisualVM 最新版本下载 历史版本下载 二启动VisualVM 三VisualVM用户目录 四VisualVM窗口 1应用程序窗口 2详情窗口 五VisualVM插件   Java虚拟机性 ...

  9. win10上跑 sqlserver 2000应用程序

    将SQL Server 安装程序\X86\SYSTEM\SQLUNIRL.DLL 替换到Win10 的 C:\windows\system32\目录下,64位win10 还要复制到SYSWOW64目录 ...

  10. UITableView:改变 TableHeaderView 的高度

    参考:http://stackoverflow.com/a/526825 有这么一种需求,在列表顶端显示一些别样的数据,而这个别样的数据则需要通过一个别样的 View 来展现,它便是 UITableV ...