A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© csbl 初级黑马   /  2018-5-9 17:08  /  1244 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

学习体会
数据库就是一个文件系统,通过标准的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注入漏洞普遍存在。有一个网站,用户需要进行注册,用户注册以后根据用户名和密码完成登录。假设现在用户名已经被其他人知道了,但是其他人不知道你的密码,也可以登录到网站上进行相应的操作。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马