您的位置:首页 > 大数据

大数据正式11

2017-11-21 10:18 176 查看

大数据正式11

数据库概述

是什么

存储数据的仓库,其本质是文件系统,数据按照指定的格式将数据存储起来,用户可以对是数据库中的数据进行增删改查


数据库管理系统

DBMS,指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完善性。用户通过数据库管理系统访问数据表内的数据。


常见的数据库管理系统

1. MySQL:开源;免费;小型;
2. Oracle:收费;大型;
3. DB2:收费
4. SQLServer:收费
5. SyBase:
6. SQLite:嵌入式小型数据库,应用在手机端


MySql

客户端->DBMS->数据库->表

数据库表

数据库中的以表为组织单位存储数据

表似我们的java类,每个字段都有数据类型

类---表
属性---字段
对象---记录


表数据

一行数据--------记录

安装MySQL

开启MySQL服务

net start mysql

登录数据库

mysql -u用户名 -p密码

Mysql的图形化开发工具

SQLyog

数据库语言

SQL:Structured Query Language

SQL分类:

数据库定义语言:DDL(Data Definition Language):用来定义数据库对象【数据库、表、列】,关键词【create,alter,drop】

数据库操作语言:DML(Data Manipulation Language):用来对数据库表的记录进行更新,关键字【insert,delete,update】

数据库控制语言:DCL(Data Control Language):用来定义数据库的访问权限和安全级别,及创建用户

数据库查询语言:用来查询数据库中表达的记录,关键字【select,from,where等】

通用语法

SQL单行,双行,以分号结尾

可使用空格和缩进来增强语句的可读性

mysql不区分大小写, 建议使用大写

同样可以使用/**/的方式完成注释

mysql中常使用的数据类型

int

double

varchar

date

分类类型名称说明
整数类型tinyInt很小的整数
smallInt小的整数
mediumint中等大小的整数
int(integer)普通大小的整数
小数类型float单精度浮点数
double双精度浮点数
decimal(m,d)压缩严格的指定数
日期类型yearYYYY 1901~2155
timeHH:MM:SS -838:59:59~838:59:59
dataYYYY-MM-DD 1000-01-01~9999-12-31
datatimeYYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59
timestampYYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01~2038-01-19 03:14:07UTC
二进制文件CHAR(M)0~255之间的整数
VARCHAR(M)0~65535之间的整数
TINYBLOB0~255字节
BLOB允许长度为0~65535字节
MEDIUMBLOB0~167772150字节
LONGBLOB0~4294967395字节
TINYTEXT0~255字节
TEXT0~65535字节
MEDIUMTEXT0~167772150字节
LONGTEXT0~4294967395
VARBINARY(M)0~M个字节变长字符串
BINARY(M)0~M个字节的定长字符串

数据库操作

database

创建数据库

create database 数据库名;

create database 数据库名 character set 字符集;

查看数据库

show databases;/查看所有的数据库名/

show create database 数据库名;/查看数据库定义的信息/

删除数据库

drop database 数据库名;

切换数据库

use 数据库名;

查看正在使用的数据

select database() ;

table

创建表

create table 表名(字段名1 类型(长度) 约束字段,字段名2 类型(长度) 约束);

主键约束

用于标识的当前记录的字段,特点非空,唯一。

primary key

primary key(字段名)

删除主键

alter table 表名 drop primary key;

主键自动增长

primary key auto_increment

查看表

show tables;

查看表结构desc 表名;

删除表

drop table 表名;

修改表结构格式

添加列

alter table 表名 add 列名 类型(长度) 约束;

修改列的类型和长度

alter table 表名 modify 列名 类型(长度) 约束;

修改列名

alter table 表名 change 旧列名 新列名 类型(长度) 约束;

删除列

alter table 表名 drop 列名;

修改表名

rename table 表名 to 新表名;

修改表的字符集

alter table 表名 character set 字符集;

插入表记录

insert into 表名(列1,列2...) values(值1,值2...);/插入某些列/

insert into 表名 values(值1,值2...);/插入全部列/

