您的位置:首页 > 移动开发 > Android开发

Android基础第三篇(上)

2016-08-28 18:28 260 查看
转载请标明出处:

http://blog.csdn.net/gj782128729/article/details/52347007

本文出自:【高境的博客】

1. 数据库的简介

1.1. 什么是数据库?

数据库英文Database,数据库就是一个文件系统,用来存储数据的仓库。使用标准sql对数据库进行操作(crud)。

1.2. 关系型数据库和关系型数据

关系型数据库:建立在关系模型基础上的数据库,存储的是实体之间的关系。

关系型数据:关系型数据是以关系数学模型来表示的数据,关系数学模型中以二维表的形式来描述数据。

1.3. ER图

博客系统可以分为以下几个功能:1.用户注册2.用户登录3.用户查看4.用户发表5.用户评论6.用户收藏。

在这里面实体有 (a)用户 (b)博客 (c)评论,用户、博客、评论之间的关系称为实体之间的关系,实体之间的关系可以通过ER图来进行表示:

实体使用矩形、在实体上面属性使用椭圆,之间的关系使用菱形



1.4. 常见的关系型数据库

数据库简介
Oracle是Oracle公司产品,是大型的收费的数据库,运行在任何操作系统上,应用在大型的项目上,比如中国联通、中国电信
DB2是IBM公司的产品,是大型的收费的数据库,能和Oracle媲美,如QQ,微信
Microsoft SQLServer是微软公司产品,是中型的数据库,收费产品,处理数据的能力比存储数据速度快
MySQL在Oracle收购之后6.x版本开始收费,之前的版本是免费的
SQLite是小型的嵌入式数据库,免费轻量级数据库,应用在客户端开发中,比如安卓
HSQL迷你的数据库,大小非常小,只有几十k,开源免费。最大特点是纯Java开发,注意应用场景在Java框架内置使用

2. MySQL的安装和卸载

2.1. MySQL的安装

注意1:安装文件所在路径,不要包含中文!







有三个按钮:

第一个代表典型安装(推荐的安装);

第二个代表自定义安装(一般使用这种方法);

第三个表示完全安装(一般不需要)。









复选框一定要选中







上面出现了单选框:一般使用上面那个(精细配置)



使用第一个 开发者电脑









mysql默认端口是3306







mysql中 超级管理员 root设置root的密码(一定要记住)





当出现了右边情况,没有X的情况,表示mysql安装成功。

如果出现X,没有安装成功,必须要重新安装。

2.2. 验证MySQL安装是否成功

启动mysql的服务(默认就是启动的)在计算机右键->管理->服务中设置:



在命令行中输入如下命令:mysql -u root -p (-u表示用户名 root, -p表示密码)



打开cmd窗口

登录MySQL:mysql -uroot -p123

退出MySQL:exit | quit

出现了 mysql>:表示登录mysql成功

2.3. MySQL的卸载

第一步,找到MySQL的安装路径,找到一个文件my.ini文件找到两个路径,复制出来;

basedir="C:/Program Files (x86)/MySQL/MySQL Server 5.5/"

datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"


第二步,打开控制面板,找到安装的mysql数据库,进行卸载;

第三步,找到第一步复制出来的两个路径,把这两个路径的里面的所有的文件都删除;

第四步,删除:

C:\Documents and Settings\All Users\Application Data\MySQL

C:\ProgramData\MySQL


第五步,打开注册表 regedit,搜索mysql,找到了都删除;

regedit

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services


第六步,重新启动系统。

3. MySQL服务器的存储结构

(1) MySQL服务器

服务器:从硬件上,服务器就是一台电脑;从软件上,在电脑上安装了服务器软件,那么这台电脑就称之为服务器。

MySQL服务器:在一台电脑上,安装了MySQL数据库,这台电脑称为MySQL服务器。

(2) 常见的服务器软件

iis ,asp(做网站的一个技术) ,tomcat ,mysql

(3) MySQL服务器的存储结构

有多个数据库,在每个数据库里面有多个数据库表,在每个表里面有多条记录。

学习重点:对数据库、数据库表、表中的记录的操作(crud操作)



4. SQL语言

4.1. SQL简介

(1) 什么是sql

Structured Query Language,结构化查询语言,对数据库进行操作。

(2) sql是结构化非过程性语言,不需要依赖于其他的条件就可以运行

什么是过程化语言,比如在java里面:

int i = 5;

int j = 10;

int result = i+j;

代码按照顺序执行,就是过程化的语言。

(3) sql语句不依赖任何语句,每一条sql语句都可以单独执行。

