Java - 数据库学习笔记

在日常的编程开发中,数据库是咱们常常要打交道的内容。本文主要是本身在数据库方面的学习笔记,先对数据库的一些基本理论做介绍,以后详细介绍Java中与数据库相关的JDBC编程的方法、最后简单介绍下Hibernate和MyBatis框架。html

1、数据库相关理论
2、MySQL基本使用
3、JDBC编程
4、Hibernate框架
5、MyBatis框架
6、总结

20世纪60年代后期以来,计算机管理的对象规模愈来愈大,应用范围又愈来愈普遍,数据量急剧增加,同时多种应用、多种语言互相覆盖地共享数据集合的要求愈来愈强烈,数据库技术便应运而生,出现了统一管理数据的专门软件系统——数据库管理系统。mysql

1、数据库相关理论

在数据库中,数据再也不以各个应用程序各自的要求来分别存储,而是把整个系统全部的数据,根据它们之间固有的关系,分门别类地加以存储。也就是说,数据库是存储在计算机系统内的结构化的、集成的、相关的、共享的和可控制的数据集合。程序员


数据库系统

数据模型web

数据模型是数据库系统的核心和基础,任何DBMS都支持一种数据模型。任何一种数据模型都是由3部分组成:1)数据结构:主要描述数据的类型、内容、性质以及数据间的联系等。2)数据操做:主要描述在相应的数据结构上的操做类型和操做方式。3)数据约束:主要描述数据结构内数据间的语法、词义联系、他们之间的制约和依存关系,以及数据动态变化的规则,以保证数据的正确、有效和相容。数据模型主要由三种,分别是层次模型、网状模型和关系模型。算法

关系模型是目前使用最普遍的数据模型,支持关系模型的DBMS称为关系型数据库管理系统。关系型数据库是一组关系表的集合,关系表是关系模型的数据结构,它用二维表格来组织数据。目前主流的关系型数据库有Mysql、Oracle、SQLServer、DB二、Sybase等等。在下面的内容中,涉及到数据库操做的部分我都是在MySQL数据库中进行的,MySQL是开源的数据库,使用起来很方便。sql

完整性约束数据库

关系数据库模型的完整性约束是数据库设计的一部分。它的目的是建立检查数据库存储数据的依据和保障数据的正确性。不但能够防止受权用户将不合法的数据存入数据库,还可以避免关系表之间的数据不一致。例如,学生表中学号必须惟一且不能为空,性别只能是男女两个值之一等等。apache

完整性约束主要由四种,分别是键约束,定义域约束,实体完整性,引用完整性。编程

  • 键约束

关系表中的“键”是指关系表架构中单一属性或者一组属性的集合。键约束是指关系表必定拥有一个惟一和最小的主键。简单的说,主键的目的就是关系表可以从两个及以上的元祖中标识出它们是不一样的元祖。数据结构

在关系表中还有几个其它的键,超键是关系表中单一熟悉或者一组属性的集合,超键须要知足惟一性。候选键是指知足最小性的超键。外键是关系表的单一或多个属性的集合,其属性值是引用其余关系表的主键。

  • 定义域约束

定义域约束是指关系表的属性值必定是定义域的单元值。例如,年龄属性的定义域是int,那么属性值能够是24而不能是24.5。

  • 实体完整性

实体完整性是指在基底关系表主键的任何部分都不能够是空值,主键若是是多个属性的集合,任何一个属性都不能够是空值。

  • 引用完整性

引用完整性是当关系表存在外键时,外键的值必定来自引用关系表的主键值,或为空值。

关系表的规范化

规范化主要是决定关系表应该拥有哪些属性,其目的是建立良好结构的关系表,去除关系表中的重复数据,去除关系表中的不一致的依赖性,避免在新增、删除或者更新数据时形成错误或者数据不一致的异常状况。关系表的规范化首要工做是处理主键与属性之间的“功能依赖”,它是三级范式的基础。

  • 第一范式

第一范式(1NF),是指在关系表中删除多值和复合属性,让关系表只拥有单元值属性。例如,学号和课程组成的学生表中,若是在一条记录中课程属性值同时有语文、数学、英语三门课,那么由于拥有多值属性不符合1NF,应该将这条记录分红3条。

  • 第二范式

第二范式(2NF),是指知足第一范式,且关系表没有部分依赖。简单地说,第二范式是指在关系表中,不是主键的属性须要彻底依赖于主键。例如,若是在一个表中,有属性学号,姓名,性别,导师编号,导师姓名,导师办公室编号,办公室地址,那么由于导师姓名以及导师办公室编号,办公室地址并不是彻底依赖主键学号,因此不符合2NF。

  • 第三范式

第三范式(3NF),是指知足第二范式,且关系表没有递移依赖。第三范式的目的是移除那些不是直接功能依赖于主键的属性,这些属性是借由另外一个属性来功能依赖于主键的。好比上面在第二范式中提到的表,咱们将学生表拆分红学生表和导师表两个表,可是导师表中办公室地址并不是直接依赖于主键,而是经过办公室编号,不符合3NF。

2、MySQL基本使用

关系型数据库MySQL在如今使用仍是比较普遍的,咱们平时进行基本的开发时能够安装这个数据库来使用,安装完成后可使用Navicat来对数据库进行操做。(在开始的学习中建议最好仍是在控制台用命令行的方式来操做数据库,Navicat是一个图形化的数据库管理软件,使用它能够很方便地进行数据库管理,但过分依赖图形化操做仍是不可取的,固然它也提供了命令行方式咱们能够根据须要来选择。)


Navicat主界面