自动增长的数据插入null即可

更新表记录

update 表名 set 字段名 = 值,字段名=值;

update 表名 set 字段名 = 值, 字段名=值 where 条件;

注:字符串和日期需要加''

删除记录

delete from 表名 where 条件;/一条一条删除,不清空auto_increment记录数/

truncate table 表名;/删除整个表,重建新表,auto_increment将被清空/

DOS操作数据乱码

原因:mysql客户端与dos的编码不一致

查看所有mysql的编码

show variables like 'character%';d

与客户端有关的编码设置

client connection result和客户端相关

database server system 和服务器端相关

修改

客户端(只针对当前窗口)

set character_set_results =gbk;

配置文件

mysql安装目录下,my.ini文件

default-character-set=gbk/客户端编码设置/

character-set-server=utf-8/服务器端编码设置/

sql查询语句

查询指定字段的信息

select 字段1,字段2 from 表名;

查询表中所有字段

select * from 表名;

去除重复记录

select distinct 字段 from 表名;

别名查询

select * from 表名 as 别名;

select * from 表名 别名;

select 字段 as 别名 from 表名;

select 字段 别名 from 表名;

运算(列可直接进行运算)

select namne,price+122 from 表名;

条件查询

select 字段 from 表名 where 条件;

比较运算符>< <=>= = <>大于 小于 小于等于 大于等于 等于 不等于
between ...and...显示某一区间的值(含头含尾)
int(值,值)显示在in列表的值
like 通配符模糊查询,like 有两个通配符 %匹配多个字符 _匹配一个字符
is null判断是否为空
逻辑运算符and多个条件同时成立
or多个条件任意一个成立
not不成立 eg:where(age>100)
排序

查询语句 order by 字段名 asc;/升序/

查询语句 order by 字段名 desc; /降序/

聚合函数查询

count 统计指定列不为null的记录行数

sum计算指定列的数值和,如果指定的列不是数值,返回0

max最大值--如果是字符串的话,用字符串的排序算法

min最大值--如果是字符串的话,用字符串的排序

avg平均值--不是数值类型返回0;

分组

查询语句 group by 字段 having 条件; //having对数据进行过滤的

where和having的区别
1. having是在分组后进行数据过滤;where在分组前进行过滤
2. having后面可以使用分组函数(统计函数);where后面不可以使用分组函数。
select parent,sum(money) from zhangwu  group by parent having sum(money)>100;


JDBC

JDBC概述

java database connectivity

用于执行sql的javaAPI

它由一组用java语言编写的类和接口组成

JDBC是接口,驱动是接口的实现

JDBC原理

开发步骤

导入驱动jar包--创建lib目录,用于存放当前项目所所需要的jar包
1. 注册驱动
1. Class.forName("com.mysql.jdbc.Driver");
2. DriverManager.registerDriver(new com.mysql.jdbc.Driver());//不建议使用--两次注册
2. 获得连接
1. Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/数据库名","账号","密码");
3. 获得语句执
4000
行平台
1. Statement stat = conn.createStatement();
4. 执行sql语句
1. executeUpdate(String sql)
2. executeQuery(String sql)
3. execute(String sql)
5. 处理结果
1. ResultSet
2. 实际上就是一张二维表格
3. next()指向某行记录
4. getXXX(String name)
5. getXXX(int col)
6. 释放资源
1. rs.close();
2. stmt.close();
3. con.close();


sql注入

输入账号密码时,如果写成这样:

select * from 用户表 where name = 用户输入的用户名 and password = 用户输入的密码;


sql注入

密码为 XXX' or '1'='a


组合起来就是

select * from 用户表 where name = 用户名 and password ='XXX' or 'a'='a';


上述语句可以查询出结果,即直接登录成功

解决sql注入问题-PreparedStatement

方法

executeUpdate()--执行insert,update,delete

executeQuery()--执行select

execute()执行select返回true,其他返回false

设置实际参数

setXXX(从1开始的占位标号,值)


