JDBC
文章目录
一、概述
Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
二、使用
-
导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
-
注册驱动
Class.forName("com.mysql.jdbc.Driver");
-
获取数据库连接对象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3?useSSL=false", "root", "root");
-
定义sql
String sql = "update account set balance = 500 where id = 1";
-
获取执行sql语句的对象 Statement
Statement stmt = conn.createStatement();
-
执行sql,接受返回结果
int count = stmt.executeUpdate(sql);
-
处理结果
System.out.println(count);
-
释放资源
stmt.close(); conn.close(); //PreparedStatement::close();
三、各个对象
3.1 DriverManager:驱动管理对象
注册驱动
告知程序使用哪个数据库驱动jar
static void registerDriver (Driver driver) 方法注册驱动
源码:在com.mysql.jdbc.Driver类中存在静态代码块
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
mysql5之后的驱动jar包可以省略注册驱动的步骤
3.2 获取数据库连接对象
static Connection << getConnection (String url, String user, String password) 方法
URL == 协议://主机地址:端口号/数据库名?参数1&参数2&参数3&…
Mysql
端口号3306
String url = jdbc:mysql://localhost:3306/db3?useSSL=false;
Oralce
端口号1521
String url = jdbc:oralce:thin:@localhost:1521:sid;
3.3 Connectino:数据库连接对象
获取执行sql 的对象
Statement << createStatement()
PreparedStatement << prepareStatement(String sql)
管理事务
-
执行SQL前开启事务
setAutoCommit (boolean autoCommit) :调用该方法设置参数为false,关闭数据自动提交,即开启事务
-
SQL执行成功后提交事务
commit()
-
在catch代码块中回滚事务
rollback()
3.4 Statement:执行Sql的对象
int << executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句 返回受影响的行数
ResultSet << executeQuery(String sql) :执行DQL(select)语句 返回结果集
boolean << execute(String sql) :可以执行任意的sql 返回是否执行成功
3.5 PreparedStatement:执行Sql的对象
解决SQL注入问题,在预编译时使用 “?” 作为占位符,先检查有无特殊字符或特殊命令,再执行命令且执行效率更高
需要释放资源
setXxx(int,Xxx):给sql语句的占位符赋值 setString(int,String)、setInt(int,int)…
* 参数:
\1. int:代表占位符的编号,从1开始
\2.Xxx:给参数赋值
int << executeUpdate() 执行增、删、改语句,返回受影响的行数
Resultest << executeQuery() 执行查询,返回结果集
void close() 释放资源
3.6 ResultSet:结果集对象
boolean << next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据)如果是,返回false
getXxx(参数):获取数据
* Xxx:代表数据类型 如: int getInt() , String getString()
* 参数:
\1. int:代表列的编号,从1开始 如: getString(1)
\2. String:代表列名称。 如: getDouble(“balance”)
while(rs.next()){
//获取数据
int id = rs.getInt(1);
String name = rs.getString("name");
double balance = rs.getDouble(3);
System.out.println(id + "---" + name + "---" + balance);
}
四、JDBC连接池
4.1 数据库连接池概述
一个容器(集合),存放数据库连接的容器;可以节约系统资源,使用户访问更加高效提高用户体验。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
配置:
/常用连接数
/最大连接数
/等待超时
JDK提供了一个标准接口**DataSource**(javax.sql包下)供数据库厂商实现
方法:
/获取连接:getConnection()
/归还连接:close()
4.2 C3P0
伴随Hibernate框架发布,较为古老
- jar包:c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar
- 配置文件:自定义:c3p0.properties 或者 c3p0-config.xml,创建在src下,自动加载
- 创建数据库连接池对象:ComboPooledDataSource
- 获取连接:getConnection()
//创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//获取连接对象
Connection conn = ds.getConnection();
4.3 Druid
阿里发布,经过大数据量的严格测试,为世界上最好的数据库连接池技术之一
- jar包:druid-1.0.9.jar
- 配置文件:自定义:任意名称Properties文件,创建在任意目录下,手动加载
- 获取数据库连接池对象 工厂:DruidDataSourceFactory
- 获取连接:getConnection()
//加载配置文件
Properties pro = new Properties();
//相对路径
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//获取连接
Connection conn = ds.getConnection();
五、Spring JDBC
Spring框架对JDBC的简单封装。提供了一个**JDBCTemplate**对象,简化JDBC的开发
- jar包:
- spring-beans
- spring-core
- spring-jdbc
- spring-tx
- 创建JdbcTemplate对象:依赖于数据源DataSource
JdbcTemplate template = new JdbcTemplate(dataSource);
- 调用JDBCTemplate的方法来完成CRUD的操作
JDBCTemplate
int << update(String sql,参数列表…) 执行DML语句。增、删、改语句
- 返回受影响的行数
- SQL语句中没有【?】作为占位符时,只传入SQL语句
- 有占位符时,按顺序传入参数
String sql = "update `studenttest` set `name`=? where id=?";
int cont = template.update(sql,"hehe",3);
Map<String, Object> << queryForMap(String sql,参数列表…) 查询结果将结果集封装为map集合
- 只能查询一条数据,返回某行的Map形式,Key:列名,value:列对应的值
- SQL语句中没有【?】作为占位符时,只传入SQL语句
- 有占位符时,按顺序传入参数
List<Map<String, Object>> << queryForList(String sql,参数列表…) 查询结果将结果集封装为list集合
- 能查询多条数据,返回Map的List集合,Key:列名,value:列对应的值
- SQL语句中没有【?】作为占位符时,只传入SQL语句
- 有占位符时,按顺序传入参数
List< E > << query(String sql,RowMapper< E >接口实现类) 查询结果将结果封装为JavaBean对象
- 自己实现RowMapper< E >接口
@Test
public void test_bean(){
String sql = "select * from `studenttest`";
List<Student> list = template.query(sql, new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet resultSet, int i) throws SQLException {
Student stu = new Student(
resultSet.getInt("id"),
resultSet.getString("name"),
resultSet.getString("gender"),
resultSet.getDate("creatTime").toString()
);
return stu;
}
});
for(Student s : list){
System.out.println(s);
}
}
- 使用预定义的实现类BeanPropertyRowMapper< E >
@Test
public void test_beanPro(){
String sql = "select * from `studenttest`";
List<Student> list = template.query(sql, new BeanPropertyRowMapper<Student>(Student.class));
for(Student s : list){
System.out.println("ByPro:"+s);
}
}
注意:实体类的数据字段最好使用包装类,防止不能接收null值
数据类型包装类 << queryForObject(String sql,包装类.class) 查询结果将结果封装为对象
一般用来执行聚合函数
@Test
public void test_object(){
String sql = "select COUNT(id) from `studenttest`";
Long conunt = template.queryForObject(sql, Long.class);
System.out.println(conunt);
}