基本SQL语句

在Navicat中,咱们先建立了数据库dbtest,下面主要是经过一些基本操做,来展现SQL,结构化查询语言的使用。

  • 建立表
CREATE TABLE tbuser
(userid VARCHAR(10) NOT NULL UNIQUE PRIMARY KEY,
username VARCHAR(15) NOT NULL,
userpasswd VARCHAR(15) NOT NULL,
usersex VARCHAR(2) NOT NULL DEFAULT '男',
userstar INT);

上面就是建立一个用户表的语句,其中userid为主键,usersex表示性别默认值是‘男’。

//插入一条记录

INSERT INTO tbuser
VALUES('111111','兰博','123123','男',95);


//插入多条记录

INSERT INTO tbuser
VALUES('222222','莫甘娜','133133','女',90),
      ('333333','巨魔','444444','男',98),
      ('444444','卡特','555555','女',97);
//从指定表中删除一条指定记录

DELETE FROM tbuser 
WHERE userid='111111';
UPDATE tbuser
SET username = '卡特琳娜'
WHERE userid = '444444';
//MySQL数据库中查询语句主要是经过SELECT完成

// 查询表中全部记录
select * from tbuser;

// 查询指定的列
select username 
from tbuser;

//查询表中全部记录数
select count(*)
from tbuser;

//查询表 并将结果按照userstar属性值从高到低排列
select * from tbuser
order by userstar desc;

// 以性别分组 查询表中userstar平均值大于88的组别
select avg(userstar)
from tbuser
group by usersex
having avg(userstar) > 88;
select tbuser.userid,tbuser.username,tbuserdo.userdodetails
from tbuser,tbuserdo
where tbuser.userid = tbuserdo.userdoid;

索引

索引是对数据库表中一个或多个列的值进行排序的结构。建立数据表的索引能够提高SQL查询效率,让用户更快速地获得查询结果。

例如这样一个查询:select * from table1 where id=10000。若是没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引以后(必须是在ID这一列上创建的索引),便可在索引中查找。因为索引是通过某种算法优化过的,于是查找次数要少的多。可见,索引是用来定位的。

建立索引的格式以下:

create index index_pk
on tbuser(userid);

其中index_pk为索引名,on后面是表名,括号内是属性。

数据库索引的 优势 主要以下:第一,经过建立惟一性索引,能够保证数据库表中每一行数据的惟一性。第二,能够大大加快数据的检索速度,这也是建立索引的最主要的缘由。第三,能够加速表和表之间的链接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,一样能够显著减小查询中分组和排序的时间。第五,经过使用索引,能够在查询的过程当中,使用优化隐藏器,提升系统的性能。

增长索引也有许多 不利的方面 :第一,建立索引和维护索引要耗费时间,这种时间随着数据量的增长而增长。第二,索引须要占物理空间,除了数据表占数据空间以外,每个索引还要占必定的物理空间,若是要创建聚簇索引,那么须要的空间就会更大。第三,当对表中的数据进行增长、删除和修改的时候,索引也要动态的维护,这样就下降了数据的维护速度。

到目前为止,咱们都还只是在数据库系统中直接对数据库进行操做,要真正地开发出一款将数据保存在数据库里的应用,咱们必须学会有编程语言来操做数据库。下面主要介绍Java中的数据库编程。

3、JDBC编程

JDBC(Java数据库链接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此能够构建更高级的工具和接口,使数据库开发人员可以编写数据库应用程序。

JDBC在实际编程中主要经历如下几步:

一、加载JDBC驱动程序
二、提供链接参数
三、创建一个数据库的链接
四、建立一个statement
五、执行SQL语句
六、处理结果
七、关闭JDBC对象

下面是利用JDBC来完成数据库表查询的一个例子。

public class JDBCTest {

    public static void main(String[] args) {

        String USERNAME = "root";
        String USERPASSWD = "314159";
        String DRIVER = "com.mysql.jdbc.Driver";
        String URL = "jdbc:mysql://localhost:3306/dbtest";

        try {

            Class.forName(DRIVER);

            Connection connection = (Connection) DriverManager.getConnection(URL, USERNAME, USERPASSWD);

            Statement statement = connection.createStatement();

            String sql = "select userid,username,userstar from tbuser";

            ResultSet resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {

                String userid = resultSet.getString("userid");
                String username = resultSet.getString("username");
                int userstar = resultSet.getInt("userstar");

                System.out.println("ID:" + userid + " 英雄:" + username + " 星数:" + userstar);
            }

            statement.close();
            connection.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

}

不难看到,在上面的例子中,先是用 Class.forName(“驱动名”); 表示加载数据库的驱动类,以后提供URL、用户名、密码经过DriverManager.getConnection()来获取获取链接,再以后是执行SQL语句并将结果放在resultSet中,而后遍历结果集合获取到查询的全部数据,最后关闭链接。

4、Hibernate框架

对象关系映射(ORMapping),是软件开发过程当中,在数据库层比较流行的设计思想。Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了很是轻量级的对象封装,它将POJO与数据库表创建映射关系,是一个全自动的orm框架,hibernate能够自动生成SQL语句,自动执行,使得Java程序员能够为所欲为的使用对象编程思惟来操纵数据库。

Hibernate能够应用在任何使用JDBC的场合,既能够在Java的客户端程序使用,也能够在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate能够在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

5、MyBatis框架

MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,而且更名为MyBatis。2013年11月迁移到Github。

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎全部的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

6、总结

以上就是本身对于数据库部分的学习笔记,关于MyBatis框架的使用,在以后的博客中会有介绍,欢迎关注。