• 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))");

      

  • 相关阅读:
    AngularJS(3)-过滤器
    AngularJS(2)-Scope作用域和控制器
    iOS局部刷新
    python(一)入门
    Java基础
    AngularJS(1)随笔
    mac下如何查看指定端口被谁占用并且杀死该进程
    Python 字节码bytecode
    Python 作用域和命名空间
    Python函数的默认参数的设计【原创】
  • 原文地址:https://www.cnblogs.com/xujian2014/p/4579058.html
Copyright © 2020-2023  润新知