(4) sql是官方提供的数据库的标准语言,任何数据库都支持sql语句。

(5) sql的分类

类型介绍
DDL(数据定义语言)Data Definition Language创建数据库,创建数据库表。常用的语句如create
DML(数据操纵语言)Data Mainpulation Language对表中的记录进行增加 修改 删除操作。 常用的语句如insert update delete
DCL (数据控制语言)Data Control Language数据库的编程的语言如对用户进行授权
DQL (数据查询语言)Data Query Language对表中的进行查询的操作。常用的语句如select
学习的主要内容:使用sql语言对数据库、数据库表、表中的记录进行增删改查(crud)操作

4.2. 使用SQL对数据库操作

(1)连接数据库

* 打开cmd窗口,使用命令,连接mysql数据库

* 命令:mysql -u root -p 密码

(2)创建数据库

* 语句:create database 数据库的名称;

* 示例:create database testdb1;

(3)查看所有的数据库

* 语句:show databases;

(4)删除数据库

* 语句:drop database 要删除的数据库的名称;

* 示例:drop database testdb1;

(5)切换数据库

* 如果想要创建一个数据库表,这个表要在一个数据库里面,所以需要切换到数据库

* 语句:use 要切换的数据库的名称;

* 示例:use testdb2;

(6)查看当前使用的数据库

* 语句:select database()

4.3. 使用SQL对数据库表操作

4.3.1. 创建数据库表

语句: create table 表名称 (
字段 类型(长度),
字段 类型(长度)
)


示例:创建表 user,字段  id  username  password  sex
create table user (
id int,
username varchar(40),
password varchar(40),
sex varchar(30)
)




4.3.2. mysql的数据类型

字符串型VARCHAR、CHAR

当创建表时候,使用字符串类型,name varchar(40),指定数据的长度

varchar和char的区别:

(1)varchar的长度是可变的,比如 name varchar(5),存值 a ,直接把a存进去

(2)char的长度是固定的,比如name char(5),存值 b,把b存进去,后面加很多空格

大数据类型BLOB(存音频,视频,图片等)、TEXT(存字符类型,文本文件)

使用这个类型可以存储文件,一般开发,不会直接把文件存到数据库里面,存文件的路径.

数值型

-------
mysql中TINYINTSMALLINTINTBIGINTFLOATDOUBLE
Java中byteshortintlongfloatdouble
逻辑型

BIT 占1位,1字节占8位

类似java里面的boolean

日期型

DATE:用于表示日期 1945-08-15

TIME:用于表示时间 19:10:40

下面的两个类型可以表示日期和时间

DATETIME:手动添加时间到数据表里面

TIMESTAMP:自动把时间添加到表里面

4.3.3. 查看表结构

语句 desc 表名称;



4.3.4. MySQL的约束

第一种,非空约束 not null 表示数据不能为空

第二种,唯一性约束 unique 表中的记录不能重复的

第三种,主键约束 primary key

* 表示非空,唯一性

* 自动增长 auto_increment

一旦字段设置为主键,那么该字段就是非空并且唯一

4.3.5. 创建带约束的表

create table person (
id int primary key ,
username varchar(40) not null,
sex varchar(20)
)




4.3.6. 查看当前的数据库表

语句 show tables;

4.3.7. 删除表

语句 drop table 要删除的表名称;



4.4. 操作表中的记录

4.4.1. 添加记录 insert

语句:insert into 要添加的表名称 values(要添加的值);

示例:

insert into user values(1,'aaa','123456','nan');


注意:当添加的字段的数据类型是int类型,直接写值,如果添加的字段的类型是varchar类型和日期类型,使用单引号把值包起来

4.4.2. 修改记录 update

语句:update 表名称 set 要修改的字段的名称1=修改的值2,要修改的字段的名称2=修改的值2 where 条件

示例:

update user set username='QQQ',password='999' where id=1;


4.4.3. 删除记录 delete

语句:delete from 表名称 where 条件

示例:

delete from user where id=1;


注意:不添加where条件,把表里面的所有的记录都删除

4.4.4. 查询记录 select

语句:select 要查询的字段的名称 (*) from 表名称 where 条件

示例:

select * from user;
select username,chinese from user;
select * from user where id=2;


注意:as关键字可以给字段起一个别名:

select username as u1,chinese as c1 from user;


4.4.5. 去除重复记录 distinct

语句 select distinct * from 表名;



4.4.6. where子句的使用

create table student(
id int primary key,
name varchar(20),
english int,
math int
);


