JDBC练习测试

Util类  
Java代码   收藏代码
  1. package tarena.util;  
  2.   
  3.   
  4.   
  5. import java.io.InputStream;  
  6.   
  7. import java.sql.Connection;  
  8.   
  9. import java.sql.DriverManager;  
  10.   
  11. import java.sql.ResultSet;  
  12.   
  13. import java.sql.SQLException;  
  14.   
  15. import java.sql.Statement;  
  16.   
  17. import java.util.Properties;  
  18.   
  19.   
  20.   
  21. public class DBUtil {  
  22.   
  23.     private static final String URL;  
  24.   
  25.     private static final String DRIVER;  
  26.   
  27.     private static final String USERNAME;  
  28.   
  29.     private static final String PASSWORD;  
  30.   
  31.       
  32.   
  33.     private static ThreadLocal threadLocal =   
  34.   
  35.         new ThreadLocal();  
  36.   
  37.       
  38.   
  39.     static {  
  40.   
  41.         try {  
  42.   
  43.             InputStream in = DBUtil.class.getResourceAsStream("/db.properties");  
  44.   
  45.             Properties props = new Properties();  
  46.   
  47.             props.load(in);  
  48.   
  49.             in.close();  
  50.   
  51.               
  52.   
  53.             URL=props.getProperty("url");  
  54.   
  55.             DRIVER=props.getProperty("driver");  
  56.   
  57.             USERNAME=props.getProperty("username");  
  58.   
  59.             PASSWORD=props.getProperty("password");  
  60.   
  61.             Class.forName(DRIVER); // 注册驱动  
  62.   
  63.         } catch(Exception e) {  
  64.   
  65.             System.out.println("无法获得数据库连接信息");  
  66.   
  67.             throw new RuntimeException(e);  
  68.   
  69.         }  
  70.   
  71.     }  
  72.   
  73.       
  74.   
  75.     private DBUtil() {}  
  76.   
  77.       
  78.   
  79.     public static Connection open() throws SQLException{  
  80.   
  81.         return DriverManager.getConnection(  
  82.   
  83.                 URL,USERNAME,PASSWORD);  
  84.   
  85.     }  
  86.   
  87.       
  88.   
  89.     public static void close(  
  90.   
  91.             Connection con,  
  92.   
  93.             Statement stmt,  
  94.   
  95.             ResultSet rs) {  
  96.   
  97.         try {rs.close();} catch(Exception e) {}  
  98.   
  99.         try {stmt.close();} catch(Exception e) {}  
  100.   
  101.         try {con.close();} catch(Exception e) {}  
  102.   
  103.     }  
  104.   
  105.       
  106.   
  107.     public static Connection openInThread() throws SQLException{  
  108.   
  109.         Connection con =   
  110.   
  111.             (Connection)threadLocal.get();  
  112.   
  113.         if(null == con) {  
  114.   
  115.             con = open();  
  116.   
  117.             threadLocal.set(con);  
  118.   
  119.         }  
  120.   
  121.         return con;  
  122.   
  123.     }  
  124.   
  125.       
  126.   
  127.     public static void closeInThread() {  
  128.   
  129.         try {  
  130.   
  131.             Connection con = openInThread();  
  132.   
  133.             con.close();  
  134.   
  135.             threadLocal.remove();  
  136.   
  137.         } catch(Exception e) {}  
  138.   
  139.     }  
  140.   
  141. }  


