当前位置 :首页 >> 电影

JDBC操作在线实操

2025-05-13   来源 : 电影

lements ja.sql.Driver { public Driver() throws SQLException { } static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } }}

在可执行标识由此可知块中都,有四人DriverManager.registerDriver(new Driver());,起初应该开发者去申请人的冤枉,复制到类的时候就已经做了,所以只只能让JVM去复制到类并不需要付诸申请人 最简单的没多久是Class.forName("")方法有

public class App { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.cj.jdbc.Driver"); }}第二步:借助连结

暗示JVM进程和目录彼此之间的走廊开启,可用完只能关停走廊被囚资源,主要方法有为DriverManager.getConnection方法有,入参为目录URL,留言板,密码,返国差值是Connection并不一定,相异目录的URL不一样,用到什么搜什么并不需要

public class App { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testDb"; String username = "root"; String password = "12345678"; Connection connection = DriverManager.getConnection(url, username, password); }}第三-第四步:借助目录转换并不一定,督导SQL

这个并不一定主要用于督导sql解释器,Connection.createstatement/prepareStatement函数调用这两个方法有,这里先行模拟createStatement,后面则会说到差别

第五步:借助结果集

如果督导的是DQL解释器,那么将则会返国一个ResultSet并不一定,暗示数据库表的射影,如果是DML解释器,返国的则是int,暗示sql解释器所影响的行数。

讲讲ResultSet这个并不一定的next方法有,督导DQL解释器函数调用executeQuery方法有,论点督导了某张表的select * 解释器,只一心借助结果集的数据库只能函数调用ResultSet.next()方法有,光标则会向前移动四人,如果有数据库则返国true,此时转换ResultSet并不一定就可以借助并不相同的行数据库,如此一来次函数调用next又则会将光标向前移动四人,直到无法数据库了返国false

ResultSet.getXXX方法有可以借助并不相同的列,可用方式有资料库,如果返国队列顺自序为id,name,age,1则代表id,以此类推(JDBC中都的所有转换资料库从1开始),不推荐,语义不明晰,无法办法通过标识由此可知抽象到说明了预计键名,并不需要可用队首推作为模板,如果select写了队列的又叫,则只能用又叫去取差值借助get数据库类型的方法有,比如队列id类型为int,则可以用getInt借助id,如果可用getString,不管数据库类型是什么都则会按照String的形式锁住public class App { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testDb"; String username = "root"; String password = "12345678"; Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); String sql = "select * from t_user;"; ResultSet resultSet = statement.executeQuery(sql); // 通过while尿素借助全部结果集,返国false则拉出尿素 while (resultSet.next()) { System.out.println(resultSet.getString("username")); } }

下例通过首推去除了所有结果集的留言板

第六步:被囚资源

当所有转换之前后,只能将ResultSet(如果有),Statement,Connection的close方法有从左到右督导,被囚掉资源避免不必要的浪费

public class App { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testDb"; String username = "root"; String password = "12345678"; Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); String sql = "select * from t_user;"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println(resultSet.getString("username")); } resultSet.close(); statement.close(); connection.close(); }

从JDK7开始,没多久反对了try with resources,只要资源付诸了Autocloseable终端,主导作用是在块标识由此可知督导后,备用被囚资源,也就是备用督导close方法有。查看类开发人员可以看到,ResultSet,Statement,Connection三个类都付诸了AutoCloseable终端,所以可以恢复原写让标识由此可知非常整洁,多个资源用1]来进行隔开

public class App { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testDb"; String username = "root"; String password = "12345678"; String sql = "select * from t_user;"; try (Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql); ) { while (resultSet.next()) { System.out.println("留言板:" + resultSet.getString("username")); } } }}

可以不可用,但可以作为一个知识点了解

SQL流入疑虑

论点这是一个借助给结构性的终端服务,则会接受客户端的所撰模板据,由于creaetStatement方法有是先行来进行sql解释器都拼凑,如此一来来进行sql的机制代码,所以可以则会将客户端转换成的恶意关键字一同机制代码,像下面标识由此可知中都客户端所撰了字由此可知串' or '1' = '1,有如猜透了软件系统对sql拼凑规范,由于加了理应尝试的条件,所以即使所撰的模板不对也则会督导尝试

// 其他标识由此可知附注 Statment st = connection.createStatment(); // 客户端中都叶的差值 String value = "' or '1' = '1"; String sql = "select * from t_user where username = '" + value +"'"; ResultSet rs = st.executeQuery(sql); if(rs.next()){ System.out.println(rs.getString("username"); // 这里则会转换成 }

这种骗子了应用机制如此一来加督导了非预计的查询的道德上,没多久称为SQL流入

要应付有两种方案

从模板应付,对客户端的转换成来进行特定规范的接收者让客户端的所撰参不策划SQL解释器的机制代码

非常应该可用第二种借助商

PreparedStatement并不一定就可以完美管控流入疑虑,在可用时只能先行将SQL解释器来进行机制代码,只能客户端所撰参的地方用比如说由此可知替代,机制代码后如此一来将差值所撰到起初的比如说由此可知中都

public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testDb"; String username = "root"; String password = "12345678"; Connection connection = DriverManager.getConnection(url, username, password); String sql = "select * from t_user where username = ?"; PreparedStatement ps = connection.prepareStatement(sql); // 将起初则会导致SQL流入的差值通过资料库所撰到比如说由此可知 ps.setString(1, "' or '1' = '1"); ResultSet resultSet = ps.executeQuery(); while (resultSet.next()) { System.out.println("留言板:" + resultSet.getString("username")); } resultSet.close(); ps.close(); connection.close();}

前面这段标识由此可知督导后不则会有任何转换成

PreparedStatement很好,但是有一种情况下是无法付诸的,比如要求order by队列付诸实时的升降自序,asc和desc不策划机制代码就无法办法可用,这时候只能用Statement来主观付诸客户端的SQL流入

对比总结两种转换并不一定Statement存在SQL流入疑虑,PreparedStatement应付了流入疑虑Statement是督导一次机制代码一次,而PreparedStatement是机制代码一次,督导多次,高效率较低PreparedStatement拥有可执行机制代码检查,比如比如说由此可知要求中都叶String,就不能中都叶其他数据库类型,机制代码器则会报错,相容性较低能可用PreparedStatement尽量可用,只有当只能主观道德上上的SQL流入时如此一来可用StatementJDBC中都的职责

在JDBC中都,职责道德上默认备用提交,只要督导若有的DML解释器,就则会备用提交一次。这种道德上赞同不由此可知合实际业务部门开发, 一个业务部门中都不太可能自带括多条DML解释器,必须满足同时尝试或者同时收场

可以通过Connection并不一定的setAutoCommit(false)方法有,中都叶false来关停备用提交职责,在业务部门程自序中都,正常逻辑下可用Connection.commit()方法有来进行职责提交,用try catch标识由此可知块猎捕异常后可用Connection.rollback()方法有来进行职责回滚

职责模拟(DQL用executeQuery,DML可用executeUpdate,自带括增删恢复原)

// 其他标识由此可知附注 Connection connection = DriverManager.getConnection(url, username, password); connection.setAutoCommit(false); String sql = "delete from t_user where id = 3;"; PreparedStatement ps = connection.prepareStatement(sql); int i = ps.executeUpdate(); if (i == 1) { System.out.println("删减尝试"); } ps.close(); connection.close();

尝试删减id为3的客户端,标识由此可知督导后,控制台则会转换成删减尝试

但是去查看目录并无法数据库删减,说明JDBC的备用提交职责被尝试关停了

确实的管控场景,在所有预计职责督导完毕后来进行职责提交,catch异常后来进行职责的回滚

// 其他标识由此可知附注 Connection connection = DriverManager.getConnection(url, username, password); connection.setAutoCommit(false); PreparedStatement ps = null; try { String sql = "delete from t_user where id = 3;"; ps = connection.prepareStatement(sql); int i = ps.executeUpdate(); if (i == 1) { System.out.println("删减尝试"); } connection.commit(); } catch (Exception e) { connection.rollback(); } if (Objects.nonNull(ps)) { ps.close(); } connection.close();

在真实的开发场景中都,并不则会可用原生的JDBC去付诸业务部门管控,主流的有MyBatis和JPA等ORM开放性来帮助短时间内开发,但是最上层都是基于JDBC的积体电路,只有与众不同JDBC才能非常加明晰的掌握开放性的可用

页面:

杭州妇科
太原儿科专家
长沙白癜风医院挂号
太原性病医院哪家最好
贵阳看风湿哪个专科医院好
眼睛疲劳怎么恢复比较快
乳腺增生
小儿氨酚烷胺颗粒
去火药
急性腹泻呕吐吃什么药效果好
太狠了,Spring全家桶笔记,一站式过关全攻略,已入职某厂涨薪18K

Spring 已然成为 Ja 后端开发事实上的行业标准,为了让你把知识点掌握得格外牢固,忽略得格外透彻。现在给大家安利下spring家中桶资料。书上免费获取Spring核心日记 ...

友情链接