黑马程序员技术交流社区
标题: 学习体会 [打印本页]
作者: csbl 时间: 2018-5-9 17:08
标题: 学习体会
学习体会
数据库就是一个文件系统,通过标准的SQL语句获取数据
l 字段类型
n 一个实体对应一个表,一个实体属性对应表的一个字段。
Java中的类型 MySQL中的类型
byte/short/int/long tinyint/smallint/int/bigint
float float
double double
boolean bit
char/String char和varchar类型
char和varchar的区别:
*char代表是固定长度的字符或字符串。
*定义类型char(8),向这个字段存入字符串hello,那么数据库使用三个空格将其补全。
*varchar代表的是可变长度的字符串。
*定义类型varchar(8), 向这个字段存入字符串hello,那么存入到数据库的就是hello。
Date date/time/datetime/timestamp
datetime和timestamp区别
*datetime就是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用null存入到数据库中
*timestamp也是既有日期又有时间的日期类型,如果没有向这个字段中存值,数据库使用当前的系统时间存入到数据库中。
File BLOB/TEXT
l 约束
l create table exam(
l id int primary keyauto_increment,
l name varchar(20),
l english int,
l chinese int,
l math int
l );
l
l insert into exam values (null,'张三',85,74,91);
l insert into exam values (null,'李四',95,90,83);
l insert into exam values (null,'王五',85,84,59);
l insert into exam values (null,'赵六',75,79,76);
l insert into exam values (null,'田七',69,63,98);
l insert into exam values (null,'李老八',89,90,83);
事务:指的是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么全都成功,要么全都失败。
隔离性:一个事务的执行,不应该受到其他事务的干扰。
如果不考虑隔离性(一个事务执行受到其他的事务的干扰),引发一些安全问题,主要体现在读取数据上:
脏读:一个事务读到了另一个事务未提交的数据,导致查询结果不一致
不可重复读:一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致。
虚读/幻读:一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。
没有JDBC的时候,如果现在要开发一套系统,使用Java连接MySQL数据库,那么这时候Java程序员需要了解MySQL驱动API,如果使用Java连接Oracle数据库,那么这个时候Java程序员需要了解Oracle数据库驱动API。
SUN公司提供一套统一的规范(接口)。然后各个数据库生产商提供这套接口的实现。这套接口规范就是JDBC的规范。
create database web_test3;
use web_test3;
create table user(
id intprimary key auto_increment,
usernamevarchar(20),
passwordvarchar(20),
nicknamevarchar(20),
age int
);
insert into user values (null,'aaa','123','小丽',34);
insert into user values (null,'bbb','123','大王',32);
insert into user values (null,'ccc','123','小明',28);
insert into user values (null,'ddd','123','大黄',21);
import org.junit.Test;
/**
* JDBC的入门程序
* @author jt
*
*/
public class JDBCDemo1 {
@Test
/**
* JDBC的入门
*/
public voiddemo1() throws Exception{
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获得连接
Connectionconn = DriverManager.getConnection("jdbc:mysql://localhost:3306/web_test3","root", "abc");
// 3.基本操作:执行SQL
// 3.1获得执行SQL语句的对象
Statementstatement = conn.createStatement();
// 3.2编写SQL语句:
Stringsql = "select* from user";
// 3.3执行SQL:
ResultSetrs = statement.executeQuery(sql);
// 3.4遍历结果集:
while(rs.next()){
System.out.print(rs.getInt("id")+"");
System.out.print(rs.getString("username")+"");
System.out.print(rs.getString("password")+"");
System.out.print(rs.getString("nickname")+"");
System.out.print(rs.getInt("age"));
System.out.println();
}
// 4.释放资源
rs.close();
statement.close();
conn.close();
}
}
JDBC程序执行结束后,将与数据库进行交互的对象释放掉,通常是ResultSet,Statement,Connection。
这几个对象中尤其是Connection对象是非常稀有的。这个对象一定要做到尽量晚创建,尽早释放掉。
l 将资源释放的代码写入到finally的代码块中。
l 资源释放的代码应该写的标准:
if(rs !=null){
try {
rs.close();
}catch (SQLException e) {
e.printStackTrace();
}
rs = 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;
}
因为传统JDBC的开发,注册驱动,获得连接,释放资源这些代码都是重复编写的。所以可以将重复的代码提取到一个类中来完成。
/**
* JDBC的工具类
* @author jt
*
*/
public class JDBCUtils {
private static final String driverClassName;
private static final String url;
private static final String username;
private static final String password;
static{
driverClassName="com.mysql.jdbc.Driver";
url="jdbc:mysql:///web_test3";
username="root";
password="abc";
}
/**
* 注册驱动的方法
*/
public static void loadDriver(){
try {
Class.forName(driverClassName);
} catch (ClassNotFoundException e){
e.printStackTrace();
}
}
/**
* 获得连接的方法
*/
public static Connection getConnection(){
Connection conn = null;
try{
// 将驱动一并注册:
loadDriver();
// 获得连接
conn = DriverManager.getConnection(url,username, password);
}catch(Exception e){
e.printStackTrace();
}
return conn;
}
/**
* 释放资源的方法
*/
public static void release(Statement stmt,Connectionconn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
public static void release(ResultSet rs,Statement stmt,Connectionconn){
// 资源释放:
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) {
e.printStackTrace();
}
conn = null;
}
}
}
在早期互联网上SQL注入漏洞普遍存在。有一个网站,用户需要进行注册,用户注册以后根据用户名和密码完成登录。假设现在用户名已经被其他人知道了,但是其他人不知道你的密码,也可以登录到网站上进行相应的操作。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |