JDBC编程——建立连接,并简单操作
JDBC:Java DataBase Connectivity standard
1.首先下载连接MySQL的驱动
2.创建数据库的用户名和密码文件,易于统一管理
day1/xxx.properties
1 user=root 2 password = root
3.获得propertiese对象
1 // 获取数据库的用户名和密码 2 Properties prop = new Properties(); 3prop.load(Inserte.class 4 .getResourceAsStream("/day1/database.properties"));
4.添加驱动,连接数据库
1 Class.forName("com.mysql.jdbc.Driver"); 2 // 建立连接 3 conn = DriverManager.getConnection( 4 "jdbc:mysql://localhost:3306/com.xhm.sql", prop);
5.获得数据库操作对象
1 // 获取执行SQL对象 2 stmt = conn.createStatement();
6.执行sql语句,进行增删检查
6.1插入SQL语句格式如下:
1 INSERT [INTO] tablename VALUES (expression[,...n]); 2 其中INTO是可选的,tablename是表明称,在VALUES后的括号放入插入的数据,和建表的要类型要对应,并按顺序插入如: 3 inser into student values(1,'Lee',30);
6.2修改操作SQL语句格式如下:
1 UPDATE tablename SET columnname = {expression}[,...n] WHERE<search_condition> 2 使用该语句为修改名称为columnname列的值,expression为指定的值,WHERE为修改的对象的条件,如果没有会对所有的对象经行修改。 3 如下: 4 UPDATE tablename SET age = 34 WHERE name = 'Tom';
6.3删除操作SQL语句格式如下:
1 DELETE [FROM] tablename WHERE search_condition 2 和修改一样需要给出条件,否则将全部删除了
6.4查询操作SQL语句格式如下:
1 SELECT select_list FROM tablename[WHERE search_condition][GROUP BY group_by_expression][HAVING search_condition][ORDER BY order_expression[ASC|DESC]] 2 其中的“select_list”表示要查询哪些列,如果使用了*表示查询所有列,WHERE后面是查询条件。返回的是一个ResultSet对象,使用.next()来遍历。rs对象初始化时在第一个数据前即:-1.
1 // 执行sql语句返回的是执行的次数,用于添加,更新,删除 2 row = stmt.executeUpdate(sql); 3 //执行sql查询语句,用于查询 4 resultset = stmt.executeQuery(sql);
7.使用后,需要关闭数据库的连接和数据库操作对象的连接
1 finally { 2 try { 3 if (stmt != null) { 4 stmt.close(); 5 } 6 } catch (Exception e2) { 7 // TODO: handle exception 8 System.out.println("关闭Statement对象出现的问题!"); 9 } finally { 10 try { 11 if (conn != null) { 12 conn.close(); 13 } 14 } catch (Exception e3) { 15 // TODO: handle exception 16 System.out.println("关闭数据库连接时出现问题!"); 17 } 18 }
完整代码如下:
1 package day1; 2 3 import java.io.IOException; 4 import java.sql.Connection; 5 import java.sql.DriverManager; 6 import java.sql.SQLException; 7 import java.sql.Statement; 8 import java.util.Properties; 9 10 public class Inserte { 11 public int Insert() { 12 int row = 0; 13 Connection conn = null; 14 Statement stmt = null; 15 // 加载驱动 16 try { 17 /** 18 * 建议使用这种方法来加载用户名和密码,易于修改和管理 建立一个.properties文件,然后填入键值对 user = root 19 * password = root 20 */ 21 // 获取数据库的用户名和密码 22 Properties prop = new Properties(); 23 prop.load(Inserte.class 24 .getResourceAsStream("/day1/database.properties")); 25 Class.forName("com.mysql.jdbc.Driver"); 26 // 建立连接 27 conn = DriverManager.getConnection( 28 "jdbc:mysql://localhost:3306/com.xhm.sql", prop); 29 // 获取执行SQL对象 30 stmt = conn.createStatement(); 31 // 定义插入SQL语句 32 String sql = "insert into student values(6,'Perike',50)"; 33 // 执行sql语句返回的是执行的次数 34 row = stmt.executeUpdate(sql); 35 //执行sql查询语句 36 //stmt.executeQuery(sql); 37 //System.out.println("row=" + row); 38 } catch (ClassNotFoundException e) { 39 // TODO Auto-generated catch block 40 e.printStackTrace(); 41 } catch (SQLException e) { 42 // TODO Auto-generated catch block 43 e.printStackTrace(); 44 } catch (IOException e) { 45 // TODO Auto-generated catch block 46 e.printStackTrace(); 47 } finally { 48 try { 49 if (stmt != null) { 50 stmt.close(); 51 } 52 } catch (Exception e2) { 53 // TODO: handle exception 54 System.out.println("关闭Statement对象出现的问题!"); 55 } finally { 56 try { 57 if (conn != null) { 58 conn.close(); 59 } 60 } catch (Exception e3) { 61 // TODO: handle exception 62 System.out.println("关闭数据库连接时出现问题!"); 63 } 64 } 65 } 66 return row; 67 } 68 }
7.预编译语句,防止注入攻击
7.1SQL注入攻击:
1 String name = "Tom"; 2 String sql = "select * from student where name = ' "+name+" ' "; 3 实际SQL语句为:select * from student where name = 'Tom' 4 //当改变name内容时, 5 String name = "Tom 'or' a'='a"; 6 String sql = "select * from student where name = "+name+""; 7 实际SQL语句为:select *from student where name = 'Tom' or 'a' = 'a'即select * from student
7.2使用PerpareStatement
1 /** 2 * PrepareStatement创建SQL语句时候就会编译, 3 * 存储在PrepareStatement对象中,所以当需要多次 4 * 执行同一SQL语句的时候,使用他可以大大增加效率。 5 */ 6 String sql = "select * from student where name = ?"; 7 PreparedStatement pstmt = conn.prepareStatement(sql); 8 //设置sql中的问号,从1开始计算 9 pstmt.setString(1,"Tom"); 10 ResultSet rs = pstmt.execute(sql);
工具类:
1 /************************* 2 *@author 徐宏明 E-Mail:android_xhm.126.com 3 * QQ:294985925 4 *@version 创建时间 :2013-5-19 下午11:54:34 5 * 6 *@see 7 *************************/ 8 package day1; 9 10 import java.sql.Connection; 11 import java.sql.DriverManager; 12 import java.sql.ResultSet; 13 import java.sql.SQLException; 14 import java.sql.Statement; 15 16 /** 17 * JDBC工具类,连接数据库 18 * 19 * @author 宏明 20 * 21 */ 22 public class DBConnection { 23 // 驱动类名 24 private static final String DBDRIVER = "com.mysql.jdbc.Driver"; 25 // 连接URL 26 private static final String DBURL = "jdbc:mysql://localhost:3306/javaweb"; 27 // 数据库的用户名 28 private static final String DBUSER = "root"; 29 // 数据库的密码 30 private static final String DBPASSWORD = "root"; 31 // 静态块,用来加载驱动 32 static { 33 try { 34 Class.forName(DBDRIVER); 35 } catch (ClassNotFoundException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 System.out.println("加载驱动失败!!!"); 39 } 40 } 41 42 /** 43 * 建立获取连接的方法 44 * 45 * @return 数据库连接对象 46 */ 47 public static Connection getConnection() { 48 Connection conn = null; 49 try { 50 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD); 51 } catch (SQLException e) { 52 // TODO Auto-generated catch block 53 e.printStackTrace(); 54 System.out.println("发生连接异常!!!"); 55 } 56 return conn; 57 } 58 59 /** 60 * 关闭数据库连接 61 * 62 * @param conn 63 * 数据库连接 64 */ 65 public static void closeConn(Connection conn) { 66 if (conn != null) { 67 try { 68 conn.close(); 69 } catch (SQLException e) { 70 // TODO Auto-generated catch block 71 e.printStackTrace(); 72 System.out.println("关闭数据库发生异常!!!"); 73 } 74 } 75 } 76 77 /** 78 * 关闭数据库操作对象 79 * 80 * @param stmt 81 * 数据库操作对象 82 */ 83 public static void closeStmt(Statement stmt) { 84 if (stmt != null) { 85 try { 86 stmt.close(); 87 } catch (SQLException e) { 88 // TODO Auto-generated catch block 89 e.printStackTrace(); 90 System.out.println("关闭数据库操作对象发生异常!!!"); 91 } 92 } 93 } 94 95 /** 96 * 关闭结果集方法 97 * 98 * @param rs 99 * 结果集 100 */ 101 public static void closeRs(ResultSet rs) { 102 if (rs != null) { 103 try { 104 rs.close(); 105 } catch (SQLException e) { 106 // TODO Auto-generated catch block 107 e.printStackTrace(); 108 System.out.println("关闭结果集发生异常!!!"); 109 } 110 } 111 } 112 }