//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
//3.获得预处理对象
String sql="insert into sort(sname) values(?)";
PreparedStatement stat=conn.prepareStatement(sql);
//4.sql语句占位符设置实际参数
stat.setString(1,"奢侈品");
//5.执行sql语句
int line =stat.executeUpdate();
System.out.println(line);
//6.释放资源
stat.close();
conn.close();



//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
//3.获得预处理对象
String sql="delete from sort where sid=?";
PreparedStatement stat=conn.prepareStatement(sql);
//4.sql语句占位符设置实际参数
stat.setInt(1,1);
//5.执行sql语句
int line =stat.executeUpdate();
System.out.println(line);
//6.释放资源
stat.close();
conn.close();



//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
//3.获得预处理对象
String sql="update sort set sname=? where sid=?";
PreparedStatement stat=conn.prepareStatement(sql);
//4.sql语句占位符设置实际参数
stat.setString(1,"数码产品");
stat.setInt(2,1);
//5.执行sql语句
int line =stat.executeUpdate();
System.out.println(line);
//6.释放资源
stat.close();
conn.close();



//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","root");
//3.获得预处理对象
String sql="select * from sort where sid = ?";
PreparedStatement stat=conn.prepareStatement(sql);
//4.sql语句占位符设置实际参数
stat.setInt(1,1);
//5.执行sql语句
ResultSet rs =stat.executeQuery();
//8.处理结果集
while(rs.next()){
String sid=rs.getString("sid");
String sname=rs.getString("Sname");
}
//7.释放资源
rs.close();
stat.close();
conn.close();


properties

使用properties文件

文件位置:建议放在src下

文件名称:任意,扩展名为.properties

文件内容:一行一行数据,格式为key=values

注:key自定义,value不允许为中文

创建配置文件

db.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
user=root
password=root


加载配置文件

Properties props=new Properties();
Reader is = new FileReader("db.properties");
props.load(is);
String driver=props.getProperty("driver");
String url=props.getProperty("url");
String user=props.getProperty("user");
String password=props.getProperty("password");

DBUtils

commons-dbutils-1.6.jar

操作

QueryRunner中提供对sql语句操作的API

update(Connection conn,String sql,Object... params)

query(Connection conn,String sql, ResultHandler rsh , Object... params)

ResultSetHandler接口,用于定义select操作后,怎样封装结果集

DBUtils类,他就是一个工具类,定义了关闭资源与事务处理的方法

QueryRunner操作

添加

publc void insert(){
try{
QueryRunner qr=new QueryRunner();
String sql="insert into student values(?)";
Object[] params={"张三"};
Connection conn=JDBCUtils.setConnection();
int line =qr.update(conn,sql,params);
}catch(Exception e){
throw new RuntimeException(e);
}
}


更新

publc void update(){
try{
QueryRunner qr=new QueryRunner();
String sql="update students set sname =? where sid=1";
Object[] params={"李四"};
Connection conn=JDBCUtils.setConnection();
int line =qr.update(conn,sql,params);
}catch(Exception e){
throw new RuntimeException(e);
}
}


删除

publc void delete(){
try{
QueryRunner qr=new QueryRunner();
String sql="delete from students where sname=?";
Object[] params={"李四"};
Connection conn=JDBCUtils.setConnection();
int line =qr.update(conn,sql,params);
}catch(Exception e){
throw new RuntimeException(e);
}
}


QueryRunner实现查询操作

query(Connection conn,String sql,ResultSetHandler rsh,Object... params)

方法名解释
ArrayHandler将结果集中的第一条记录封装到一个Object数组中,数组的每一个元素就是这条记录的每一个字段的值
ArrayListHandler将结果中的每一条记录都封装到一个Object[]数组中,将这些到list集合中
BeanHandler将结果的第一条记录封装到一个指定的javabean中
BeanListHandler将结果的每一条记录都封装到javabean的list集合中
ColumnListHandler将结果集中的指定的列字段值,封装到一个list集合中
ScalarHandler它是用于单数据,例如select count(*) from student
操作

ArrayHandler