首先创建一张表:



插入几条数据:

insert into student values(1, "aa",100,80);
insert into student values(2, "bb",80,90);
insert into student values(3, "aba",70,80);


(1)运算符 < > >= <=

练习:查询表里面英语成绩大于60的学生信息

select * from student where english > 60;




(2)in:在范围内

练习:查询表里面英语成绩是80-90的学生信息

select * from student where english in (80,90);




(3)and:在where里面如果有多个条件,表示多个条件同时满足

练习:查询表里面英语成绩大于70,并且数学成绩大于等于90的学生信息

select * from student where english>70 and math>=90;




(4)得到区间范围的值

练习:查询表里面数学成绩在70-100之间的值

写法一:

select * from student where math >=70 and math <=100;


写法二:

select * from student where math between 70 and 100;




(4)like:模糊查询

练习:查询表里面name包含a的学生信息

select * from student where name like '%a%';




4.4.7. 对查询记录排序 order by

order by写在select语句的最后

第一,升序格式:

order by 要排序字段 asc(asc可以省略,默认的情况下就是升序)

* 练习:对student表里面查询的数据,根据语文成绩进行升序排列

select * from student order by english asc;




第二,降序 格式:

order by 要排序字段 desc

* 练习:对student表里面的英语成绩进行降序排列

select * from student order by english desc;




4.4.8. 查看当前运行的数据库

select database();


4.5. 聚集函数

使用提供的一些函数,直接实现某些功能。

4.5.1. count()函数

根据查询的结果,统计记录数

写法 select count(*) from …where….

练习一;查询student表里面有多少条记录

select count(*) from student;




* 练习二:查询student表里面英语成绩大于90的学生有多少

select count(*) from student where english>90;




4.5.2. sum()函数

求和的函数

写法 select sum(要进行求和字段) from …where….

练习一:得到student表里面的英语的总成绩

select sum(english) from student;




* 练习二:得到student表里面英语总成绩,数学的总成绩

select sum(english),sum(math) from student;




* 练习三:得到student表里面语文成绩的平均分(总的成绩/总的人数)

select sum(english)/count(*) from student;




4.5.3. avg()函数

计算的平均数的函数

写法 select avg(要计算平均数的字段名称) from …

练习:得到student表里面数学成绩的平均分

select avg(math) from student;




4.5.4. max()函数

计算最大值

写法 select max(字段) from…

练习:得到英语成绩的最大值

select max(english) from student;




4.5.5. min()函数

计算最小值

写法 select min(字段) from…

练习:得到user表里面英语成绩的最小值

select min(english) from student;




4.6. 分组操作

分组使用 group by 根据分组的字段

语法:group by + 要分组的字段

在分组的基础之上再进行条件的判断 having,后面可以写聚集函数。

1. 举例说明

* 创建表 orders

create table orders (
id int,
name varchar(40),
price int
)
insert into orders values(1,'电视',2000);
insert into orders values(2,'电视',2000);
insert into orders values(3,'苹果',10);
insert into orders values(4,'手机',500);
insert into orders values(5,'手机',500);
insert into orders values(6,'鼠标',33);
insert into orders values(7,'鼠标',33);




2. 练习一:统计orders表里面每类商品的总的价格

select name,sum(price) from orders group by name;




3. 练习二:对商品进行分类,得到每类商品的总价格大于66的商品

select name,sum(price) from orders where sum(price)>66 group by name;


上面的语句在逻辑上没有问题,在语法上,where里面不能写聚集函数,报错。

select name,sum(price) from orders group by price having sum(price)>66;


在分组的基础之上再进行条件的判断 having,后面可以写聚集函数



5. mysql关键字limit

(1)limit关键字查询表中的某几条记录

(2)limit关键字不是标准sql的关键字,只能在mysql数据库里面使用,实现分页的功能。

* 在oracle里面特有关键字 rownum

* 在sqlserver里面特有关键字 top

(3)使用limit查询前几条记录

* 写法: limit 前几条记录 limit 3

* 练习:查询orders表里面前三条记录

select * from orders limit 3;
select * from orders limit 0,3;




(4)使用limit查询第几条到第几条记录

* 写法: limit 第一个参数,第二个参数

** 第一个参数开始的记录数的位置,从0开始的

** 第二个参数从开始的位置向后获取几条记录

* 练习:查询orders表里面第二条到第四条记录

select * from orders limit 1,3;




6. JDBC的简介

JDBC:Java DataBase Connectivity,Java数据库的连接。

