JDBC 学习心得总结

   数据库连接:学习JDBC的主要步骤有:


1、数据库连接:


    数据库连接有多种方法:

    1) 这是最原始的链接方法:
        String userName = "root";
        String password = "";
        String url = "jdbc:mysql://localhost:3306/mysqltest?useUnicode=true&characterEncoding=gbk";

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        public Dao() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url, userName, password);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("链接失败");
        }
    }    



    2)
//这种方法与下面的方法的不同之处就在于:这种方法的链接的四个字符串是在类里面赋值的,
//而下面的方法是从 jdbc.properties 配置文件中获取的
        public void testDriver() throws SQLException {

        Driver driver = new com.mysql.jdbc.Driver();

        String url = "jdbc:mysql://localhost:3306/test";
        Properties info = new Properties();
        info.put("user", "root");
        info.put("password", "");

        Connection connection = (Connection) driver.connect(url, info);
        System.out.println(connection);

    }



    3) 参考:jdbc_expression1.Jdbc
        //首先从properties文件里获取了资源放在 properties实例里面,
        //再通过Driver driver = (Driver) Class.forName(driverClass).newInstance();
//来获取Driver实例,
//传参给driver后就可以通过driver.connection(url,Info)得到 Connection 实例

        
        public Connection getConnection() throws Exception {
        String driverClass = null;
        String url = null;
        String userName = null;
        String password = null;

        InputStream in = getClass().getClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(in);

        driverClass = properties.getProperty("driver");
        url = properties.getProperty("url");
        userName = properties.getProperty("userName");
        password = properties.getProperty("password");

        Driver driver = (Driver) Class.forName(driverClass).newInstance();
        Properties info = new Properties();
        info.put("user", userName);
        info.put("password", password);
        Connection connection = (Connection) driver.connect(url, info);
        return connection;
    }



    4)参考:Jcbc_connedtion.JdbcTools
        //通过class.forName(driverClass)来加载
        public Connection getConnection2()throws Exception{
        
        String driverClass = null;
        String url = null;
        String userName = null;
        String password = null;

        InputStream in = getClass().getClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(in);

        driverClass = properties.getProperty("driver");
        url = properties.getProperty("url");
        userName = properties.getProperty("userName");
        password = properties.getProperty("password");
        
        Class.forName("driverClass");
        Connection connection=(Connection) DriverManager.getConnection(url,userName,password);
        
        return connection;
    }




    5)参考:jdbc_connection.JdbcTools
        ComboPooledDataSource()获取了src 目录下的c3p0-config.xml文件 里面的“helloc3p0”的内容
        来创建Datasource实例,再有dataSource 获取 connection 实例
        private static DataSource dataSource=null;
    static{
        dataSource=new ComboPooledDataSource("helloc3p0");
    }
    
    public static Connection getConnectionByPool() throws SQLException{
        return dataSource.getConnection();

    }




    6)参考:controller.Batch_processed
        /**
     * 使用数据库连接池:
     * @throws SQLException
     *
     *
     *
     */
    @Test
    public void testDBCP() throws SQLException{
        
        BasicDataSource dataSource=null;
        dataSource=new BasicDataSource();
        
        dataSource.setUsername("root");
        dataSource.setPassword("");
        dataSource.setUrl("jdbc:mysql:///test");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        
        dataSource.setInitialSize(10);
        dataSource.setMinIdle(5);
        dataSource.setMaxWaitMillis(5000);;
        
        Connection connection=dataSource.getConnection();
        System.out.println(connection.getClass());
    }




    7)
    参考:.controller.Batch_processed
    /**
     * 使用工厂模式来创建BasicDataSource,从而创建连接connection
     *
     * @throws Exception
     */
    @Test
    public void testDBCPBasicDataSourceFactory() throws Exception{
        Properties properties=new Properties();
        InputStream inputStream=Batch_processed.class.getClassLoader().
                                getResourceAsStream("dbcp.properties");
        
        properties.load(inputStream);
        DataSource dataSource=BasicDataSourceFactory.createDataSource(properties);
        
        BasicDataSource basicDataSource=(BasicDataSource) dataSource;
        System.out.println(dataSource.getConnection());
    
------------------------------------------------------
    2、获取statement;
    Statement=connection.createStatement();
    preparedStatement=connection.preparedStatement();
    
1)如果是用statement的话就直接拼写 sql 语句:
2)用 preparedStatement就用setObject(int,Object);



