前面我们介绍了一些理论知识。现在来学一下实际工程中数据库是如何与java,android等项目连接的。

1、java与mysql连接(JDBC
java语言应用广泛,但是纯java如何实现和数据库的通信是很难的。业界存在许多不同的数据库且每种数据库所使用的协议、底层机制也各不相同;所以针对于此,所有的数据库供应商和工具开发商都认为,如果Java能够为SQL访问提供一套“纯”JavaAPI,同时提供一个驱动器管理器来允许第三方驱动程序可以连接到特定的数据库,如此一来数据库供应商可以提供自己的驱动器程序来插入注册到驱动器管理器中;所以JDBC的核心思想就是:根据API编写的程序都可以与驱动器管理器通信,而驱动器管理器通过驱动程序与实际数据库进行通信。
总之,JDBC实现了以下目标:通过使用标准的SQL语句,甚至是专门的SQL扩展,程序员可以利用Java语言开发访问数据库的应用,同时还依旧遵守Java语言的相关约定。数据库供应商和数据库工具提供商可以提供底层的驱动程序 ,同样也可以优化各种数据库产品的驱动程序。

JDBC定义了操作所有关系型数据库的规则(接口)。在开发的过程中就可以利用这些接口操作不同的数据库。实现类就由各个数据库厂商来编写。每个数据库厂商就写了不同的实现类来操作自己的数据库。不同的实现类也就是不同数据库的驱动。

实现步骤:
1、下载一个对应数据库的驱动jar包,比如类似mysql-connector-java-5.1.20-bin.jar。将这个jar包复制到java项目的libs文件下。
2、将该JAR包加入到项目的build path变量中。
3、在项目中的 src 目录下面有一个文件 module-info.java,里面的内容应该是: module 项目名 {},需要在大括号中加一句话 requires java.sql; 否则引用java.sql会出错
4、接下来就是标准流程:注册驱动-获取数据库连接对象-定义sql语句-获取执行SQL语句的对象 Statement-执行SQL,接收返回的结果,处理返回结果-释放资源。下面是具体例子

package com.runoob.mysql;

import java.sql.*;

public class con_mysql {
	//这里是MySQLDemo 类
	/*
	*java连接mysql数据库
	*1、加载驱动程序
	*2、数据库连接字符串"jdbc:mysql://localhost:3306/数据库名?"
	*3、数据库登录名
	*3、数据库登录密码
	*/	
				
	// MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
	//static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
	// static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
 
    // MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB?useSSL=false&serverTimezone=UTC";
 
 
    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "12345678";
 
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        try{
            // 注册 JDBC 驱动
            Class.forName(JDBC_DRIVER);
        
            // 打开链接获取数据库连接对象conn
            System.out.println("连接数据库...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
        
            // 执行查询
            System.out.println(" 实例化Statement对象...");
            stmt = conn.createStatement();//创建执行sql语句的statement
            String sql;
            sql = "SELECT id, name, url FROM websites";
            ResultSet rs = stmt.executeQuery(sql);
        
            // 展开结果集数据库,相当于游标了,next指针
            while(rs.next()){
                // 通过字段检索
                int id  = rs.getInt("id");
                String name = rs.getString("name");
                String url = rs.getString("url");
    
                // 输出数据
                System.out.print("ID: " + id);
                System.out.print(", 站点名称: " + name);
                System.out.print(", 站点 URL: " + url);
                System.out.print("\n");
            }
            // 完成后关闭,所有创建的对象都要关闭
            rs.close();
            stmt.close();
            conn.close();
        }catch(SQLException se){
            // 处理 JDBC 错误
            se.printStackTrace();
        }catch(Exception e){
            // 处理 Class.forName 错误
            e.printStackTrace();
        }finally{
            // 关闭资源
            try{
                if(stmt!=null) stmt.close();
            }catch(SQLException se2){
            }// 什么都不做
            try{
                if(conn!=null) conn.close();
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        System.out.println("Goodbye!");
    }	

}

1、DriverManager:驱动管理对象,功能有注册驱动Class.forName(JDBC_DRIVER);
获取数据库连接 DriverManager.getConnection(DB_URL,USER,PASS);

2、Connection:数据库连接对象。可以获取执行sql的对象statement
通过这两个方法获得:statement=conn. createStatement(); statement=conn. PreparedStatement();
其中, PreparedStatement是预编译的SQL,通过将参数使用?作为占位符,解决安全问题(SQL注入攻击)。
SQL注入:将一些关键字作为字符串拼接。比如输入密码字符串’a’ or ‘a’=‘a’。这种密码不论怎样都是对的。造成密码失效。

3、执行sql的对象
三种形式执行SQL语句
1、boolean execute(String sql); //执行任意SQL语句,一般不这么用
2、int executeUpdate(String sql); 执行DML(增删改操作)、DDL(create、alter、drop),返回影响的行数,如果返回0,说明操作失败了。
3、ResultSet executeQuery(String sql); 执行DQL(SELECT)语句,返回的是一个结果集合,可以用游标逐行查看数据遍历数据。

2、Android stdio连接SQLite数据库
SQLiteOpenHelper是一个抽象类,并且是一个孤立的抽象类,通过创建一个子类继SQLiteOpenHelper类,并实现其中的一些方法来对数据库进行操作。

public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String TAG="DatabaseHelper";
    private SQLiteDatabase sqLiteDatabase;

    /**
     *
     * @ context   上下文
     * @ name      数据库名称
     * @ factory   游标
     * @ version   版本号
     */

    public DatabaseHelper(Context context) {
        super(context, Database.DATABASE_NAME, null, Database.VERSION_CODE);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //OnCreate 方法;创建时回调
        Log.d(TAG,"创建数据库");
        //创建字段   这种方法是通过写好sql语句,然后交给execSQL()方法执行,来创建;
        //sql : create table table_name(id integer,GradeUnit integer,Unit integer,English varchar, Chinese varchar)
        //Database.TABLE_NAME = "vocabulary"  是在常量文件中写好的
        String sql ="create table "+Database.TABLE_NAME+" (id integer,GradeUnit integer,Unit integer,English varchar,Chinese varchar)";
        sqLiteDatabase.execSQL(sql);
    }

    /**
     *
     * @param sqLiteDatabase  资源器
     * @param i :oldversion  旧的版本号
     * @param i1:newversion  新的版本号
     */
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        //OnUpdate方法 更新数据库时,回调
        Log.d(TAG,"更新数据库");

        //添加字段
        //alter table table_name add UNIT integer;
       String sql;

        //判断要采用的版本,进行修改
        switch (i){
            case 1:
                //版本一 则需要添加GradeUnit 和 Unit 字段
                //注意sql语句不要写错,注意sql语法
                sql = "alter table " + Database.TABLE_NAME + " add GradeUnit integer";
                sqLiteDatabase.execSQL(sql);
                sql = "alter table " + Database.TABLE_NAME + " add Unit integer";
                sqLiteDatabase.execSQL(sql);
                break;
            case 2:
                //版本2 添加Unit这个字段
                sql = "alter table " + Database.TABLE_NAME + " add Unit varchar(10)";
                sqLiteDatabase.execSQL(sql);
                break;
            case 3:

                break;
        }
    }
}

创建一个Dao类,实现对数据库的增删改查操作。

/**
 * @类名 : Dao
 * @描述 :数据库的增删改查
 */
public class Dao {

    private static final String TAG = "Dao" ;
    private final DatabaseHelper mhelper;

    public Dao(Context context){
        //创建数据库
        mhelper = new DatabaseHelper(context);
    }

    public void insert(int id,int GradeUnit,int Unit,String En,String Ch){
        SQLiteDatabase db = mhelper.getWritableDatabase();
        //添加数据
        //1.写好sql语句  insert into table_name (id,GradeUnit,Unit,English,Chinese)
        //2.将sql语句交给SQLiteDatabase.execSQL()执行
        //3.将SQLiteDatabase资源关闭
        //String sql = "insert into "+ Database.TABLE_NAME + " (id,GradeUnit,Unit,English,Chinese) values (?,?,?,?,?)";
        //db.execSQL(sql,new Object[]{id,GradeUnit,Unit,En,Ch});

        //API插入数据
        ContentValues values = new ContentValues();
        values.put("id",id);
        values.put("GradeUnit",GradeUnit);
        values.put("Unit",Unit);
        values.put("English",En);
        values.put("Chinese",Ch);
        db.insert(Database.TABLE_NAME,null,values);
        db.close();
    }

    public void delete(int id,int GradeUnit,int Unit,String En,String Ch){
        SQLiteDatabase db = mhelper.getWritableDatabase();
        //删除数据
        //1.写好sql语句 delete from table_name where conditions
        //2.将sql语句交给SQLiteDatabase.execSQL()执行
        //3.将SQLiteDatabase资源关闭
        String sql = "delete from " + Database.TABLE_NAME +" where English = '" +En + "'";
        db.execSQL(sql);
        db.close();
    }

    public void delete(int GradeUnit,int Unit,String English,String Chinese){
        SQLiteDatabase db = mhelper.getWritableDatabase();
        //删除数据
        //1.写好sql语句 delete from table_name where conditions
        //2.将sql语句交给SQLiteDatabase.execSQL()执行
        //3.将SQLiteDatabase资源关闭
        String sql = "delete from " + Database.TABLE_NAME +" where GradeUnit =" + GradeUnit;
        db.execSQL(sql);
        db.close();
    }


    public void update(int id,int GradeUnit,int Unit,String En,String Ch){
        SQLiteDatabase db = mhelper.getWritableDatabase();
        //更改数据
        //1.写好sql语句 update table_name set ***  where conditions
        //2.将sql语句交给SQLiteDatabase.execSQL()执行
        //3.将SQLiteDatabase资源关闭
        //String sql = "update " + Database.TABLE_NAME + " set Chinese = '"+ Ch+"' where English = '"+En+"'" ;
        //db.execSQL(sql);

        /**
         * SQLiteDatabase.update()
         * @param table : 表名
         * @param values : 修改的值  类型为 ContentValues 通过put方法加入
         * @param whereClause 修改的条件key  "English = ?"
         * @param whereArgs  修改该条件的条件值value String[] args = "ear"
         * whereClause + whereArgs 等同于 where English = 'ear'
         */
        ContentValues values = new ContentValues();
        values.put("Chinese",Ch);
        String condition ="English = ?";
        String[] args = {String.valueOf("ear")};
        db.update(Database.TABLE_NAME,values,condition,args);

        db.close();
    }

    public void query(int GradeUnit){
        SQLiteDatabase db = mhelper.getReadableDatabase();
        //查询数据
        //1.写好sql语句 select * from table_name where conditions
        //2.将sql语句交给SQLiteDatabase.execSQL()执行
        //3.将SQLiteDatabase资源关闭
        /*String sql = "select * from " + Database.TABLE_NAME + " where GradeUnit ="+ GradeUnit;
        Cursor cursor = db.rawQuery(sql,null);
        while (cursor.moveToNext()){
            int index = cursor.getColumnIndex("English");
            String name = cursor.getString(index);
            Log.d( TAG,"English ==" + name);
        }
        cursor.close();
        */

        /**
         * @param String[] columns 要提取的关键字键值key
         * @param String selection 查询条件的键值key
         * @param String[] selectionArgs 查询条件的value值
         * 相当于select String[] columns from table_name where String selection = "selectinoArgs"  
         */
        String[] columns = new String[]{"English"};
        String selection = "GradeUnit = ?";
        String[] selectionArgs =  {String.valueOf(33)};
        db.query(Database.TABLE_NAME,columns,selection,selectionArgs,null,null,null);

        db.close();
    }
}
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