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