--------------------------------------------------------
3、获取并处理结果集

    1); 由结果集转换为bean

//该方法用例 DBUtiles.jar 包中的 import org.apache.commons.dbutils.handlers.BeanHandler/QueryRunner;


    Location :Jdbc_practice.bean.BeanUtilTest.java
    QueryRunner queryRunner=new QueryRunner();
    @Test
    public void testBeanHandler(){
        Connection connection=null;
        try {
            connection=JdbcTools.getConnectionByPool();
            String sql="select * from book where id=?";
            
            Book book= queryRunner.query(connection, sql, new BeanHandler(Book.class), 5);
            
            System.out.println(book);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JdbcTools.release(null, null, connection);
        }
    }



2)这是个狭隘的方法:只能用在特定的bean类;
public List getAllBook2()throws Exception{
        List list=new ArrayList();
        Book book=null;
        String sql="select * from book";
        Connection connection=JdbcTools.getConnection();
        PreparedStatement preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
        ResultSet resultSet=preparedStatement.executeQuery();
        while(resultSet.next()){
            book=new Book();
            book.setNumber(resultSet.getInt(1));
            book.setBookName(resultSet.getString(2));
            book.setAuthor(resultSet.getString(3));
            book.setPrice(resultSet.getInt(4));
            list.add(book);
        }
        return list;
    }


3)    这是个通用方法:实现方法有两个:(1)通过java反类来实现,(2)通过DBUtils的静态方法
    setProperty(T,fieldName,fieldValue)来实现;具体参考.bean.BeanUtileTest



    public static T getObject(Class clazz,String sql,Object ... args )throws Exception{
        T entity =null;
        Connection connection=JdbcTools.getConnection();
        PreparedStatement preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
        for(int i=0;i             preparedStatement.setObject(i+1, args[i]);
        }
        ResultSet resultSet=preparedStatement.executeQuery();
        Mapvalues=new HashMap();
        ResultSetMetaData resultSetMetaData=resultSet.getMetaData();
        while(resultSet.next()){
            for(int i=0;i                 String columLabel = resultSetMetaData.getColumnLabel(i+1);
                Object columValue = resultSet.getObject(columLabel);
                values.put(columLabel,columValue);
            }
        }
        if(values.size()>0){
            entity=clazz.newInstance();
            
            java.lang.reflect.Field[] field=entity.getClass().getDeclaredFields();
            System.out.println("for before");
            for(Map.Entryentry : values.entrySet()){
                String fieldName=entry.getKey();
                Object fieldValue=entry.getValue();
                
                //使用BeanUtils.setProperty(),功能和注释部分一样
                BeanUtils.setProperty(entity, fieldName, fieldValue);
                
//                for(int i=0;i //                    field[i].setAccessible(true);
//                    try {
//                         if(field[i].getType().equals(String.class)){
//                             if(field[i].getName().equals(fieldName)){
//                                 field[i].set(entity, fieldValue);
//                             }
//                         }else if(field[i].getType().equals(int.class)){
//                             if(field[i].getName().equals(fieldName)){
//                                 field[i].set(entity, fieldValue);
//                             }
//                         }
//                    } catch (Exception e) {
//                        field[i].setAccessible(true);
//                    }
//                }
            }
            
        }
        return entity;
    }
