JDBC章节总结
1.接口可以降低程序的耦合度,提高程序的扩展力*
答:如果需要扩展接口功能的时候,直接创建一个实现接口功能的对象就可以了。
2.JDBC是一套专门用来操作数据库的接口*
见名知意,java databases connection java 虚拟机与数据库之间的连接,需要通过Statement接口来实现
3.程序员只需要面向通用的JDBC接口调用方法即可完成数据的增删改查,而不需要关系底层具体的数据库是什么品牌。*
Connection conn = DriverManager.getConnection(url,user,password) ,建立与数据库的连接,获得实现类的对象,
再通过这个连接对象获得实现mysql语句的对象
Statement stat = conn.createStatement();
增 stat.executeUpdate(sql)insert into 某一行数据 create table users .
删
改
查 stat.executeQuery(sql)
理解
4.数据库厂家负责编写JDBC接口的实现类,这些类被打成jar包,并且发布,这些jar包称为驱动。*
知道
5.开发JDBC程序之前,需要从数据库官网下载相关驱动jar包,然后将其配置到环境变量classpath当中。*
理解是一套规范,用相同的规范访问不同数据库,Oracle,通过接口连接 ,数据库厂家提供实现类对象。这些对象封装成一个接口。
6.能够独立的编写出JDBC的6步骤吗?*
step 1: 注册驱动 Driver driver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(Driver);
step 2:建立数据库的连接 String user = "root";
String password= "root";
String url = "jdbc:mysql://192.168.148.8:3306/bjpowernode";
Connection conn=Driver.Manager.getConnection(url,user,password);
step 3:通过连接生成sql语句的对象,也就是实现Statement接口的对象。
Statement stat= conn.createStatement();
step 4:执行对sql语句的操作
DDL。
String sql = "create table users = (
uid int(3), primary key
uname varchar(4)
sex char(1) unique
)";
int i= stat.executeUpdate(sql);
system.out.println("输出计时器i"+i);
DQL
String sql = "select * from emp where sal between 1600 and 3000";
Resultset res = stat.executeQuery(sql);
DML
String sql = "insert into emp values = (9003,Str_to_date('2018-06-27','%y-%m-%d')";
int i= stat.executeUpdate(sql);
system.out.println("输出计时器i"+i);
step 5:遍历查询结果,获得ReseultSet结果集。(只有执行DQL时候才会有这一步)
where(res.next()){
int empno = res.getInt("empnno");
String ename = res.getString("ename");
}
system.out,println(empno+","+ename+"");
step 6:关闭数据库。
if( res !=null){
res.close();
}
if(stat!=null){
stat.close();
}
if(conn!=null){
conn.close();
}
7.Class.forName(“com.mysql.jdbc.Driver”)完成驱动注册的原理是什么?*
通过反射得到对象实质上都是一些字节码文件存在于jar包中。
8.JDBC当中所有的下标都是从1开始的。*
占位符下标从1开始。
9.连接数据库的信息:driver /url /user/ password建议配置到属性文件中。*
怎么配置?
是为了降低代码的耦合度才把这些常用的操作做成配置文件。
三步走:创建io流InputStream inputstream = 运行时类.class.getClassload().getResourceAsStream(“config.properties”);
加载流properties.load(inputstream);
调用getProperty();方法。
10.能够对查询结果集进行遍历,以字符串的形式取出,或者以指定的类型取出,通过查询结果集当中的列名称可以取,也可以通过列索引取。*
题6有解释
11.什么是SQL注入,导致SQL注入的根本原因是什么?*
输入错误的用户名和密码竟然登陆成功了。
- and or 的优先级影响,2.statement需要拼接sql语句。
12.使用PreparedStatement可以防止SQL注入,是因为预编译的数据库操作对象会将SQL语句进行预编译,即使用户提供的信息中含有SQL关键字,但由于这些关键字没有参与编译过程,固然是不起作用的。*
理解
13.PreparedStatement比Statement效率高,并且PreparedStatement是类型安全的。*
1.Statement需要拼接SQL语句,会导致SQL注入攻击,preparedStatement不会。
2.Statement在执行多个SQL语句的时候,编译一次,执行一次。在编译在执行。 效率低
PreparedStatement编译一次,执行多次。效率高。(后面会讲到。)
14.使用PreparedStatement给占位符赋值的时候,占位符?,不能使用单引号括起来。*
给SQL字段不赋值,而用?代替。 ?相当于一个具体的字段
15.JDBC事务默认支持自动提交,也就是只要执行一条DML语句则自动提交一次,显然是不符合现实业务的。通常使用这三个语句控制事务:conn.setAutoCommit(false);conn.commit();conn.rollback();*
1.conn.setAutoCommit(false);来关闭自动提交方式
2.提交结束事务(conn.commit()):事务中对数据库的修改被永久的保存到数据库中,所有的事务可以查询到这些修改
3.回滚结束事务(conn.rollback()):事务中对数据库的修改被统统的放弃,数据库恢复到事务开始之前的状态
16.对于for update的使用,你理解吗?*
见名知意,就是我更新的时候你才可以操作,比如两个会话同时访问数据的时候,要等待一方完成对数据的修改或者查询操作(即commit之后)之后
另一个会话才可以操作查询或者修改。
17.能够独立完成MySQL数据库数据的导入和导出吗*
打开 neicat 找到数据库,比如bjpowernode,testpowernode;右键有导入,导出。
18.数据库设计三范式分别是什么*
第一范式:1.要求有PrimaryKey,2.数据是唯一的,且不能重复,3.每一个字段是原子性的不可以再分。
第二范式:建立在第一范式的基础上的,尽量避免使用联合主键2.数据库中的非主键要完全依赖主键,不能产生部分依赖。属于典型的多对多关系,如师生表。
第三范式:建立在第二范式的基础上,要求非主键字段不能产生传递依赖于主键字段,属于典型的一对多设计。
19.一对一,一对多,多对多关系,这些关系怎么设计数据库表*
一对一:方法一:共享主键primaryKey。方法二:外键唯一unique
一对多:建立俩个表,在多的一方添加外键foreignKey,外键引用一的一方主键字段。
多对多:分三张表存储,如学生表,课程表,选课表。
学生表,教师表,学生和教师的关系表。
20.数据库设计方面虽然有范式要求,但是实际开发中还是以满足客户的需求为前提。*
尽量遵循三范式。
21.我们在实际项目的开发中为什么很少使用数据库的”存储过程“*
一个存储过程是一个可编程的函数
在不同的数据库中,存储过程的语法都是不同的;只要我们使用了存储过程,就相当于放弃了数据库的移植性
存储过程:例子:声明一个存储过程,查询emp表中数据总数,并返回结果(相当于一个可编程的函数)?
步骤: CREATE PROCEDURE proc1 (out num int ) //1
BEGIN //2
SELECT COUNT(*) INTO num FROM EMP; /3 //sql语句
END ; //4
CALL PROC1 (@num); 5. //调用存储过程
select(@num); //查看执行结果。
标准答案:(分号不能省)
CREATE PROCEDURE PROC4(OUT NUM INT)
BEGIN
SELECT COUNT(*) INTO NUM FROM EMP ;
END;
CALL PROC4(@NUM);
SELECT(@NUM);
//DROP PROCEDURE PROC1; 删除存储过程。
拓展提
-- 创建以存储过程,返回两个参数相加的结果
CREATE PROCEDURE PROC2 (NUM1 INT ,NUM2 INT , OUT RES INT)
BEGIN
– 把NUM1 + NUM2的结果赋值给OUT类型的参数RES;通过out类型的参数将结果返回给调用者
SET RES = NUM1 + NUM2;
END;
– 调用存储过程
CALL PROC2(10,20,@res);
SELECT @RES;
在JDBC操作中会出现的异常有哪些:ClassNotFoundExecption和SQLException