数据库操作

数据库

数据库是一种存储结构,它允许使用各种格式输入、处理和检索数据,不必在每次需要数据时重新输入

数据库特点:

(1)实现数据共享

(2)减少数据的冗余度

(3)数据的独立性

(4)数据实现集中控制

(5)数据的一致性和可维护性

数据的一致性和可维护性主要包括:安全性控制、完整性控制、并发控制、故障的发现和维护

数据库的基本结构:

(1)物理数据层: 它是数据库的最内层,是物理存储设备上实际存储的数据集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令操作处理的字符和字组成

(2)概念数据层: 它是数据库的中间层,是数据库的整体逻辑表示,指出了每个数据的逻辑定义及数据间的逻辑联系,是存储记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。

(3)逻辑数据层: 它是数据库的最外层,是用户所看到和使用的数据库,是一个或一些特定用户使用的数据集合,及逻辑记录的集合

数据库类型

数据库一般基于某种数据模型,可以分为层次型网状型关系型面向对象型等。

层次型数据库: 类似于树结构,是一组通过链接而相互联系在一起的记录,特点是记录之间的联系通过指针实现。(由于层次模型层次顺序严格而且复杂,因此对数据进行各项操作都很困难)

网状型数据库: 类似于图结构,是使用网络结构表示实体类型、实体间联系的数据模型。(网络模型容易实现多对多的关系)

关系型数据库: 关系型数据库是目前最流行的数据库,是基于关系模型建立的数据库,由一系列表格组成。

面向对象型数据库: 建立在面向对象模型基础上。

SQL语言

SQL(Structure Query language:结构化查询语言)被广泛地应用于大多数据库中,使用SQL语言可以方便的查询、操作、定义和控制数据库中的数据。

SQL语言主要组成部分: 数据定义语言(DDL)、数据操纵语言(DML)、数据控制语言(DCL)、事务控制语言(TCL);在应用程序中使用最多的就是数据操纵语言,它最常用的核心SQL语言。

数据操纵语言主要包括:select语句(检索)、insert语句(插入)、update语句(更新)、delete语句(删除)

JDBC技术

JDBC是一种可用于执行SQL语句的Java API(应用程序设计接口),是连接数据库和Java应用程序的纽带;JDBC全称为(Java DataBase Connectivity),是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口

JDBC并不能直接访问数据库,必须依赖数据库厂商提供的JDBC驱动程序

JDBC驱动程序的类型:

(1)JDBC-ODBC桥

(2)JDBC网络驱动

(3)本地协议驱动

(4)本地API一部分用Java编写的驱动程序

JDBC中常用的类和接口:

(1)Connection接口: Connection接口代表与特定的数据库的连接,在连接上下文中执行SQL语句并返回结果

(2)Statement接口: Statement接口用于在已经建立连接的基础上向数据库发送SQL语句

(3)PreparedStatement接口: PreparedStatement接口用来动态地执行SQL语句

(4)DriverManager类: DriverManager类用来管理数据库中的所有驱动程序

(5)ResultSet接口: ResultSet接口类似于一个临时表,用来暂时存放数据库查询操作所获得的结果集

数据库操作

以MySQL数据库为例

连接数据库: 访问数据库,首先要加载数据库的驱动程序(只需要在第一次访问数据库时加载一次),然后每次访问数据时创建一个Connection对象,结束时再销毁。

import java.sql.*;

public class TestSQL1 {
    Connection C;
    public Connection GetConnection() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//将mysql驱动注册到DriverManager
        C= DriverManager.getConnection("jdbc:mysql:"+"//127.0.0.1:3306/world","root","123456");//建立数据库连接
        System.out.println("数据库连接成功");
        return C;
    }
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        TestSQL1 c=new TestSQL1();
        c.GetConnection();
    }
}

顺序查询:

import java.sql.*;

public class TestSQL2 {
    static Connection C;
    static Statement Sql;
    static ResultSet Res;
    public Connection GetConnection() throws SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//将mysql驱动注册到DriverManager
        C= DriverManager.getConnection("jdbc:mysql:"+"//127.0.0.1:3306/world","root","123456");//建立数据库连接
        //System.out.println("数据库连接成功");
        return C;
    }

    public static void main(String[] args) throws SQLException {
        TestSQL2 c=new TestSQL2();
        C=c.GetConnection();
        Sql=C.createStatement();
        Res=Sql.executeQuery("select * from  country limit 10;");
        while(Res.next()){
            String Name=Res.getString("Name");
            String Code=Res.getString("Code");
            String Continent=Res.getString("Continent");
            System.out.print("Name:"+Name+" ");
            System.out.print("Code:"+Code+" ");
            System.out.println("Continent:"+Continent);
        }
    }
}

模糊查询: 可使用语句,例:select *from country where name like 'Ch%';

import java.sql.*;

