大数据正式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) | 压缩严格的指定数 | |
日期类型 | year | YYYY 1901~2155 |
time | HH:MM:SS -838:59:59~838:59:59 | |
data | YYYY-MM-DD 1000-01-01~9999-12-31 | |
datatime | YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~9999-12-31 23:59:59 | |
timestamp | YYYY-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之间的整数 | |
TINYBLOB | 0~255字节 | |
BLOB | 允许长度为0~65535字节 | |
MEDIUMBLOB | 0~167772150字节 | |
LONGBLOB | 0~4294967395字节 | |
TINYTEXT | 0~255字节 | |
TEXT | 0~65535字节 | |
MEDIUMTEXT | 0~167772150字节 | |
LONGTEXT | 0~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其他
相关文章推荐
- linq to sql 怎么查询前 11 条数据
- oracle版本11,10数据库之间数据导入导出
- 11.数据结构(4)
- springMVC(11)------数据列表显示
- sql获取11至30行数据
- 最具投资价值的大数据与AI医疗领域区块链项目—元链DHC正式开启!
- Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
- 大数据周周看:我国首个农业人工智能工程“农业大脑”正式启动,乐视云CEO吴亚洲宣布离职
- 大数据正式京淘5
- oracle--11.使用DML处理数据
- 大数据正式京淘13
- 提升研发效率 保障数据安全——阿里云宣布数据管理DMS企业版正式商业化
- 贵州大数据:“云上贵州”昨天正式开通
- 数据仓库专题(11)-可以作为维度表使用的事实表
- 11、数据结构笔记之十一栈的应用之表达式求值实现
- 大数据正式24
- Activity与Fragment数据传递之Fragment之间获取数据 分类: Android 2015-07-02 10:33 11人阅读 评论(0) 收藏
- 数据结构 2-11设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
- [原创汉化] 价值990美元的顶级专业数据恢复软件O&O DiskRecovery 11(技术员版)汉化绿色版
- 大数据学习[11]:JAVA连接elasticsearch5.6.1操作|问题|分析