今天写JDBC程序练习遇到的问题:
1,system.exit(0) system.exit(1) 含义与区别
首先他俩都是退出程序的意思:
区别在于:
system.exit(0):正常退出,程序正常执行结束退出
system.exit(1):是非正常退出,就是说无论程序正在执行与否,都退出,
System.exit(0)是将整个虚拟机里的内容都停掉了 ,而dispose()只是关闭这个窗口,但是并没有停止整个application exit() 。无论如何,内存都释放了!也就是说连JVM都关闭了,内存里根本不可能还有什么东西。
System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序。
System.exit(status)不管status为何值都会退出程序。和return 相比有以下不同点:return是回到上一层,而System.exit(status)是回到最上层。
2, Connection conn = JdbcConnection.getConnection();
Connection是接口,JdbcConnection是一个普通的类,getConnection()方法是静态方法,它们之所以能用 = 连起来,因为getConnection()方法返回的是实现了Connection接口的类的实例。
Connection是类还是接口对这句话都是正确的,正常情况下是用类声明一个变量,而接口是一个被特殊化了的类。
getConnection()为什么是静态方法呢?
因为 :类.方法() 的形式,像这种形式的方法属于类方法,也就是这种方法即使在类没有实例化的时候也能使用,而一般方法是不可以的(另外,像 对象.静态方法()的形式也是允许的)。
3,Statement stmt = con.createStatement();
connection是用于将java和数据库连接的类
statement是一个接口,提供了向数据库发送执行语句和获取结果的方法
resultset是接口是用来创建存放从数据库里得到的结果的对象。
createStatement()创建一个 Statement 对象来将 SQL 语句发送到数据库。
4,ResultSet rs=stmt .executeQuery(sql);
这是利用Java JDBC操作数据库的写法。
stmt 实际是 Statement 对象
sql 是SQL语言,一种用于操作数据库的语言
execute(SQL):向数据库发送任意sql语句。
executeUpdate (SQL):向数据库发送增删改的sql语句
executeUpdate 的返回值为int,只有0和1
st.executeQuery (SQL):向数据库发送查询的sql语句
ResultSet rs=st.executeQuery(sql);
ResultSet rs 存放的是从数据库中,返回来的数据结果。
使用JDBC连接数据库需要4步:
1、加载驱动程序;
2、连接数据库;
3、访问数据库;
4、执行查询;要用statement类的executeQuery()方法来下达select指令以查询数据库,executeQuery()方法会把数据库响应的查询结果存放在ResultSet类对象中供我们使用。即语句:ResultSet rs=s.executeQuery(sql);
5,报错:Loading class ‘com.mysql.jdbc.Driver'. This is deprecated. The new driver class is
com.mysql.cj.jdb`
是由于jdbc驱动包名引发的问题
5.x版本的驱动文件jar包对应的是:
Class.forName("com.mysql.jdbc.Driver");
而8.0x版本的数据库驱动文件,需要将加载数据库驱动的语句更改为:
Class.forName("com.mysql.cj.jdbc.Driver");
除此之外:
url的设置也得进行修改,原本的url如下:
String ur="jdbc:mysql://127.0.0.1:3306/student";
应修改为如下:
String url="jdbc:mysql://127.0.0.1:3306/student?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8";
8.0x是不需要建立ssl连接的,需要显示关闭,即url中的
&useSSL=false
;
serverTimezone=GMT%2B8
是进行时区的设置。
url基本格式如下:
连接地址+ssl连接关闭+字符集为utf-8+时区设置
6,PreparedStatement(预编译)
JDBC学习笔记(4)——PreparedStatement的使用
预编译有两个作用:
1,判断sql语句是否正确
2,给占位符赋值
7,String wname=sc.next();
Scanner类中有next()方法,这个方法的作用就是实现从键盘上输入数据。即输入字符串对象类型
使用‘.’点对象运算符引用该方法并使用!该方法返回你输入的字符串!
8,if(pr.executeUpdate()==1){ }
是当成功插入数据到数据库时候,这个会返回一个大于1的数字,来表明数据成功插入库之中。
sql注入发生的时间,sql注入发生的阶段在sql预编译阶段,当编译完成的sql不会产生sql注入,采用jdbc操作数据时候,preparedStatement 预编译对象会对传入sql进行预编译。
那么当传入id 字符串为 “update ft_proposal set id = 3;drop table ft_proposal;” 这种情况下就会导致sql注入删除ft_proposal这张表。
在jdk1.8中executeUpdate()有两种返回值(搜索一下 PreparedStatement 即可查看到),即有两种返回值不同的方法。返回值分别是:int 和ResultSet。
executeUpdate的返回值是一个整数,指受影响的行数(即更新计数)。
对于CREATETABLE或DROPTABLE等不操作行的语句,executeUpdate的返回值总为零