public class TestSQL3 {
    static Connection C;
    static Statement Sql;
    static ResultSet Res;
    public Connection GetConnection() throws SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//将mysql驱动注册到DriverManager
        C=DriverManager.getConnection("jdbc:mysql:"+"//127.0.0.1:3306/world","root","123456");//建立数据库连接
        //System.out.println("数据库连接成功");
        return C;
    }

    public static void main(String[] args) throws SQLException {
        TestSQL3 c=new TestSQL3();
        C=c.GetConnection();
        Sql=C.createStatement();
        Res=Sql.executeQuery("select *from country where name like 'Ch%';");
        while(Res.next())
        {
            String Name=Res.getString("Name");
            String Code=Res.getString("Code");
            String Continent=Res.getString("Continent");
            System.out.print("Name:"+Name+" ");
            System.out.print("Code:"+Code+" ");
            System.out.println("Continent:"+Continent);
        }
    }
}

预处理语句: 预处理就是将客户端与数据库服务原本一次的交互分成两次;首先提交数据库语句,让数据库服务先解析该语句,其次提交参数,调用语句并执行。这样对于多次查看重复执行的语句来说,提交并解析一次语句即可,然后就可以不断的调用解析过的语句并执行执行,省去了多次解析同一条语句的时间,以此提高效率。

对SQL进行预处理时可以使用通配符"?"来代替任何的字段值

import java.sql.*;

public class TestSQL4 {
    static Connection C;
    static PreparedStatement Sql;//声明预处理对象
    static ResultSet Res;
    public  Connection GetConnection() throws SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//将mysql驱动注册到DriverManager
        C= DriverManager.getConnection("jdbc:mysql:"+"//127.0.0.1:3306/world","root","123456");
        //System.out.println("数据库连接成功");;
        return C;
    }

    public static void main(String[] args) throws SQLException {
        TestSQL4 c=new TestSQL4();
        C=c.GetConnection();
        Sql=C.prepareStatement("select *from country where Name =?");//实例化预处理对象
        Sql.setNString(1,"China");//设置参数
        Res=Sql.executeQuery();//执行预处理语句
        while(Res.next())
        {
            String Name=Res.getString("Name");
            String Code=Res.getString("Code");
            String Continent=Res.getString("Continent");
            System.out.print("Name:"+Name+" ");
            System.out.print("Code:"+Code+" ");
            System.out.println("Continent:"+Continent);
        }
    }
}

增删查改操作: 可通过PreparedStatement类的指定参数,动态地对数据表中原有数据进行修改操作,并通过executeUpdate()方法执行更新语句操作。

import java.sql.*;

public class TestSQL5 {
    static Connection C;
    static PreparedStatement Sql;
    static ResultSet Res;
    public Connection GetConnection() throws SQLException {
        Class.forName("com.mysql.cj.jdbc.Driver");//将mysql驱动注册到DriverManager
        C= DriverManager.getConnection("jdbc:mysql:"+"//127.0.0.1:3306/jsu","root","123456");
        return C;
    }

    public static void main(String[] args) throws SQLException {
        TestSQL5 c=new TestSQL5();
        C=c.GetConnection();
        Sql=C.prepareStatement("insert into name values(?,?,?)");//添加数据
        Sql.setString(1,"100");
        Sql.setString(2,"Wrthus");
        Sql.setString(3,"Boy");
        Sql.executeUpdate();
        Sql=C.prepareStatement("update name set 性别=? where 编号=1");//更新数据
        Sql.setString(1,"Boy");
        Sql.executeUpdate();
        Sql=C.prepareStatement("delete from name where 编号=100");//删除数据
        Sql.executeUpdate();
        Sql=C.prepareStatement("select * from name");//查询数据
        Res=Sql.executeQuery();
        while(Res.next())
        {
            String Number=Res.getString("编号");
            String Name=Res.getString("姓名");
            String Sex=Res.getString("性别");
            System.out.print("Number:"+Number+" ");
            System.out.print("Name:"+Name+" ");
            System.out.println("Sex:"+Sex);
        }
    }
}

数据库连接池

数据库连接池预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时只许从缓冲池中取出一个,使用完毕再放回去。它允许程序重复使用一个现有的数据库连接,而不是重新建立一个。当请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

数据库连接池种类: JDBC数据库连接池(DataSource接口)、C3P0数据库连接池、DBCP数据库连接池、Proxool数据库连接池、BoneCP数据库连接池、Druid德鲁伊数据库连接池。

Druid(德鲁伊)连接池:

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

//创建德鲁伊连接池的两种方式
public class TestDruid {

    //方式一
    @Test
    public void Test_Druid1() throws SQLException {

        DruidDataSource druidDataSource = new DruidDataSource();

        druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        druidDataSource.setUrl("jdbc:mysql://localhost:3306/world?rewriteBatchedStatements=true");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("123456");
        druidDataSource.setInitialSize(10);
        druidDataSource.setMinIdle(5);
        druidDataSource.setMaxActive(50);
        druidDataSource.setMaxWait(5000);

        //获取5000次连接
        for(int i=0;i<5000;i++)
        {
            Connection connection = druidDataSource.getConnection();
            connection.close();
        }
        System.out.println("德鲁伊连接池");

    }

    //方式二
    @Test
    public void Test_Druid2() throws Exception {

        //读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\druid.properties"));

        //创建德鲁伊连接池
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);

        //获取5000次连接
        for(int i=0;i<5000;i++)
        {
            Connection connection = dataSource.getConnection();
            connection.close();
        }
        System.out.println("德鲁伊连接池");

    }
}

在这里插入图片描述
Druid(德鲁伊)连接池是目前最优秀的数据库连接池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值