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