Java database connection:一套接口,定义所有关系型数据库使用Java访问的规则
入门
- 导入jar包
- 注册驱动
- 获取连接
- 定义sql
- 获取执行对象
- 执行sql
- 处理结果
- 释放资源
class.forName("com.mysql.jdbc.driver");//注册驱动,可以省略
DriverManager.getConnection();//获取连接
string sql="";//定义sql
connection.createStatement();//获取执行对象
statement.executeUpdate(sql);//执行修改方法
statement.close();
connection.close();
DriverManager
驱动管理对象,是一个类,用来注册驱动/获取连接对象
- drivermannger.getConnection
- drivermanager.registreDriver():Class.forName(“xxx”),xxx这个类中有静态代码块,调用的就是driver manager这个registerDriver方法
Connection
连接对象,获取执行对象,且与事务相关
- con.CreateStatement()
- con.preparedStatement()
- con.setAutoCommit(boolean)
- con.rollback()
- con.commit()
Statement
执行对象,用来执行sql
- int statement.executeUpdate()——DML&DDL,返回影响行数
- resultSet statement.executeQuery()——DQL
- statement.execute
preparedStatement
增强型执行对象,将参数使用待定形式?来定义sql,在执行时赋值,以解决sql注入问题
sql注入问题:
select * from user where username = dfjdf and password = dhfsdhf or 'a' = 'a';
使用:
- 导入jar包
- 注册驱动
- 获取连接
- 定义sql,使用?来待定参数
- 获取执行:connection.preparedStatement(sql)
- 问号赋值:setInt(第几个问号,值);setString(第几个问号,值)
- 执行sql:preparedStatement.executeUpdate()
- 释放资源:preparedStatement.close;connection.close;
事务
在执行Java中,或遇到出现代码异常时,java中断,而前边的代码已经执行,我们为了使一些代码成为一个整体,同时成功,同时失败(不执行),我们设置事务,将开启事务在这些代码前,回滚写在catch中。使用connection来相关事务
连接池
装着connection对象的集合。
接口:datasource javax.sql包下的
方法:
- getConncetion()
- conn.close();是将连接返回给连接池
选择
- druid
- c3p0
c3p0
-
导包
c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
-
定义配置
-
创建核心对象
comboPooledDataSource
-
获取连接
druid
-
导包
druid-1.0.9.jar
-
定义配置
druid.properties
-
加载配置
通过properties集合+类加载器机制
-
获取连接池对象
DruidDataSourceFactory.createDataSource(properties);
使用
Properties properties = new Properties();
InputStream is = Demo1.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
一个工具类
为了简化获取连接对象,定义一个工具类,来加载驱动,来获取连接,来获取连接池
代码:
使用静态代码块,只执行一次,注册驱动,加载配置,初始化连接池对象
private static DataSource dataSource;
static {
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
Properties properties = new Properties();
try {
properties.load(is);
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
定义静态方法,返回连接对象
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
定义静态方法,返回连接池对象
public static DataSource getDataSource(){
return dataSource;
}
定义close,关闭资源
public static void close(ResultSet resultSet, Statement statement,Connection connection){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement statement,Connection connection){
close(null,statement,connection);
}
JDBCTemplate
spring中的一个小工具,提供对jdbc的简单封装
步骤:
- 导入jar包
- 创建jdbcTemplate对象
- 调用方法
使用:
-
new jdbcTemplate(连接池对象)
-
方法
-
在方法中直接对sql的?进行赋值
-
update()——DML
-
queryForMap(),执行查询,封装为map集合,列明为键,列值为值
如一个人,有id,姓名,年龄,则这个map有3个元素
id=
name=
age=
-
queryForList(),执行查询,封装为list集合,每个元素为一个map集合
-
query(),封装为Javabean对象
template.query(sql,new beanPropertyRowMapper<>(javabean.class),一些sql的参数)
-
queryForObject():一般用于聚合函数
String sql = "select count(id) from tab"; Double count = jdbcTemplate.queryForObject(sql, double.class);
-