JDBC:exit & Connection & Statement & ResultSet & executeQuery & executeUpdate

今天写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的返回值总为零

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import javax.swing.; import java.awt.; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; public class demo { public static void main(String[] args) throws RuntimeException { JFrame jFrame=new JFrame("登录窗口"); JLabel oo=new JLabel("账号",JLabel.CENTER); JLabel qq=new JLabel("密码",JLabel.CENTER); JTextField ii = new JTextField(10); JPasswordField kk = new JPasswordField(10); JButton mm=new JButton("确定"); JButton ss=new JButton("注册"); JPanel p=new JPanel(); p.setLayout(new GridLayout(3,2)); JPanel p1=new JPanel(); p1.add(oo); p1.add(ii); JPanel p2=new JPanel(); p2.add(qq); p2.add(kk); JPanel p3=new JPanel(); p3.add(mm); p3.add(ss); p.add(p1); p.add(p2); p.add(p3); jFrame.setSize(400,300); jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE); jFrame.setVisible(true); jFrame.add(p); ss.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { demo d=new demo(); d.pp(p1,p2); } }); } public void pp(JPanel i, JPanel name){ try{ Class.forName("com.mysql.cj.jdbc.Driver"); Connection configuration= DriverManager.getConnection("jdbc:mysql://localhost:3306/xscj?db_student","root","123456"); Statement system=configuration.createStatement(); String sql=("insert into opop values("+i +","+"'"+name+"')"); system.executeUpdate(sql); String ll="select * from opop"; ResultSet set=system.executeQuery(ll); while(set.next()){ String id =set.getString("ID"); String pp=set.getString("name"); System.out.println(id+pp); } System.out.println(" "); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } catch (SQLException e) { throw new RuntimeException(e); } } public void uu(){ } }优化这段代码
05-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值