JDBC
java Database Connectivity java数据库连接
JDBC的本质是java对所有关系型数据库进行连接操作所制定的一套规则,就是接口。
不同的数据库针对这套规则制定相对应的实现类,我们使用这些已经做好的实现类
来实现java对数据库进行连接和操作
步骤
1、导入jar包
在项目的根目录中创建lib文件夹
将mysql-connector-java-5.1.37-bin.jar复制到lib中
右键点击该jar包,选择Build Path,点击Add to Build Path
2、注册驱动
Class.forName("com.mysql.jdbc.Driver");
3、获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名", "用户名", "密码");
访问本地数据库路径的简写:jdbc:mysql:///库名
4、编写SQL语句
5、获取执行对象
Statement state = conn.createStatement();
6、执行SQL语句
state.executeUpdate(sql) 实现增删改
state.executeQuery(sql) 实现查询
7、处理执行结果
如果是增删改,判断是否执行成功
executeUpdate方法返回int,用于判断增删改影响的记录数
如果是查询,获取结果集
executeQuery方法返回ResultSet结果集,查询得到的结果被封装在了这个结果集中。
需要遍历集合来获取所有查询的结果
使用方法:
1、next():判断是否有下一个可以获取的查询结果,返回布尔值
2、getXxx(int):在指定的记录中,通过字段的位置获取字段值
3、getXxx(String):在指定的记录中,通过字段名获取字段值
代码:
ResultSet set = state.executeQuery();
while(set.next()){
set.getXxx(int/String);
}
8、释放资源
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(state !=null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
预编译的SQL
作用:防止SQL的注入问题
例如: xxx ’ or ‘1’=1,来完成登录功能
使用步骤:
概念:数据库连接池的本质是一个存储若干个数据库连接对象的容器(集合),用户在访问数据库时,可以直接从该容器中获取连接对象,对数据库进行操作,在使用完毕后将此连接对象归还到池中。
好处:
1、节省资源
2、提高访问效率
DataSource连接池接口
1、getConnection():获取连接
一般这个接口我们不会自己去实现,都用第三方做好的jar包
1、c3p0:Apache组织的
步骤:
1、导入c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar(这个c3p0的依赖)
2、在src下配置c3p0-config.xml文件
在文件中配置:
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/库名
root
root
5
3、获取连接池
DataSource ds = new ComboPooledDataSource("mypool");
4、获取连接对象
ds.getConntion();
5、归还连接
ds.close();
2、druid:阿里巴巴的
步骤:
1、导入druid-1.0.9.jar
2、在项目的任意位置配置任意文件名的properties文件
在文件中配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/库名
username=root
password=root
initialSize=5
3、使用连接池工厂创建连接池
// 专门用于读取properties文件的类
Properties pro = new Properties();
// 使用load方法将properties文件载入
pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
// 使用DruidDataSourceFactory创建连接池
ds = DruidDataSourceFactory.createDataSource(pro);
4、获取连接对象
ds.getConntion();
5、归还连接
ds.close();
第一次注册登录的地址相同,反复启动,浪费资源(connection),故此搞了一个数据库连接池
连接同一个数据库,确保连接对象相同
连接多个数据库时,连接多个对象,故此搞了一个数据库连接池
增删改全用update
查 query
dbutil的作用 不用自己关闭资源
DBUtils就是为了简化JDBC的快发而产生的开发工具包.对JDBC的一种封装
用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,所以通常用连接池结束,来共享连接Connection.这样就不用每次都创建连接,释放链接了,这些操作都交给连接池.
QreryRunner类(org.apache.commons.dbutils.QueryRunner) 是Dbutils的核心类之一,它显著的简化了SQL查询,并与ResultSetHandler协同工作将使编码量大为减少
QueryRunner qr= new QueryRunner(JdbcUtils.getDataSource());
query(sql,ResultSetHandler,Object…params);
c3p0的工具类
public class JdbcUtils {
public static DataSource ds= null;
static {
ds= new ComboPooledDataSource("c3p0");
}
//获取池
public static DataSource getDataSource() {
return ds;
}
//获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void close(PreparedStatement state, Connection conn) {
if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(PreparedStatement state, Connection conn, ResultSet set) {
close(state, conn);
if (set != null) {
try {
set.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
为了简化Jdbc技术的操作-----DBUtils
Apache组织提供的一个对JDBC进行简单封装的开源工具类库
作用:DBUtils主要负责转载驱动、关闭连接的工作
QreryRunner类(org.apache.commons.dbutils.QueryRunner) 是Dbutils的核心类之一,
它显著的简化了SQL查询,并与ResultSetHandler协同工作将使编码量大为减少。它包含以下几个方法:
其中ResultSetHandler接口(org.apache.commons.dbutils.ResultSethandler)执行处理一个结果集对象,将数据转变并处理为任何一种形式,供其他应用使用。实现类如下:
ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
//重点
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中。//重点