2.一种是通过DataSourse(数据源/数据库连接池)对象获取。实际应用中会使用DataSourse对象。
//先创建数据库连接池,再通过连接池获取数据库连接对象 DataSource ds=new MysqlDataSource(); //创建数据库连接池:初始化时,就会创建一定数量的数据库连接,这些连接对象可以重复使用,效率更高 //整个url带参数可以只使用setURL方法,也可以用参数调用方法的方式来设置 ((MysqlDataSource)ds).setURL("jdbc:mysql://localhost:3306/kang"); ((MysqlDataSource)ds).setUser("root"); ((MysqlDataSource)ds).setPassword("010124"); ((MysqlDataSource)ds).setUseUnicode(true); ((MysqlDataSource)ds).setCharacterEncoding("UTF-8"); ((MysqlDataSource)ds).setUseSSL(false); conn = ds.getConnection(); System.out.println(conn);
两者区别:
1.DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过Connection.close()都是关闭物理连接
2.DataSourse提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些链接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Connection连接对象回收。效率更高。
2.操作命令对象Statement
Statement对象主要是将SQL语句发送到数据库中,JDBC API中主要提供了三种Statement对象。
Statement: 用于执行不带参数的简单SQL语句(简单的操作命令对象)
PreParedStatement:(预编译的操作命令对象)
用于执行带或者不带参数的SQL语句
SQL语句会预编译在数据库系统
执行速度快于Statement对象
CallableStatement: 用于执行数据库存储过程的调用(存储过程的操作命令对象) 存储过程:就是写一段sql代码,里边可以写变量,循环,条件判断等等。
查询操作:
s = conn.createStatement(); //查询:模拟在页面上,输入学生姓名来搜索学生 //(1)调用Statement操作命令对象的executeQuery(sql) //(2)返回一个ResultSet结果集对象(查询sql执行的结果集) String queryName="孙权";//能正常查询的输入 //(1)调用Statement操作命令对象的executeQuery(sql) //(2)返回一个ResultSet结果集对象(查询sql执行的结果集) String sql="select id,name,chinese,math,english from exam_result where name='"+queryName+"'"; System.out.println(sql); r = s.executeQuery(sql); while (r.next()) {//一直遍历到最后 //进入循环,代表操作遍历的一行数据 int id = r.getInt("id"); String name = r.getString("name"); int chinese = r.getInt("chinese"); int math = r.getInt("math"); int english = r.getInt("english"); System.out.printf("id=%s,name=%s,chinese=%s,math=%s,english=%s\n", id, name, chinese, math, english); }
输出结果:
但是这里有一个现象: 如果我们把这里的queryName改为“skdj’ or ‘1’='1”,在拼接sql字符串时,就可能出现安全问题。 输出结果为:
后面的‘1’=‘1’是一个恒为真的条件,所以就会造成整个or条件结果为真,输出所有成员。 要解决以上安全问题,需要调整以上操作命令对象那个为PreparedStatement,并且使用占位符。
//要解决以上安全问题,需要调整以上操作命令对象那个为PreparedStatement String queryName="skeij' or '1'='1"; int queryId=6; //准备一个带?占位符的sql String sql="select id,name,chinese,math,english from exam_result where name=? or id=?"; ps=conn.prepareStatement(sql);//创建预编译的操作命令对象 //替换占位符:调用setXXX方法,第一个参数,表示第几个占位符(从1开始),第二个参数,表示要替换的值 ps.setString(1,queryName);//替换的值是什么类型,就调用setXXX方法 ps.setInt(2,queryId); //执行sql,需要使用无参的方法 r=ps.executeQuery();
输出结果为:
插入操作:
int queryId=7; String queryName="图图"; int chinese=60; int math=98; int english=79; String sql="insert into exam_result values(?,?,?,?,?)"; ps=conn.prepareStatement(sql); ps.setInt(1,queryId); ps.setString(2,queryName); ps.setInt(3,chinese); ps.setInt(4,math); ps.setInt(5,english); //executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update,insert,delete语句。 int ret=ps.executeUpdate(); System.out.println(ret);
其余的删除,更新操作都与上面类似,这里不再过多演示。
3.ResultSet对象
ResultSet对象它被成为结果集,他代表符合SQL语句条件的所有行,并且它通过一套getXXX方法提供了对这些行中数据的访问。 ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据叫做当前数据行,我们只能来操作当前的数据行。如果想要取得某一条记录,就要使用ResultSet的next()方法,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
//处理结果:结果集可能是多行数据,需要遍历来获取 //调用next就移动到下一行,返回true代表改行有数据,返回false代表该行没有数据 while (r.next()) {//一直遍历到最后 //进入循环,代表操作遍历的一行数据 int id = r.getInt("id"); String name = r.getString("name"); int chinese = r.getInt("chinese"); int math = r.getInt("math"); int english = r.getInt("english"); System.out.printf("id=%s,name=%s,chinese=%s,math=%s,english=%s\n", id, name, chinese, math, english); }
4.总结
主要掌握两种执行SQL的方法:
1.executeQuery()方法执行后返回单个结果集的,通常用于select语句。
2.executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句。
PreparedStatement注意事项:
1.参数化SQL查询
2.占位符不能使用多值
3.占位符:?下标从1开始
4.阻止常见SQL注入攻击
5.SQL预编译
6.性能比Statement高
到此这篇关于MySQL数据库JDBC编程详解流程的文章就介绍到这了,更多相关MySQL JDBC内容请搜索
更多相关Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
认识mysql insert into ... select的锁问题
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。