比如有一台电脑,想在电脑上安装显卡,需要显卡的驱动,由显卡生产厂商提供。要想使用Java对数据库进行操作,需要使用由数据库提供的数据库驱动。

一个程序,使用Java操作数据库,掌握Java代码,除了掌握Java代码之外,需要掌握数据库驱动的代码,很多的数据库,比如mysql、oracle,对于程序员来讲,需要掌握每种数据库的代码,对于程序员压力很大。

sun公司针对这种情况,开发出一套标准接口,各个数据库只需要实现这个接口就可以了,程序员只需要掌握这套接口就可以了,这套标准的接口就是jdbc。

如果想要使用jdbc对数据库进行操作,首先安装数据库的驱动,不同的数据库提供驱动使用jar的形式提供的,需要把jar包放到项目里面,相当于安装了数据库的驱动。

导入jar到项目中(使用到开发工具 myeclipse10.x版本)。

首先创建一个文件夹 lib,把jar包复制到lib里面,选中jar包右键点击build path – add to build path,jar包前面的图标变成了“奶瓶”图标,表示导入jar成功。

7. JDBC的入门案例

7.1. 使用到类和接口

DriverManager

Connection

Statement

ResultSet

7.2. JDBC的操作步骤

首先安装驱动,把提供的jar包拷贝到工程里。

第一步,加载数据库的驱动

DriverManager里面registerDriver(Driver driver)

DriverManager驱动管理者,管理一组JDBC驱动程序的基本服务

第二步,创建与数据库的连接

DriverManager里面getConnection(String url, String user, String password)

第三步,编写sql语句

第四步,执行sql语句

创建Statement对象来发送sql语句到数据库

Statement里面executeQuery(String sql) 返回一个结果集

ResultSet rs = statement.executeQuery(sql);

第五步,遍历结果集

rs.first();

String id = rs.getString(1);

String name = rs.getString(“name”);



第六步,释放资源(关闭连接)

7.3. 使用JDBC实现查询的操作

public static void main(String[] args) throws Exception {
//加载驱动
DriverManager.registerDriver(new Driver());
//创建连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb2", "root", "root");
//编写sql
String sql = "select * from user";
//得到statement,执行sql
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//遍历结果集得到每条记录
while(rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
int chinese = rs.getInt("chinese");
int english = rs.getInt("english");
System.out.println(id+" :: "+username+" :: " + chinese + " :: " + english);
}
//释放资源
rs.close();
stmt.close();
conn.close();
}


7.4. DriverManager对象

(1)在java.sql包里面

(2)加载数据库的驱动

registerDriver(Driver driver) :参数是数据库的驱动,这个驱动是由数据库提供的。

这个方法在实际开发中,一般不使用,因为这个方法会加载驱动两次

一般在开发中使用反射的方式加载数据库的驱动

Class.forName(“com.mysql.jdbc.Driver”);

(3)得到数据库的连接

getConnection(String url, String user, String password),返回Connection

第一个参数:表示要连接的数据库

写法:jdbc:mysql://数据库的ip:数据库的端口号/连接的数据库的名称jdbc:mysql://localhost:3306/testdb2

简写的方式:jdbc:mysql:///testdb2(使用范围:连接的数据库是本机,端口是3306)

第二个参数:表示连接数据库的用户名

第三个参数:表示连接数据库用户密码

7.5. Connection对象

(1)代表数据库的连接,是接口,在java.sql包里面

(2)创建statement对象

Statement createStatement()

(3)创建预编译对象 PreparedStatement

PreparedStatement prepareStatement(String sql)

7.6. Statement对象

(1)执行sql的对象,接口,在java.sql包里面

(2)执行查询操作方法

ResultSet executeQuery(String sql) ,返回查询的结果集

(3)执行增加 修改 删除的方法

int executeUpdate(String sql) ,返回成功的记录数,对于SQL数据操作语言(DML)语句,返回成功的记录数

(4)执行sql语句的方法

boolean execute(String sql) ,返回是布尔类型,如果执行的是查询的操作返回true,否则返回的false

7.7. JDBC的ResultSet对象

(1)代表查询之后返回的结果,接口,在java.sql包里面,类似于使用select语句查询出来的表格

(2)遍历结果集 ,使用next()方法

(3)得到数据的具体值,使用getXXX方法

比如数据是string类型,使用getString(“字段的名称”)

比如数据是int类型,使用getInt(“字段的名称”)

比如不知道数据的类型,使用getObject(“字段的名称”)

(4)结果集的遍历方式

