JDBC(二)
JDBC常见的异常
1、java.lang.ClassNotFoundException:com.mysql.jdbc.Drtiver
类没有找到异常,加载类时,指定路径的类不存在时抛出。
2、java.net.UnknownHostException
连接主机异常,通常是主机IP有误
3、java.net.ConnectException:Connection refused:connect
连接超时,通常是指定端口连接不上抛出
4、com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unknown database 'dpb'
指定数据库名不存在时抛出
5、java.sql.SQLException:Access denied for user 'root'@'172.17.0.1'(using password:YES)
登录mysql的账号或密码错误
6、com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:You have an error in your SQL syntax;
执行SQL语句的语法错误
7、com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Unkonwn column 'l_ame' in 'field list'
指定列不存在时抛出
8、java.sql.SQLException:No value specified for parameter 4
占位符的个数和填充值的个数不铺配时抛出
9、java.sql.SQLException:Before start of result set
结果集指针指向第一条记录的上一条记录,当前结果集指针的指向没有数据时抛出。解决方案是用rs.next()将结果集指针指向第一条记录。
10、java.sql.SQLException:Data truncated for column 'u_rank' at row 1
插入枚举类型时,插入的值不在枚举范围内抛出
SQL 注入:
在 JDBC 执行 SQL 语句时,如果以拼接字符串方式插入值,一旦值中有 SQL 语句的关键字,会导致 SQL 语句语法错误,或执行结果不正确情况,这称为 SQL 注入攻击。
Statement 和 PreparedStatement 的区别:
Statement 是 PreparedStatement 的父接口。Statement 执行 SQL 语句时,只能以拼接字符串方式插入值,效率低,容易引起 SQL 注入;
PreparedStatement 提供了占位符方式插入 SQL 语句的值。无论是什么值,都当字符串处理,不会引起 SQL 注入。
三层架构:
业务接口:一个实体类一个业务接口,一次提交一个业务方法,业务方法参数来自表现层。
持久接口:一个实体类一个持久接口,一次数据库操作一个持久方法。持久方法参数来自业务层。
接口隔离原则:使用专门的接口比用统一接口好。便于项目组织和分工,不要让开发者面对自己用不到的方法。