public void method(){
//获取QueryRunner对象、
QueryRunner qr=new QueryRunner();
//执行sql
String sql="select * from students";
Object params={};
Connection conn=JDBCUtils.getConnection();\
Object[] result=qr.query(conn,sql,new ArrayHandler(),params);
//处理结果集
System.out.println(Arrays.toString(result));
conn.close();
}


ArrayListHandler

public void method(){
//获取QueryRunner对象、
QueryRunner qr=new QueryRunner();
//执行sql
String sql="select * from students";
Object params={};
Connection conn=JDBCUtils.getConnection();
List<Object[]> list =qr.query(conn,sql,new ArrayListHandler(),params);
//处理结果集
for(Object[] obj:list){
System.out.prinnt(Arrays.toString(obj));
}
conn.close();
}


BeanHandler

public void method(){
//获取QueryRunner对象、
QueryRunner qr=new QueryRunner();
//执行sql
String sql="select * from students";
Object params={};
Connection conn=JDBCUtils.getConnection();
Student stu=qr.query(conn,sql,new BeanHandler(),params);
//处理结果集
System.out.printlnz(stu);
conn.close();
}


BeanListHandler

public void method(){
//获取QueryRunner对象、
QueryRunner qr=new QueryRunner();
//执行sql
String sql="select * from students";
Object params={};
Connection conn=JDBCUtils.getConnection();
List<Student> list =qr.query(conn,sql,new ArrayListHandler(),params);
//处理结果集
for(Student obj:list){
System.out.prinnt(obj);
}
conn.close();
}


ColumnListHandler

public void method(){
//获取QueryRunner对象、
QueryRunner qr=new QueryRunner();
//执行sql
String sql="select sname from students";
Object params={};
Connection conn=JDBCUtils.getConnection();
List<String> list =qr.query(conn,sql,new ColumnListHandler(),params);
//处理结果集
for(String obj:list){
System.out.prinnt(obj);
}
conn.close();
}


ScalarHandler

public void method(){
//获取QueryRunner对象、
QueryRunner qr=new QueryRunner();
//执行sql
String sql="select count(sname) from students";
Object params={};
Connection conn=JDBCUtils.getConnection();
int result=qr.query(conn,sql,new ScalarHandler(),params);
//处理结果集
System.out.println(result);
conn.close();
}


连接池

引入:

实际开发中,“获得连接”,“释放资源”是非常消耗系统资源的两个过程,为了解决--引入连接池技术

用池来管理Connection,这样可以重复使用Connection对象,当使用完Connection时,调用close()方法时也不会真的关闭,而是会归还。

规范:java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个数据库厂商需要实现这些接口

DBCP连接池

tomcat内置连接池

jar包

commons-dbcp-1.4.jar

commons-pool-1.5.6.jar

编写工具类

public class JDBCUtils{
public static final String DRIVER="com.mysql.jdbc.Driver"
public static final String URL="jdbc.mysql://localhost:3306/mydb";
public static final String USERNAME="root";
public static final String PASSWORD="root";
/*
*创建连接池BasicDataSource
*/
public static BasicDataSource dataSource=new BasicDataSource();
//静态代码块
static{
//对连接池对象 进行基本的配置
dataSource.setDriverClassNmae(DRIVER);
dataSource.setUrl(URL);
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
}
/*
*返回连接池对象
*/
public static DataSource getDataSource(){
return dataSource;
}
}


工具类的使用

/**
*获得连接池的basicdatasource传入QueryRunner中,后续的Connection则不写
*/
public void method(){
//获取QueryRunner对象、
QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
//执行sql
String sql="select count(sname) from students";
Object params={};
int result=qr.query(sql,new ScalarHandler(),params);
//处理结果集
System.out.println(result);
conn.close();
}


分类属性描述
必须项vriverClassName数据库驱动名称
url数据库地址
username用户名
password密码
基本项maxActive最大连接数量
minldle最小空闲连接
maxldle最大空闲连接
initialSize初始化连接

补充

安装mysql



其他

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: