某科:Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
我:接口,熟悉的java,熟悉的味道,熟悉的配方。面向这套接口,开发人员和各大数据库厂商,例如MysqlOracle、SqlSever等进行调用和实现。各个数据库厂家均有自己的实现类,就包含在各种.jar文件当中,这些.jar文件也被亲切的称为驱动。
2、Jdbc传统的步骤包含哪些?1)注册驱动
Driver driver = new com.mysql.jdbc.Driver() DriverManger.registerDriver(driver)
2)获取连接
String url = "jdbc:mysql://localhost.3306/ssm_book"; String user = "root"; String password = "123456"; Connection conn = DriverManger.getConnection(url,user,password);
3)创建数据库 *** 作对象
// 创建数据库 *** 作对象 Statement sttm = conn.createStatement();
4)执行sql
// 插入数据 String sql = "insert into books(bookID,bookName,bookCounts) values(1,"java",20)"; // 修改数据 String sql = "update books set bookName ='Mysql' where bookID =1"; // 删除数据 String sql = "delete from books where bookName = 'Mysql'"; // executeUpdate(sql)执行插入、删除、更新,返回一个int表示执行一条sql sttm.executeUpdate(sql);
5) 查询结果集
// 查询数据 String sql = "select * from books"; // executeQuery(sql)执行查询 ResultSet rs = sttm.executeQuery(sql); while(rs!=null){ String bookID = rs.getString("bookID"); String bookName = rs.getString("bookName"); String bookCounts = rs.getString("bookCounts"); System.out.println(bookID+" "+bookName+" "+bookCounts+" "+detail); }
6)释放资源
finally { //释放资源 try{ if(sttm!=null){ sttm.close(); } }catch (Exception e){ e.printStackTrace(); } try{ if (conn!=null){ conn.close(); } }catch (Exception e){ e.printStackTrace(); } }3、传统六步当中为什么会出现缺陷?
根据上面的步骤,可以看到sql语句的编写和拼接是在sql被编译之前完成的,这就相当于暴露了一个给用户编写在程序外面编写sql从而可能会更改原来的sql *** 作的机会。
比如这样:模拟验证登录
1、用户表
2、查询 *** 作
// 从输入端获取到 用户名和密码 String userName = userInfo.get("loginName"); String userpwd = userInfo.get("loginpwd"); // 验证用的sql String sql = "select * from user where userName='"+userName+"'and userpwd ='"+userpwd+"'";
3、正常输入情况
select * from user where userName='ling'and userpwd ='1234'
4、非正常情况(sql注入)
select * from user where userName='jiu'and userpwd ='jiu' or '1'='1'
以上,通过在输入密码时加入or关键字从而改变sql原意的方法被称为sql注入。显然,sql注入具有非常大的隐患。
3、为什么采用了预编译的方式就可以解决Sql注入的问题呢?回答这个问题之前,先看三点。。。
上面的漏洞之所以会出现,是在语句的编译发生在语句拼接之后的基础上的。如果有一种办法可以让sql语句的拼接发生在语句的编译之后,问题自然就不存在了。
//4、sql语句 String sql = "select * from user where userName= ? and userpwd = ?"; //5、创建数据库 *** 作对象,编译sql ps = conn.prepareStatement(sql); //6、给占位符传值 ps.setString(1,loginName); ps.setString(2,loginpwd); //7、执行预编译 *** 作对象 ResultSet rs = ps.executeQuery();
上面用预编译数据库对象preparedStatement替换数据库 *** 作Statement,并且通过占位符的方式替换之前需要拼接的地方解决了sql注入的问题,需要拼接的地方在sql语句的框架编译之后通过getString(占位符位置序号,值)进行传值。相当nice!!!!!!!!!
4、数据库的配置文件这种东西又为什么出现呢?问,什么是第一生产力?
答:no~no~no~ 在程序员的世界里,解耦才是第一生产力。
在传统的jdbc步骤中,Driver驱动的创建依赖于子类对象,这种依赖性在需要修改数据库时表现的不友好,因此想到利用反射机制创建对象并且利用资源绑定器同意将需要改动的地方放到一个文件中,也就是俗称的配置文件(.properties或者.xml)文件中。
1、配置文件database.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/ssm_book?useSSL=false user=root password=123456
2、资源绑定器读取database.properties
//读取配置文件 ResourceBundle bundle = ResourceBundle.getBundle("db"); String driver = bundle.getString("driver"); String url = bundle.getString("url"); String user = bundle.getString("user"); String password = bundle.getString("password");
3、反射注册驱动以及创建连接
//1、注册驱动 Class.forName(driver); //2、获取连接 conn = DriverManager.getConnection(url,user,password); 5、总结
以上是本人在jdbc学习中的总结,如有错误请指出!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)