一、概述

  本文主要介绍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. 实践:C++平台迁移以及如何用C#做C++包装层

    在前面,我们看过OpenTK与MOgre,这二个项目都是C#项目,但是他的实现都是C++.他们简单来说就是一个包装层.常见的包装方式有二种,一种就是我们熟知的显式P/Invoke(DllImport) ...

  2. tornado 添加请求头进行允许跨域

    什么是跨域? 这个例子是csdn找的, 声明下哈 什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同, ...

  3. C++视频课程

    一.视频课程 课程名称:C++学习教程 程序设计 C++基础教程 授课人:郭宏志 课程链接:http://study.163.com/course/courseMain.htm?courseId=63 ...

  4. Java如何显示小时和分钟?

    在Java中,如何显示小时和分钟(当前时间)? 此示例演示如何使用Calender类的Calender.getInstance()来显示某个时刻的小时和分钟. package com.yiibai; ...

  5. python3两个字典的合并

    两个字典的合并其实很简单,直接用dict的update即可,代码如下: # /usr/bin/python3 # -*- encoding: utf-8 -*- ", "" ...

  6. The required Server component failed to start so Tomcat is unable to start问题解决

    问题出现: Server Tomcat v8.5 Server at localhost failed to start.  或者The required Server component faile ...

  7. Linux——curl(转)

    先介绍curl工具的使用,在其他文章中介绍如何使用curl发送Identity API linux curl是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具 ...

  8. Getting Started with Google Guava.pdf

  9. 带有Header的SOAP 请求

    package demo.test; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import org.t ...

  10. springmvc 文件下载

    1.使用servlet的API实现 参考:http://my.oschina.net/u/1394615/blog/311307 @RequestMapping("/download&quo ...