java基础第二十七天 数据库

1、Statement

1.1.PreparedStatement

 Statement 与 PreparedStatement的区别:

 1.语法不同
 Statement只支持静态编译,SQL语句是写死的。
 PreparedStatement支持预编译,用?号来占位。

 2.效率不同
 Statement每次都要发送一条SQL语句,不支持缓存,执行效率低。
 PreparedStatement支持预编译,缓存在数据库,只需发送参数,执行效率快。

 3.安全性不同
 Statement容易被注入。
     注入:狡猾的分子可以编写特殊的SQL语句来入侵数据库。


 PreparedStatement预编译的好处:
    PreparedStatement的预编译可以使你可以通过设置不同的参数来查询不同的目标,在数据库端,只会保存一段预编译语句,但是如果你使用Statement来发送语句,每发送一条,数据库中就会存一条,这可能会造成占用大量内存。

PreparedStatement还有批处理的功能

    1、addBatch();
    2、executeBatch();

    //示例代码
    for (int i = 0; i < 1000; i++) {
        st.setInt(1, id++);
        st.setString(2, "张三"+id);
        st.setString(3, "java EE"+id);
        st.setDate(4, new Date(System.currentTimeMillis()));
        //首先将st添加到批处理里面,然后在executeBatch进行提交
        st.addBatch();
        if(i%500==0 && i!=0){
            System.out.println(i);
            st.executeBatch();

        }
    }
    //最后一次批量执行
    st.executeBatch();

1.2.CallableStatement

能够调用存储过程

    Connection conn = JdbcUtil.getConnection();
    String sql = "call addProcedure(?,?,?)";
    CallableStatement  st = conn.prepareCall(sql);
    st.setInt(1, 100);
    st.setInt(2, 200);

    //注册返回值类型
    st.registerOutParameter(3,  Types.INTEGER);
    //执行查询
    st.executeQuery();

    //获取结果
    int result = st.getInt(3);
    System.out.println(result);

2、连接池

数据库连接池:

池子就是一个容器(list,map,set)
容器里面存放的是数据库连接(已经连上数据库的Connection实例)

使用使用的时候从容器获取一个连接(DataSource.getConnection())
操作数据库(CURD)
使用结束后,关闭连接(conn.close(),但不是真正的关闭连接,而是把连接还给连接池,怎么实现呢,是由底层实现)

常用的数据库连接池:

dbcp c3p0 druid

2.1 dbcp

配置文件

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root

#<!-- 初始化连接 -->
initialSize=10

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#最大连接数量
maxActive=50

#是否在自动回收超时连接的时候打印连接的超时错误
logAbandoned=true

#是否自动回收超时连接
removeAbandoned=true

#超时时间(以秒数为单位)
#设置超时时间有一个要注意的地方,超时时间=现在的时间-程序中创建Connection的时间,如果maxActive比较大,比如超过100,那么removeAbandonedTimeout可以设置长一点比如180,也就是三分钟无响应的连接进行回收,当然应用的不同设置长度也不同。
removeAbandonedTimeout=180

#<!-- 超时等待时间以毫秒为单位 -->
#maxWait代表当Connection用尽了,多久之后进行回收丢失连接
maxWait=1000

创建连接池

dataSource = BasicDataSourceFactory.createDataSource(properties);

2.2 druid

配置文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root


initialSize = 10
maxActive= 50
maxIdle= 20
minIdle= 10
maxWait = 1000

poolPreparedStatements=true

创建连接池

dataSource = DruidDataSourceFactory.createDataSource(properties);

3、jdbc事务

出现数据库异常时,所执行的数据库操作需要恢复操作之前的状态,那么JDBC是怎么实现的呢?

JDBC事物管理

    开启事物  
        conn.setAutoCommit(false);//默认是true,自动提交

    需要手动提交

        //curd...
        //curd...
        conn.commit();


    出现异常
        //回滚
        conn.rollBack();

    最后
        释放资源

代码示例:

public class JdbcTransaction {

    public static void main(String[] args) {

        Connection conn=null;
        Statement st = null;
        try{
            conn = JdbcUtil.getConnection();
            //开启事物
            conn.setAutoCommit(false);
            st = conn.createStatement();
            String sql1 = "insert into student values(1,'姓名1','班级1','2010-01-01')";
            st.executeUpdate(sql1);

            String sql2 = "insert into student values(2,'姓名1','班级1','2010-01-01')";
            st.executeUpdate(sql2);
            int a = 1/0;
            String sql3 = "insert into student values(3,'姓名1','班级1','2010-01-01')";
            st.executeUpdate(sql3);

            String sql4 = "insert into student values(4,'姓名1','班级1','2010-01-01')";
            st.executeUpdate(sql4);
            //提交事物
            conn.commit();
        }
        catch(Exception e){
            e.printStackTrace();
            //回滚事物
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }finally{
            JdbcUtil.close(conn, st, null);
        }
    }
}

4、使用dao模式进行用户增删改查(CRUD)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值