JDBC入门

一、JDBC入门
1.数据库驱动:数据库厂商提供的用来操作数据库用的jar包
2.JDBC:由sun公司提供的一套数据库应该遵循的接口范围
3.实现JDBC过程:
1.注册数据库驱动
//会导致数据库驱动被注册两次,程序和具体的数据库绑定在一起,不利于程序的复用
//DriverManager.registerDriver(new Driver());
Class.forName("com.jdbc.mysql.Driver");
2.获取数据库连接
Connection conn = DriverManager.getConnection(url,user,password);
url的写法:
Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
sqlServer写法:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sid
mysql写法:jdbc:mysql://localhost:3306/sid
3.创建传输器对象
//Statement会引起SQL注入
//Statement stat = conn.createStatement();
PreparedStatement ps = conn.prepareStatement(sql);
4.利用传输器将sql语句发送到数据库,获取结果集对象
executeQuery(String sql):执行查询sql的select语句
executeUpdate(String sql):执行sql的insert、update、delete语句
execute(String sql):执行任意的sql语句
5.遍历结果集,获取其中的信息
next():移动到下一行
previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面
afterLast():移动到resultSet的最后面
6.释放资源
Connection是一个有限的资源,用完立即要释放表
Statement占用内存,使用后要释放资源
ResultSet占用内存,使用后也要释放资源(释放时,后创建的先释放)
if(rs!=null){
try{
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
rs = null;
}
}
if(stat!=null){
try{
stat.close();
}catch(Exception e){
e.printStackTrace();
}finally{
stat = null;
}
}
if(conn!=null){
try{
conn.close();
}catch(Exception e){
e.printStackTrace();
}finally{
conn = null;
}
}
二、PreparedStatement
1.sql注入:由于jdbc程序在执行的过程中sql语句在拼接时,使用了由页面传入的参数,如果用户恶意的传入一下sql中
的特殊关键字,会导致sql语句意义发生变化,这种攻击的方式叫做sql注入
例:用户登录时username'#、username 'or' 1=1等语句可以实现用户无密码登录
2.PreparedStatement是Statement的子接口,不同的是PreparedStatement使用的是预编译机制,在创建PreparedStatement
对象时需要将sql语句传入,传入过程中参数用?代替。这个过程导致了传入的sql被预编译,然后通过调用对象中
的setXXX方法将参数设置上去。因为sql语句经过了预编译,当再传入特殊值是不会起作用,避免了sql注入
3.PreparedStatement使用了预编译制度,在sql语句的执行过程中效率会比Statement高
三、大数据
1.mysql数据库可以保存大文本和大二进制数据
1).Text大文本
TINYTEXT(255)、TEXT(64k)、MEDIUMTEXT(16M)和LONGTEXT(4G)
2).Blob大二进制
TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB
2.JDBC操作大文本:
1).插入大文本:
ps = conn.prepareStatement("insert into Demo2Text values(null,?,?)");
ps.setString(1, "平凡的世界");
File file = new File("1.txt");
ps.setCharacterStream(2, new FileReader(file), (int) file.length());
//1.Exception in thread "main" java.lang.AbstractMethodError:
//com.mysql.jdbc.PreparedStatement.setCharacterStream(ILjava/io/Reader;J)V
//原因:第三个参数file.length()是long型的是从1.6才开始支持的,驱动里还没有开始支持。
//解决方案:ps.setCharacterStream(2, new FileReader(file), (int)file.length());
//2.Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
//原因:文件大小过大,导致PreparedStatement中数据多大占用内存,内存溢出
//解决方案:-Xms256M-Xmx256M
//3.com.mysql.jdbc.PacketTooBigException: Packet for query is too large (10886466 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
//原因:数据库连接传输用的包不够大,传输大文本时报此错误
//解决方案:在my.ini中配置max_allowed_packet指定包的大小
2).查询大文本:
Reader rd = rs.getCharacterStream("content");
3.JDBC操作大二进制:
1).插入:
ps = conn.prepareStatement("insert into Demo3Blob values(null,?,?)");
ps.setString(1, "火力全开");
File file = new File("1.mp3");
ps.setBinaryStream(2, new FileInputStream(file), (int) file.length());

2).查询
InputStream in = rs.getBinaryStream("content");
四、批处理
1.使用场景:当需要向数据库发送一批SQL语句执行时,应该避免向数据库一条一条的发送执行,应该采用JDBC的批处理
机制,提高效率
2.批处理的方式:
1).第一种方式:Statement实现
Statement.addBatch(sql)
执行批处理sql语句
executeBatch()方法:执行批处理命令
clearBatch()方法:清除批处理命令
优点:可以向数据库发送多条不同的sql语句
缺点:sql语句没有预编译
当向数据库发送多条仅参数不同,语句相同的sql语句时,需要重复操作
2).第二中方式:PreparedStatement实现
优点:发送的是预编译后的sql语句,执行效率高
缺点:只能应用在sql语句相同,但参数不同的批处理中,主要用于批量的插入数据或批量更新表数据
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值