Java访问数据库Mysql

一、概述

  本文主要介绍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))");
时间: 2024-11-16 05:00:43

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

Java访问数据库

首先简介一下JDBC: JDBC:Java DataBase Connection. JDBC:Java数据库连接.它是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问. 它由一组用Java语言编写的类和接口组成. JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名. 一.Java访问数据库的原理: 举个例子来讲:Oracle.SQLServer.MySQL.DB2等数据库可以类比为“水厂”,Con

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

错误原因:mysql数据库只允许本地ip访问: 解决方法:修改mysql表设置所有ip都可以访问: 登录数据库 使用以下命令: use mysql; grant all privileges on *.* to 'root'@'%' identified by '你的数据库密码'; flush privileges: 查看是否修改成功 select host,user from user; java访问数据库被拒绝,不能连接数据库ERROR 1045 (28000): Access denied

三国武将查询系统 //Java 访问 数据库

import java.awt.*; import javax.swing.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.ImageIcon; import javax.swing.JTextArea; import javax.swing.JLabel; import java.awt.Color; import java.sql.*; import

Vert.x 异步访问数据库 MySQL

Vert.x提供异步访问数据库的API,数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程,导致整体性能下降,因此我们对于数据库操作,需要使用Vert.x提供的异步API. Vert.x提供的API层级非常低,可以说是仅仅在原生JDBC基础上封装了一层异步接口.所有的对数据库操作都需要通过编写SQL来完成,参数的封装和结果的获取都需要手动的来实现,对于习惯使用ORM框架的开发者可能会非常的不习惯. 先来通过一个查询数据库的案例来演示如何使用Vert.x提供的异步API 基本操作1.引入数

Java处理数据库Mysql汉字显示乱码问题

问题:在unbuntu用eclipse编写程序的时候,发现存入数据库mysql的汉字都变成了??? 原因:eclipse和mysql的默认编码方式不一致 解决方法:把eclipse和mysql的编码方式都设置为utf8 1.设置mysql默认编码方式为utf8 修改mysql数据库的my.cnf文件,my.cnf文件路径为/etc/mysql/my.cnf 在[client]下面添加 default-character-set = utf8 在[mysqld]下面添加 character-set

MySQL---数据库从入门走向大神系列(七)-Java访问数据库配置及简单使用方法execute

从操作配置文件properties中读取连接字符串,通过该字符串进行数据连接,需要写三个文件其中,两个是java类,一个是后缀名为.properties的文件,该文件放在src工作目录下. 后缀为.properties的文件此处为其取名为jdbc.properties,其中的代码如下: ##MySQL driver=com.mysql.jdbc.Driver url=jdbc:mysql:///hncu?useUnicode=true&characterEncoding=utf-8 userna

java链接数据库--Mysql

/************************************************************************* > File Name: Mysql.java > Author: Baiyan > 题意: > Created Time: 2016年06月04日 星期六 01时03分32秒 **********************************************************************/ import

jdbc快速入门(java访问数据库)

package com.itcast.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class JdbcDemo1 { public static void main(String[] args) throws ClassNotFoundException, SQLException {

java访问数据库的sql

drop database if exists STOREDB;create database STOREDB;use STOREDB; create table CUSTOMERS ( ID bigint not null auto_increment primary key, NAME varchar(16) not null, AGE INT, ADDRESS varchar(255)); create table ORDERS ( ID bigint not null auto_incr