jdbc基本学习

来源:互联网 发布:淘宝折扣app 编辑:程序博客网 时间:2024/05/18 01:45
1.jdbc 概念

2.核心类

(用哪个数据库,就需用哪个数据库产商的连接jar文件)

    DriverManager
        管理JDBC驱动
    Connection
        负责连接数据库并担任传送数据的任务
    Statement
        由 Connection 产生、负责执行SQL语句
    PreparedStatement
        预编译sql,由 Connection 产生、负责执行SQL语句
    CallableStatement
        由 Connection 产生、负责执行SQL语句,执行存储过程
    ResultSet
        负责保存Statement执行后所产生的查询结果
        
3.Statement与PreparedStatement区别
    Statement执行顺序
        1.进行sql语法校验,语法错误就报错了
        2.校验权限,权限不够报错
        3.会从sql缓存区去找有没有这条sql
            有就直接执行
            没有就添加到缓存区,再执行
    PreparedStatement
        3.会减少添加缓存区sql的次数,条数。
    
    区别:
        1)Statement 执行相对于PreparedStatement来说会不安全
            Statement 会有sql注入
        例如输入账户密码登录时,用户多加了%:select *from user where username=%x% and password=%p%这样的话随时都可以        登录
            PreparedStatement 可以预防sql注入
        2)PreparedStatement效率高
        
    推荐以后使用PreparedStatement。


4.把数据库的信息放到配置文件中 db.properties,用数据库连接池时,也可用xml文件(一般都是使用数据库连接池,常用的数据库连接池有c3p0,dbcp具体使用,可参照网上相关资料,也是需要相关的jar文件的)
    dbcp
        apache的产品
        核心的类 :BasicDataSource
        commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
        http://commons.apache.org/proper/commons-pool/download_pool.cgi
    c3p0
        spring/hibernet
        目前应用最广泛的。
        有空闲自动回收链接功能
        异步执行。
        https://sourceforge.net/projects/c3p0/
        核心的类:ComboPooledDataSource
        配置文件:必须叫做 c3p0-config.xml
    druid
    tomcat配置连接池

5.批处理
    addBatch 添加一条sql到Statement中。
    executeBatch() 统一执行一组sql。
    
    步骤:
        1,获取对象
            Statement
            PreparedStatement : 创建这个对象的时候,传入的sql是可以为""空字符串的
        2.添加一些sql的集合
            addBatch
        3.执行这些sql
            executeBatch
    
6.获取自增长的值
    connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
    注意:Statement.RETURN_GENERATED_KEYS
    获取返回的自增长id
        ResultSet resultSet = prepareStatement.getGeneratedKeys();
        
7.大文本处理
    1.txt.html,xml
        mysql : text(64K),meduimtext(16M),longtext(4G)
        oracle : clob
        代码
            写入:
                FileReader reader = new FileReader(file);
                prepareStatement.setClob(2, reader);
            读出:
                Clob clob = resultSet.getClob("description");
                Reader reader = clob.getCharacterStream();
                
    2.二进制,图片
        mysql: blob,meduimblob,longblob
        oracle:blob
        代码
            写入:
                File file = new File("f:\\one.jpg");
                FileInputStream inputStream = new FileInputStream(file);
                prepareStatement.setBlob(2, inputStream);
            读出:
                Blob blob = resultSet.getBlob("img");
                InputStream inputStream = blob.getBinaryStream();
                
8.时间处理
    date 只存储年月日
    time 只存储时分秒
    timestamp 存储年月日时分秒
    代码
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        java.util.Date date = format.parse("1982-07-29 12:00:00");

        prepareStatement.setTimestamp(2, new Timestamp(date.getTime()));



        
9.事务
    概括
        把一组sql放到一起去执行,要么都成功,要么都失败。
    操作
        提交
        回滚
    事务的特点
        原子性
            要么都成功,要么都失败
        隔离性
            事务与事务之间互不干扰
            
            问题:
                脏读
                    一个事务读取了另外一个事务未提交的数据
                不可重复读
                    一个事务读取了另外一个事务已经更新的数据
                幻读
                    一个事务读到了另外一个事务已经提交的插入数据
                    
            解决这些问题,就有事务的隔离级别
                serializable 最高级别  不支持脏读,不支持不可重复读,不支持幻读(默认)
                repeatable read 不支持脏读,不支持不可重复读,支持幻读
                read committed 不支持脏读,支持不可重复读,支持幻读
                read uncommitted 支持脏读,支持不可重复读,支持幻读
            
        一致性
            执行前和执行后结果应该一致
        持久性
            事务提交,保存到数据库