JDBC的学习

JDBC的初步了解

JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力。

JDBC的配置

因为需要和数据库相连接,就必须要加载驱动,并且连接端口
主要步骤有以下
1.加载驱动包
要先导入驱动包
Class.forName(“oracle.jdbc.driver.OracleDriver”);//Oracle数据库
Class.forName(“com.mysql.jdbc.Driver”);//mysql数据库
2.获得数据库连接
//工具类DriverManager
//Oracle:ip port sid username password
//mysql:ip port username password database
Connection conn = DriverManager.getConnection(“jdbc:mysql:///test”,“root”,“123456”);//mysql
Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@192.168.6.66:1521:orcl”,“student”,“123456”);
//oracle

3.获得操作数据库的Statement对象
Statement stmt = conn.createStatement();
4.执行SQL语句
//执行sql语句的方法 3种
//execute() -> DDL DML DQL 返回值是否有结果集
//executeUpdate() -> DML 返回值 更新的条数
//executeQuery() -> DQL 返回ResultQuery
stmt.excute(sql);
stmt.executeUpdate(sql);
ResultQuery q = stmt.executeQuery();
其中ResultQuery就是存储了查询结果的队列。

ResultQuery的遍历

while (rs.next()){
int userid = rs.getInt(1);//因为连接的是数据库,所以查询字段从1开始而不是从0开始
System.out.print(String.format("%3d",userid) + " “);
String username = rs.getString(“name”);//直接查询数据库中表的字段。
System.out.print(username+” ");
Date date = rs.getDate(“birthday”);
System.out.println(date);
}

优化配置

由于配置JDBC繁琐而且重复,所以通常使用dbcp和c3p0的配置文件的方式来配置JDBC

dbcp的配置

要先导入dbcp的jar包
Properties pro = new Properties();
pro.load(new FileInputStream(“src/dbcp.properties”));
DataSource a = BasicDataSourceFactory.createDataSource(pro);
而这是配置文件的内容
driverClassName=com.mysql.jdbc.Driver
url = jdbc:mysql:///test
username=root
password=123456

可以看出配置文件中其实都是最开始的配置内容,不过写成配置文件可以大大降低代码的重复度。

c3p0的配置

先导入c3p0的jar包
DataSource ds = new ComboPooledDataSource();
虽然创建DateSource只用这一句但是有要求
1.配置文件必须叫做c3p0-config.xml
2.配置文件必须位于src下。
3.c3p0-config.xml必须按照要求的格式

PreparedStatement

PreparedStatement 就是预编译,与Statement相比,单次操作所需的开销打很多,但如果要进行多次的SQL操作,那么所需时间会比Statement少很多,所以PreparedStatement支持批量操作。
但更重要的一点是PreparedStatement由于进行的预编译,所以断绝了字符注入导致语义混乱带来的可能错误。
使用方法
String sql = "select * from user where name = ? ";
PreparedStatement sta = conn.prepareStatement(sql);
sta.setString(1,user);//设置第一个问号的参数

QueryRunnable

由于ResultSet在大数据的批量操作下十分繁琐,所以就用QueryRunnable来替代进行SQL操作
如果是DQL语言的话

DataSource ds = new ComboPooledDataSource();
QueryRunner q = new QueryRunner(ds);
String sql = “select * from user”;
List query = q.query(sql,
new BeanListHandler(User.class)
);
如果是得到单个对象的话就用
User user = q.query(sql, new BeanHandler(User.class),id);
其中User是一个类
这样得到了一个存储查询结果的List

DataSource工具类

为了方便连接数据库以及通常会写一个DataSource工具类。
并且为了解决每一个事务能有一个独立且相互隔离的连接 ,还会用ThreadLocal来创建副本,保证每一个事务的的连接不会被其他事务干扰

public class DataSourceUtil {
    private static  DataSource ds ;
    private  static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    static {
        ds = new ComboPooledDataSource();
    }
    public static DataSource  getDataSource() throws SQLException {
        return ds;
    }
    public static Connection getConnection() throws SQLException {
        if(tl.get() == null){
            tl.set(ds.getConnection());
        }
            return  tl.get();
    }
}

用了静态属性和方法是为了保证只创建了一次Connection

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值