1:JDBC开发步骤
1.1 JDBC代码开发步骤
Remark:下列代码在实际开发中都需要Try catch finally来抓取异常
1:注册驱动
2:获取链接
3:获得语句执行平台
4:执行SQL语句
5:处理结果
6:释放资源
1.2 JDBC代码的实现-简单的增删改(INSERT/UPDATE /DELETE)
(注意:在实现代码之前需要在Eclipse中导入SQL驱动Jar包)
PS:该代码中第四部和第五步实现步骤不同 其他的基本相似
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JDBCDemo { public static void main(String[] args) throws Exception { //main方法为static 所以它只能调用静态static方法 JDBCutils(); } public static void JDBCutils() throws Exception { //1:注册驱动 //Class.forName为反射技术 Class.forName("com.mysql.jdbc.Driver"); //2:获取链接 String url = "jdbc:mysql://服务器ip:3306/Web08"; String user = "root"; String password = "密码"; //用Java.sql包下面的DriverManager类调用getConnection方法试图建立到给定数据库 URL的连接,返回static Connection对象 Connection con = DriverManager.getConnection(url, user, password); //3:获得语句执行平台 //调用Connection接口实现方法createStatement() 创建一个 Statement对象来将 SQL 语句发送到数据库 返回值为Statement对象 Statement stam = con.createStatement(); //4:执行SQL语句 //调用Statement接口对象的实现方法executeUpdate() 进行SQL语句的执行,返回值为int,executeUpdate()执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句 int row = stam.executeUpdate("UPDATE product SET pname='wokao' WHERE pid=5;"); //5:处理结果 //返回值row为SQL中受影响的行数 System.out.println(row); //6:释放资源 //int对象资源不用关闭 stam.close(); con.close(); } } |
1.3 JDBC代码的实现-简单的查询并遍历数据打印控制台(SELECT)
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JDBC_Select { public static void main(String[] args) throws Exception {
JDBCSelect("jdbc:mysql://服务器ip:3306/Web08","root","密码","SELECT * FROM product;"); }
public static void JDBCSelect(String url, String username,String password,String sql) throws Exception { //1:注册驱动 //Class.forName()为发射技术 Class.forName("com.mysql.jdbc.Driver"); //2:获取链接 //调用DriverManager的类方法getConnection(String url, String username,String password)来获取数据库的链接,返回Connection接口对象实现方法 Connection con = DriverManager.getConnection(url, username, password); //3:获得语句执行平台 //调用Connection接口实现方法createStatement()获取语句执行平台,createStatement()创建一个 Statement 对象来将 SQL 语句发送到数据库 Statement stam = con.createStatement(); //4:执行SQL语句 //调用Statement接口对象实现方法 executeQuery(String sql),执行给定的 SQL 语句,该语句返回单个 ResultSet 对象可以进行SELECT操作,返回值为ResultSet接口对象实现方法 ResultSet rs = stam.executeQuery(sql); //5:处理结果 //ResultSet接口对象中是实现方法next()可以返回 boolean类型值 true表示读取到数据 false表示没有读取到数据 while(rs.next()) { //ResultSet接口对象中的实现方法getXXX()方法可以按照列 或者列名来读取数据 System.out.println(rs.getObject("pid")+" "+rs.getObject("pname")+" "+rs.getObject("price")+" "+rs.getObject("pdate")); } //6:释放资源 rs.close(); stam.close(); con.close(); } } |
1.4 JDBC注入隐患-简单的查询(SELECT)
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class Sql_safer { public static void main(String[] args) throws Exception { safer(); } public static void safer() throws Exception { //1:注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2:获取链接 String url = "jdbc:mysql://服务器ip:3306/Web08"; String user = "root"; String password = "密码"; Connection con = DriverManager.getConnection(url, user, password); //3:获得语句执行平台 Statement stam = con.createStatement(); //4:执行SQL语句 //下面这一句SQL语句在查询是会全部查询出来,这个就是SQL的漏洞之一,输出结果会将所有的pid和pname全部输出来。 String sql = "SELECT * FROM product WHERE pid=1 AND pname='xx' OR 1=1;"; ResultSet rs = stam.executeQuery(sql); //5:处理结果 while(rs.next()) { System.out.println(rs.getObject("pid")+""+rs.getObject("pname")); } //6:释放资源 rs.close(); stam.close(); con.close(); } } |
1.5 JDBC PreparedStatement预编译防止漏洞
PS:使用PreparedSatement接口的实现方法preparesatement(String sql)对sql语句进行预编译处理可以有效防止漏洞
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class PreparedSataementDemo { public static void main(String[] args) throws Exception{ PreparedstatementDemo(7,"rt"); } public static void PreparedstatementDemo(int pid,String pname) throws Exception { // 1:注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2:获取链接 String url = "jdbc:mysql://服务器ip:3306/Web08"; String user = "root"; String password = "密码"; Connection con = DriverManager.getConnection(url, user, password); // 3:获得语句执行平台 ////调用Statement接口中的子接口PreparedStatement的实现方法prepareStatement(String sql)同时获得语句执行平台 并执行sql语句 // 4:执行SQL语句 //调用Statement接口中的子接口PreparedStatement的实现方法prepareStatement(String sql)对SQL语句进行预编译 返回值为PreparedStatement接口对象 //sql语句中的?为占位符,可以用子接口PreparedStatement的实现方法setxxx()来对占位符进行设置。 String sql = "SELECT * FROM product WHERE pid=? AND pname=?"; PreparedStatement pstam = con.prepareStatement(sql); pstam.setInt(1, pid); pstam.setString(2, pname); // 5:处理结果 //PreparedStatement接口也有executeQuery()方法 只不过不用在该方法中加入sql语句,这里相当于是对结果的处理,调用他的返回值ResultSet接口对象的实现方法next()和getxxx()实现输出 ResultSet rs = pstam.executeQuery(); if(rs.next()) { System.out.println(rs.getObject("pid")+""+rs.getObject("pname")); }else { System.out.println("用户名或者密码不正确"); } // 6:释放资源 rs.close(); pstam.close(); con.close(); } } |
1.6 JDBC PreparedStatement预编译修改SQL表单内容
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class updatePerparedStatement { public static void main(String[] args) throws Exception { updatePreparedStatement(); } public static void updatePreparedStatement() throws Exception { //1:注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2:获取链接 String url = "jdbc:mysql://服务器ip:3306/Web08"; String user = "root"; String password = "密码"; Connection con = DriverManager.getConnection(url, user, password); //3:获得语句执行平台 String sql = "UPDATE product SET pname=?, price=? WHERE pid=?;"; PreparedStatement pstam = con.prepareStatement(sql); //setObject()为通用的方法,上面的sql语句有3个占位符 所以需要setxxx()3次 pstam.setObject(1,"love you"); pstam.setObject(2, "521"); pstam.setObject(3, 3); //4:执行SQL语句 //executeUpdate()方法用于sql的update操作,executeQuery()用来执行sql的select、insert,delete操作 int row = pstam.executeUpdate(); //5:处理结果 //6:释放资源 pstam.close(); con.close(); } } |
1.7 JDBC PreparedStatement预编译查询SQL表单内容
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class PreparedStatementSelect { public static void main(String[] args) throws Exception { PreparedStatementSelect(); } public static void PreparedStatementSelect() throws Exception { //1:注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2:获取链接 String url = "jdbc:mysql://服务器ip:3306/Web08"; String user = "root"; String password = "密码"; Connection con = DriverManager.getConnection(url, user, password); //3:获得语句执行平台 String sql = "SELECT * FROM product;"; PreparedStatement pstam = con.prepareStatement(sql); //4:执行SQL语句 ResultSet rs = pstam.executeQuery(); //5:处理结果 while(rs.next()) { System.out.println(rs.getObject("pid")+" "+rs.getObject("pname")+" "+rs.getObject("price")+" "+rs.getObject("pdate")); } //6:释放资源 rs.close(); pstam.close(); con.close(); } } |
1.8 JDBC调用properties配置文件
配置文件入下 一般放置在../src/xxx.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://服务器ip:3306/Web08 username=root password=密码 |
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ResourceBundle; import org.junit.Test; public class propertiesDemo { private static String driver; private static String url; private static String username; private static String password; //静态代码快 调用函数时自动加载 static { ResourceBundle bundle = ResourceBundle.getBundle("db"); driver = bundle.getString("driver"); url = bundle.getString("url"); username = bundle.getString("username"); password = bundle.getString("password"); } //2:获取链接 public static void testProperties(){ try { //1:注册驱动 Class.forName(driver); //2:获取链接 Connection con = DriverManager.getConnection(url, username, password); //3:获得语句执行平台 String sql = "SELECT * FROM product WHERE pid=?;"; PreparedStatement pstam = con.prepareStatement(sql); pstam.setString(1, "p004"); //4:执行SQL语句 ResultSet rs = pstam.executeQuery(); // 5:处理结果 while(rs.next()) { System.out.println(rs.getString("pname")); } //6:释放资源 rs.close(); pstam.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } } |
1.9 JDBC调用读取数据库数据封装在sort类中
配置文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://服务器ip:3306/Web08 username=root password=密码 |
Sort类,用来封装数据库数据 保存在List集合中
package Sortlist; public class Sort { private String pid; private String pname; private Double price; private String category_id; public Sort(String pid, String pname, Double price, String category_id) { this.pid = pid; this.pname = pname; this.price = price; this.category_id = category_id; } public Sort() {} public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public String getCategory_id() { return category_id; } public void setCategory_id(String category_id) { this.category_id = category_id; } public String toString() { return "Sort [pid=" + pid + ", pname=" + pname + ", price=" + price + ", category_id=" + category_id + "]"; } } |
JDBC代码将读取的数据封装到sort类中 并保存在Arraylist集合中 增强for遍历输出
package JDBC_Sort; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import Sortlist.Sort; public class JDBC_Sortlist { private static String driver; private static String url; private static String username; private static String password; //静态代码快 调用函数时自动加载配置表内容 static { ResourceBundle bundle = ResourceBundle.getBundle("db"); driver = bundle.getString("driver"); url = bundle.getString("url"); username = bundle.getString("username"); password = bundle.getString("password"); } public static void JDBCSort() { try { // 1:注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2:获取链接 Connection con = DriverManager.getConnection(url, username, password); // 3:获得语句执行平台 PreparedStatement pst = con.prepareStatement("SELECT * FROM product;"); // 4:执行SQL语句 ResultSet rs = pst.executeQuery(); //System.out.println(rs.next()); // 5:处理结果 // 创建Arraylist集合保存Sort对象 List<Sort> list = new ArrayList<Sort>(); while (rs.next()) { // 调用Sort类的有参构造方法 往Sort对象中出入读取到的结果 Sort s = new Sort(rs.getString("pid"), rs.getString("pname"), rs.getDouble("price"), rs.getString("category_id")); // 将读取到的结果添加到Arraylist集合对象list中 list.add(s); } for (Sort s : list) { System.out.println(s); } rs.close(); pst.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } } |
Test main函数
package JDBC_Sort; public class Test { public static void main(String[] args) { JDBC_Sortlist.JDBCSort(); } } |
加QQ群:764333814(刚成立的新群)免费获取更多资料