一、JDBC

  1.简介

       JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,由java编写的一组类和接口组成,接口的实现由各个数据库厂商来完成
       各大数据库厂商对JDBC的API的接口提供实现,即驱动包。

二、JDBC操作
   

1.加载注册驱动
     Class.forName("");
    2.获取数据库连接
     Connection conn=DriverManager.getConnection(String url,String user,String password);
   3.创建语句对象
      Statement st=conn.creatStatement();
   4.执行sql语句
       st.executeUpdate(String sql);
      或者
      ResultSet rs =st.executeQuery(String sql);
   5.获取结果集
       while(rs.next()){
           rs.getObject(列名);
          
       }
       或者
       if(rs.next()){
            rs.getObject(列名);
         }
   6.释放资源

jdbc连接oracle、mysql等主流数据库的驱动类和url

-----------------------------------------------------------
oracle driverClass:oracle.jdbc.driver.OracleDriver
url:jdbc:oracle:thin:@127.0.0.1:1521:dbname
-----------------------------------------------------------
mysql  driverClass:com.mysql.jdbc.Driver
url:jdbc:mysql://localhost:3306/mydbr。
-----------------------------------------------------------
DB2 driverClass:com.ibm.db2.jcc.DB2Driver
url:jdbc:db2://127.0.0.1:50000/dbname
-----------------------------------------------------------
syBase driverClass:com.sybase.jdbc.SybDriver
url:jdbc:sybase:Tds:localhost:5007/dbname
-----------------------------------------------------------
PostgreSQL driverClass:org.postgresql.Driver
url:jdbc:postgresql://localhost/dbname
-----------------------------------------------------------
Sql Server2000 driverClass:com.microsoft.jdbc.sqlserver.SQLServerDriver
url:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname
-----------------------------------------------------------
Sql Server2005 driverClass:com.microsoft.sqlserver.jdbc.SQLServerDriver
url:jdbc:sqlserver://localhost:1433; DatabaseName=dbname
-----------------------------------------------------------




三、DAO设计思想(不直接操作数据库,而是在数据库和业务层之间)
      DAO的实现类实现数据库操作,
      先将数据封装到domain中,在调用dao的方法,把domain作为参数传递过去

四、代码重构
    1.数据库连接对象的操作重复,抽取到JDBCUtil工具类
    2.注册驱动抽取到静态代码块中
    3.释放资源抽取到JDBCUtil
    4.将操作数据库相关字符串抽取到资源文件db.properties

    提取到db.properties文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbcdemo
username=root
password=admin

       JDBCUtil

public class JDBCUtil {                                                                            
    private JDBCUtil(){}                                                                           
    private static Properties p = new Properties();
    static{
        try {
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            InputStream in = classLoader.getResourceAsStream("db.properties");
            p.load(in);
            Class.forName(p.getProperty("driverClassName"));
        } catch (Exception e) {
            e.printStackTrace();
        }  
    }
    public static Connection getConn(){                                                            
        try {                                                                                      
            return DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password"));         
        } catch (Exception e) {                                                                    
            throw new RuntimeException("亲,获取数据库连接失败",e);                                
        }                                                                                          
    } 
    public static void close(Connection conn,Statement st,ResultSet rs){
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (Exception e2) {
            e2.printStackTrace();
        } finally {
            try {
                if (st != null) {
                    st.close();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            } finally {
                try {
                    if (conn != null) {
                        conn.close();
                    }
                } catch (SQLException e2) {
                    e2.printStackTrace();
                }
            }
        }
    }
}


五、预编译语句对象
    Statement: 表示静态SQL语句对象.
    PreparedStatement:Statement的子接口,表示预编译SQL语句对象. 通过占位符(?)来拼SQL.

   

  1.创建预编译语句对象
       PreparedStatement ps=conn.preparedStatement(sql);
     2.设置占位符
        ps.setString(1,"");
     3.执行sql语句
        int executeUpdate()
    ResultSet executeQuery()



六、Statement和PreparedStatement的区别:

 

1).PreparedStatement 代码的可读性和可维护性. (SQL模板,使用占位符表示参数) 
  2).PreparedStatement 能最大可能提高性能. MySQL不支持.
  
 3).PreparedStatement 能保证安全性.
   可以防止SQL注入:
       name='' or 1=1 or ''



七、事务(Transaction 简写为tx)
1.事务的ACID属性
    

 1.原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 (一荣俱荣,一损俱损)
     
     2. 一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏)    
     3. 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
     
      4. 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

2.如何在代码中去处理事务:     
     

 1.在JDBC中,事务是默认提交的.  
      必须先设置事务为手动提交.
connection对象.setAutoCommit(false);//设置事务为手动提交.    
 2.手动的提交事务.
connection对象.commit();     
3.若出现异常必须回滚事务:
   不回滚事务,总余额依然是正确的. 若不回滚事务,不会释放数据库资源.
   connection对象.rollback();

3.JDBC获取自动生成的主键
如何在JDBC中保存数据的时候获取自动生成的主键呢?
----------------------------------------------------------------------

Statement:
int executeUpdate(String sql,int autoGeneratedKeys):执行SQL:
         参数:autoGeneratedKeys,是否需要返回自动生成的主键.
     常量值:Statement.RETURN_GENERATED_KEYS 
ResultSet getGeneratedKeys():获取自动生成的主键
PreparedStatement:
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)  
   :创建PreparedStatement对象,并指定是否需要返回生成的主键. 
     参数的常量值:Statement.RETURN_GENERATED_KEYS



八、连接池(也叫数据源)(除了获取数据库连接不一样,其他操作和jdbc一样)
     1.导入jar包
         commons-dbcp-1.4.jar
         
         commons-pool-1.5.6.jar
         数据库驱动包
     2.在Java中,连接池使用javax.sql.DataSource接口来表示连接池.
        
     注意:DataSource仅仅只是一个接口,由各大服务器厂商来实现(Tomcat.JBoss).        
     常用的DataSource的实现:
  DBCP:  Spring推荐的
  C3P0:  Hibernate推荐的
     
     3.获取连接池对象(DataSource)
       

方法1:手动配置连接池配置
            DataSource ds=new BasicDataSource();
             ds.setDriverClassNmae("");
             ds.setUrl("");
             ds.setUsername("");
             ds.setPassword("");
       方式2:通过连接池工厂类创建连接池对象
                DataSource ds=  BasicDataSourceFactory.createDataSource(p);

         
     DBCPUtil

    

public class DBCPUtil {                                                                            
    private DBCPUtil(){}                                                                           
    private static Properties p = new Properties();
    
    private static DataSource dataSource=null;
    static{
        try {
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            InputStream in = classLoader.getResourceAsStream("dbcp.properties");
            p.load(in);
            //通过连接池工程类创建连接池对象
            dataSource = BasicDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            e.printStackTrace();
        }  
    }
    public static Connection getConn(){                                                            
        try {                                                                                      
            return dataSource.getConnection();         
        } catch (Exception e) {   
            e.printStackTrace();
            throw new RuntimeException("亲,获取数据库连接失败",e);                                
        }  
    } 
    public static void close(Connection conn,Statement st,ResultSet rs){
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (Exception e2) {
            e2.printStackTrace();
        } finally {
            try {
                if (st != null) {
                    st.close();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            } finally {
                try {
                    if (conn != null) {
                        conn.close();
                    }
                } catch (SQLException e2) {
                    e2.printStackTrace();
                }
            }
        }
    }
}


     4.获取数据库连接
        DataSource对象.getConnection();
     5.使用连接池的时候:  释放资源: Connection对象.close():
 
   是把Connection放回给连接池,而不是和数据库断开.