测试类  
Java代码   收藏代码
  1. package day02;  
  2.   
  3.   
  4.   
  5. import java.sql.Connection;  
  6.   
  7. import java.sql.PreparedStatement;  
  8.   
  9. import java.sql.ResultSet;  
  10.   
  11. import java.sql.Statement;  
  12.   
  13. import java.util.Scanner;  
  14.   
  15.   
  16.   
  17. import tarena.util.DBUtil;  
  18.   
  19.   
  20.   
  21. public class JDBCTest3 {  
  22.   
  23.     public static void main(String[] args) throws Exception {  
  24.   
  25.         test1();  
  26.   
  27.     }  
  28.   
  29.   
  30.   
  31.     static void test1() throws Exception  {  
  32.   
  33.         Connection con = null;  
  34.   
  35.         Statement stmt = null;  
  36.   
  37.         try {  
  38.   
  39.             con = DBUtil.openInThread();  
  40.   
  41.             con.setAutoCommit(false);  
  42.   
  43.             // 输入员工数据保存  
  44.   
  45.             // 如果姓名存在,删除再插入新数据  
  46.   
  47.             // 如果不存在,直接插入新数据  
  48.   
  49.             Emp emp = inputEmp();  
  50.   
  51.             if(nameExist(emp.getFirstName(), emp.getLastName())) {  
  52.   
  53.                 deleteByName(emp.getFirstName(), emp.getLastName());  
  54.   
  55.             }  
  56.   
  57.             save(emp);  
  58.   
  59.             con.commit();  
  60.   
  61.         } catch(Exception e) {  
  62.   
  63.             con.rollback();  
  64.   
  65.             throw e;  
  66.   
  67.         } finally {  
  68.   
  69.             DBUtil.closeInThread();  
  70.   
  71.         }  
  72.   
  73.     }  
  74.   
  75.   
  76.   
  77.     private static void save(  
  78.   
  79.             Emp emp) throws Exception {  
  80.   
  81.         Connection con = DBUtil.openInThread();  
  82.   
  83.         PreparedStatement pstmt =   
  84.   
  85.             con.prepareStatement(  
  86.   
  87.                     "insert into s_emp(id,first_name, last_name, salary) " +  
  88.   
  89.                     "values(?,?,?,?)");  
  90.   
  91.         pstmt.setInt(1, emp.getId());  
  92.   
  93.         pstmt.setString(2, emp.getFirstName());  
  94.   
  95.         pstmt.setString(3, emp.getLastName());  
  96.   
  97.         pstmt.setDouble(4, emp.getSalary());  
  98.   
  99.         pstmt.executeUpdate();  
  100.   
  101.     }  
  102.   
  103.     private static void deleteByName(String firstName, String lastName) throws Exception {  
  104.   
  105.         Connection con = DBUtil.openInThread();  
  106.   
  107.         PreparedStatement pstmt =   
  108.   
  109.             con.prepareStatement(  
  110.   
  111.                     "delete from s_emp " +  
  112.   
  113.                     "where first_name=? " +  
  114.   
  115.                     "and last_name=?");  
  116.   
  117.         pstmt.setString(1, firstName);  
  118.   
  119.         pstmt.setString(2,lastName);  
  120.   
  121.         pstmt.executeUpdate();  
  122.   
  123.     }  
  124.   
  125.     private static boolean nameExist(String firstName, String lastName) throws Exception {  
  126.   
  127.         Connection con = DBUtil.openInThread();  
  128.   
  129.         PreparedStatement pstmt =   
  130.   
  131.             con.prepareStatement(  
  132.   
  133.                     "select * from s_emp " +  
  134.   
  135.                     "where first_name=? " +  
  136.   
  137.                     "and last_name=?");  
  138.   
  139.         pstmt.setString(1, firstName);  
  140.   
  141.         pstmt.setString(2,lastName);  
  142.   
  143.         ResultSet rs = pstmt.executeQuery();  
  144.   
  145.         // 指针下移有数据,即存在同名员工  
  146.   
  147.         boolean exist = rs.next();  
  148.   
  149.         rs.close();  
  150.   
  151.         pstmt.close();  
  152.   
  153.         return exist;  
  154.   
  155.     }  
  156.   
  157.   
  158.   
  159.     private static Emp inputEmp() {  
  160.   
  161.         Scanner sc = new Scanner(System.in);  
  162.   
  163.         System.out.print("请输入id:");  
  164.   
  165.         int id = sc.nextInt();  
  166.   
  167.         System.out.print("请输入first name:");  
  168.   
  169.         String fname = sc.next();  
  170.   
  171.         System.out.print("请输入last name:");  
  172.   
  173.         String lname = sc.next();  
  174.   
  175.         System.out.print("请输入salary:");  
  176.   
  177.         double sal = sc.nextDouble();         
  178.   
  179.         Emp e = new Emp(id,fname,lname,sal);  
  180.   
  181.         return e;  
  182.   
  183.     }  
  184.   
  185. }  

引用

元数据 

数据连接元数据 

DatabaseMetadata 

数据库品牌、版本 

表..... 

结果集的元数据 

ResultSetMetadata 

列 

getColumnCount() - 结果集中字段数量 

getColumnName(序号) - 指定字段的名字 

getColumnType(序号) - 指定字段的类型数字编号 

使用Types中的常量做判断 

getColumnTypeName(序号) - 指定字段的类型名称 



java.sql.Types 

封装表示字段类型的数字变号常量 

Types.DATE - 年月日 

Types.TIME - 时分秒 

Types.TIMESTAMP - 年月日时分秒 



ResultSet 

数据传输量 

setFetchSize(数据行数) 

0 - JDBC驱动自行决定每次抓取的数据量 



int age = rs.getInt("age"); 

// 刚取出的字段中数据在数据表中是否为null 

boolean b = rs.wasNull(); 

double height = rs.getDouble("height"); 

b = rs.wasNull(); 





PreparedStatement 

是Statement的子接口 

比Statement更常用 



1, 预编译的sql语句,重复执行相同的sql语句效率较高 

Java代码   收藏代码
  1. pstmt = con.prepareStatement("select ...");  
  2.   
  3.             pstmt.executeQuery();  
  4.   
  5.             pstmt.executeQuery();  



2, 对sql语句中参数数据进行设置 

Java代码   收藏代码
  1. pstmt = con.prepareStatement(  
  2.   
  3.             "insert into emp(id,name,sal) values(?,?,?)");  
  4.   
  5.         pstmt.setInt(1,4534);  
  6.   
  7.         pstmt.setString(2"1' or '1' = '1");  
  8.   
  9.         pstmt.setDouble(3,5000D);  
  10.   
  11.         pstmt.executeUpdate(); // 执行上面已经设置好的sql语句  
  12.   
  13.           
  14.   
  15.         pstmt.setInt(14535);  
  16.   
  17.         pstmt.executeUpdate();   



3, 不用拼sql,不用处理sql注入 





事务处理 

事务 

1, 启动事务 

无事务:自动提交 auto commit = true 

启动事务:关闭自动提交 auto commit = false 

con.setAtuoCommit(false); 

到达事务上边界 

2, 提交 

con.commit(); 

到达事务下边界 

3, 回滚 

con.rollback(); 

1, 在捕获到异常时执行 

2, 在一定条件下 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值