/**
* 这个方法的实现跟上面的差不多;
*  这是将结果集转化为  List 的方法
*/
public static List getObjects(Class clazz,String sql,Object ... args)
            throws Exception{

        T entity=null;
        
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        ResultSet resultSet=null;
        
        List>list=new ArrayList>();
        ListlistObject=new ArrayList();
        try{
        connection=JdbcTools.getConnection();
        preparedStatement=(PreparedStatement) connection.prepareStatement(sql);
        for(int i=0;i             preparedStatement.setObject(i+1, args[i]);
        }
        
        resultSet=preparedStatement.executeQuery();
        ResultSetMetaData resultSetMetaData=resultSet.getMetaData();
        
        while(resultSet.next()){
            Mapvalues=new HashMap();
            for(int i=0;i                 String columLable=resultSetMetaData.getColumnLabel(i+1);
                Object columValue=resultSet.getObject(i+1);
                values.put(columLable, columValue);
            }
            list.add(values);
        }
         }catch (Exception e) {
             e.printStackTrace();
         }finally{
             JdbcTools.release(resultSet, preparedStatement, connection);
         }
        
        if(!list.isEmpty()){
            
            Iterator> iterator=list.iterator();            
            while(iterator.hasNext()){
                entity=clazz.newInstance();
                java.lang.reflect.Field[] field=entity.getClass().getDeclaredFields();
                Mapvalues=iterator.next();
                
                for(Map.Entryentry:values.entrySet()){
                    String fieldName=entry.getKey();
                    Object fieldValue=entry.getValue();
                    for(int i=0;i                         field[i].setAccessible(true);
                        if(field[i].getType().equals(String.class)){
                            if(field[i].getName().equals(fieldName)){
                                field[i].set(entity, fieldValue);
                            }
                        }else if(field[i].getType().equals(int.class)){
                            if(field[i].getName().equals(fieldName)){
                                field[i].set(entity, fieldValue);
                            }
                        }
                    }
                }
                listObject.add(entity);
            }
        }
        return listObject;
    }

----------------------------------------------------------------------------------------
    4、关闭资源;
//参考:jdbc_connection.JdbcTools
    public static void release(ResultSet resultSet,Statement statement,Connection connection){
            
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }finally{
                    if(statement!=null){
                        try {
                            statement.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }finally{
                            if(connection!=null){
                                try {
                                    connection.close();
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                }
            }
        }

----------------------------------------------------------------------------------

5、批量处理:

//参考 :controller.Batch_processed
    /**
     *
     * 批处理
     * 电脑不稳定测试难
     *
     * @throws Exception
     */
    
    @Test
    public void testBatch() throws Exception{
        Connection connection=null;
        java.sql.PreparedStatement preparedStatement=null;
        String sql="insert into customers values(?,?,?)";
                
        try {
            connection=JdbcTools.getConnection();
            JdbcTools.beginTransaction(connection);
            preparedStatement=connection.prepareStatement(sql);
            
            long begin=System.currentTimeMillis();
            for(int i=0;i<10000;i++){
                //核心代码
                preparedStatement.setInt(1, i+1);
                preparedStatement.setString(2, "name_"+i);
                preparedStatement.setString(3, "2016-8-6");
                
                preparedStatement.addBatch();
                if((i%300)==0){
                    preparedStatement.executeBatch();
                    preparedStatement.clearBatch();
                }
            }
            if(10000%300!=0){
                preparedStatement.executeBatch();
                preparedStatement.clearBatch();
            }
            JdbcTools.commit(connection);
            long end=System.currentTimeMillis();
            System.out.println(end-begin);//5281
        } catch (Exception e) {
            e.printStackTrace();
            JdbcTools.rollback(connection);
        }finally{
            JdbcTools.release(preparedStatement, connection);
        }
    }

--------------------------------------------------------------------------------

6、事务处理;    
    
    //参考:controller.transactionTest
    /**
     * 数据库隔离事务--READ_COMMITED 和 READ_UNCOMMITED 的区别
     * 测试用例
     *
     *
     */
    @Test
    public void testTransactionIsolutionUpdate(){
        
        Connection connection = null;
        try {
            connection =JdbcTools.getConnection();
            connection.setAutoCommit(false);
            String sql="update book set price=price+100 where id=9";
            update(connection, sql);
            //connection.commit();先提交再读取
            
            
            //读取未提交的数据
            String sql1="select price from book where id=9";
            int price =(int)getSingleColum(sql1);
            System.out.println(price);
            
            connection.commit();//先读取再提交
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JdbcTools.release(null,null,connction);
        }
    }











你可能感兴趣的:(JDBC 学习心得总结)