在最开始的时候在第一行之前,当执行了next方法之后,一行一行的向下进行遍历,在默认的情况下,只能向下,不能向上,在遍历出来的结果也是不能修改的。

7.8. JDBC的释放资源

关闭的原则:谁最先打开,谁最后关闭。关闭资源的规范的写法:

finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
resultSet = null;
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
statement = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}


7.9. 使用JDBC进行crud操作

(1)实现对数据库表记录进行查询的操作:executeQuery(sql)

(2)实现对数据库表记录进行增加的操作:executeUpdate(sql)

(3)实现对数据库表记录进行修改的操作: executeUpdate(sql)

(4)实现对数据库表记录进行删除的操作: executeUpdate(sql)

7.10. JDBC工具类的封装

当在很多的类里面有相同的代码,可以把相同的代码提取到一个工具类里面,在类里面直接调用工具类里面的方法实现。

在JDBC实现crud操作的代码里面,首先得到数据库连接,和释放资源的代码是重复的,所以进行封装。

得到数据库连接:

// 得到数据库连接的方法
public static Connection getConnection() throws Exception {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
Connection conn =DriverManager.getConnection("jdbc://mysql://testdb2", "root", "root");
return conn;
}


关闭连接资源:

// 封装释放资源的代码
public static void clearConn(Connection conn, Statement stmt,
ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
conn = null;
}
}


可以把数据库的一些信息,写到配置文件里面,在工具类读取配置文件得到内容。

一般使用properties格式文件作为存储数据库信息的文件

有两种方式读取配置文件

第一种,使用properties类

代码:

// 创建properties对象
Properties p = new Properties();
// 文件的输入流
InputStream in = new FileInputStream("src/db.properties");
p.load(in);
String driverName = p.getProperty("driverName");
String url = p.getProperty("url");
String username = p.getProperty("username");
String password = p.getProperty("password");


第二种,使用ResourceBundle类

使用方法:首先读取的文件的格式需要时properties,文件需要放到src下面

代码:

public static String drivername;
public static String url;
public static String username;
public static String password;
// 在类加载时候,执行读取文件的操作
static {
drivername = ResourceBundle.getBundle("db").getString("drivername");
url = ResourceBundle.getBundle("db").getString("url");
username = ResourceBundle.getBundle("db").getString("username");
password = ResourceBundle.getBundle("db").getString("password");
}


7.11. sql的注入和防止

7.11.1. 模拟登录的效果

登录的实现的步骤

首先,输入用户名和密码

第二,拿到输入的用户名和密码,到数据库里面进行查询,如果用户名和密码都正确,才表示登录成功;

但是如果用户名和密码,有一个是错误的,表示登录失败。

7.11.2. 演示sql的注入

在登录时候,用户名里面输入 bbb’ or ‘1=1,因为在表里面有一个用户是bbb,可以登录成功,因为输入的内容,被作为sql语句的一个条件,而不是作为整个用户名。

select * from user where username='bbb' or '1=1' and password='rrr'


7.11.3. 防止sql的注入

a.使用PreparedStatement预编译对象防止sql注入,

b.创建PreparedStatement对象 prepareStatement(String sql),

c.PreparedStatement接口的父接口Statement,

d.什么是预编译?举例,坐公交找位置,占着位置,并不真正做人,等来人了直接坐。

步骤

第一步,加载驱动,创建数据库的连接

第二步,编写sql

第三步,需要对sql进行预编译

第四步,向sql里面设置参数

第五步,执行sql

第六步,释放资源

// 使用工具类得到数据库的连接
conn = MyJdbcUtils.getConnection();
// 编写sql
String sql = "select * from user where username=? and password=?";
// 对sql进行预编译
psmt = conn.prepareStatement(sql);
// 设置参数
psmt.setString(1, username);
psmt.setString(2, password);
// 执行sql
rs = psmt.executeQuery();
if (rs.next()) {
System.out.println("login success");
} else {
System.out.println("fail");
}


7.12. 使用PreparedStatement预编译对象

注意地方:

第一,编写sql时候,参数使用?表示(占位符)

第二,预编译sql,设置参数的值,执行sql。

(1) 使用PreparedStatement预编译对象实现查询的操作:预编译对象executeQuery()执行查询语句。

(2) 使用PreparedStatement预编译对象实现增加的操作:预编译对象executeUpdate()执行增加的语句。

(3) 使用PreparedStatement预编译对象实现修改的操作:预编译对象executeUpdate()执行修改的语句。

(4) 使用PreparedStatement预编译对象实现删除的操作:预编译对象executeUpdate()执行删除的语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息