JDBC
JDBC驱动程序
数据库连接信息配置
URL:连接数据库系统资源描述符
DriverClass: 数据库系统驱动类名称
UserName:登录数据库系统用户名称
PassWord:登录数据库系统用户密码
Others: 其他信息、
步骤
- 加载驱动 Class.forName(“com.mysql.jdbc.Driver”);
- 连接数据库 DriverManager.getConnection( ); 返回Connection对象
- 执行sql对象 调用creatStatement() 返回statement对象
- 调用executeQuery()
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.加载驱动 //固定写法加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.用户信息和url
String url = "jdbc:mysql://localhost:3306/company?useUnicode=true&characterEncoding=utf8&useSSL=true";
String name = "root";
String password = "123456";
//3.连接成功,数据对象 Connection代表数据库
Connection connection = DriverManager.getConnection(url, name, password);
//4.执行sql对象
Statement statement = connection.createStatement();
//5.执行sql的对象 去 执行sql 可能存在结果,查看返回结果
String sql = "select * from employee";
ResultSet resultSet = statement.executeQuery(sql); // 返回的结果集,结果集中封装了查询的全部资源
while (resultSet.next()){
System.out.println("id="+resultSet.getObject("id"));
System.out.println("name="+resultSet.getObject("name"));
System.out.println("-----------------------------------------------------");
}
//6.释放资源
resultSet.close();
statement.close();
connection.close();
}
创建步骤
- 加载驱动 Class.forName(“com.mysql.jdbc.Driver”);
- 连接数据库 DriverManager.getConnection( ); 返回Connection对象
- 执行sql对象 调用creatStatement() 返回statement对象
- 调用executeQuery()
具体步骤
创建 dbconf.properties文件
添加数据库属性配置信息
jdbc_url = jdbc:mysql://localhost:3306/(要操作的数据库名)?useUnicode=true&characterEncoding=utf8&useSSL=true # 本机链接 jdbc_driver = com.mysql.jdbc.Driver # 加载驱动 jdbc_UserName = root jdbc_PassWord = 123456
创建Env类获取dbconf.properties文件中的属性并设为静态常量
创建数据库管理类,统一管理规范
getConnection()
执行sql语句
Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql);
查询结果的处理
java.sql.ResultSet接口是jdbcAPI 中唯一用来封装查询结果记录行的组件
遍历结果集中数据
-
boolean next()方法 //往往做为遍历循环条件
-
getXxx(int index);getXxx(String colum)
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getObject("id"));
System.out.println(resultSet.getObject("numbers"));
System.out.println(resultSet.getObject("Gender"));
System.out.println(resultSet.getObject("Birth"));
System.out.println(resultSet.getObject("phone"));
System.out.println(resultSet.getObject("apartment"));
}
-
封装结果集 (使用集合封装)
while (resultSet.next()) { Student student = new Student(); String id = resultSet.getString("id"); student.setId(id); student.setNumber(resultSet.getString("numbers")); student.setName(resultSet.getString("name")); student.setBirth(resultSet.getDate("birth")); students.add(student);//将对象添加到集合中 }
-
List<Student> students = new ClassInfoAndStudentsDao().queryStudentList(); for (Student student : students){ System.out.println(student.getId()+"\t"+student.getNumber()+"\t"+student.getName()+"\t"+ student.getGender()+"\t"+student.getBirth()+"\t"+student.getPhone()+"\t"); }
使用map封装
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
Map map= new hashMap();
map.put("id",resultse.getString("id"));
list.add(map);//将map封装到List集合中
}
数据库连接池
-
添加jar包
-
设置 private static ComboPooledDataSource c3p0;
-
设置数据源相关属性
private static ComboPooledDataSource c3p0; /** * 创建CreateComboPoolDataSource数据源 * */ private static void createComboPoolDataSource(){ if(c3p0 == null){ c3p0 = new ComboPooledDataSource(); //设置数据源相关属性 try { c3p0.setDriverClass(Configuration.JDB_DRIVER); c3p0.setUser(Configuration.JDB_USERNAME); c3p0.setPassword(Configuration.JDB_PASSWORD); c3p0.setJdbcUrl(Configuration.JDB_URL); c3p0.setCheckoutTimeout(3000); } catch (PropertyVetoException e) { e.printStackTrace(); } } } /** * 获得连接的通用方法 * * @return {@link Connection} */ public static Connection getConnection(){ Connection connection = null; createComboPoolDataSource(); //创建数据源 try { connection = c3p0.getConnection(); // 由数据源获取一个打开的连接 } catch (SQLException throwables) { throwables.printStackTrace(); } return connection; }
PreparedStatement 是Statement 接口的扩展
PreparedStatement 更高效
提供预编译功能,提高数据库访问效率
支持使用占位符设置sql语句参数
此接口对象由Connection调用相关方法创建
设置参数
- setXxx(int index , Obeject value)
查询分页
由于数据庞大,全部加载到内存比较耗时,效率低下
-
SQL语句实现分页
1. LIMIT用法 LIMIT出现在查询语句的最后,可以使用一个参数或两个参数来限制取出的数据。其中第一个参数代表偏移量:offset(可选参数),第二个参数代表取出的数据条数:rows。 单参数用法 当指定一个参数时,默认省略了偏移量,即偏移量为0,从第一行数据开始取,一共取rows条。 /* 查询前5条数据 */ SELECT * FROM Student LIMIT 5; 复制 双参数用法 当指定两个参数时,需要注意偏移量的取值是从0开始的,此时可以有两种写法: /* 查询第1-10条数据 */ SELECT * FROM Student LIMIT 0,10; /* 查询第11-20条数据 */ SELECT * FROM Student LIMIT 10 OFFSET 10; 复制 2. 分页公式 总页数计算 在进行分页之前,我们需要先根据数据总量来得出总页数,这需要用到COUNT函数和向上取整函数CEIL,SQL如下: /* 获得数据总条数 */ SELECT COUNT(*) FROM Student; /* 假设每页显示10条,则直接进行除法运算,然后向上取整 */ SELECT CEIL(COUNT(*) / 10) AS pageTotal FROM Student; 复制 核心信息 当前页:pageNumber 每页数据量:pageSize 在实际操作中,我们能够得到的信息有当前所在页以及每页的数据量,同时要注意一下是否超出了最大页数。以每页10条为例,则前三页的数据应为: 第1页:第1~10条,SQL写法:LIMIT 0,10 第2页:第11~20条,SQL写法:LIMIT 10,10 第3页:第21~30条,SQL写法:LIMIT 20,10 据此我们可以总结出,LIMIT所需要的两个参数计算公式如下: offset:(pageNumber - 1) * pageSize rows:pageSize
分页代码实现
public Map findSalaryPaging(int pageNum, int pageSize){ //计算复合查询条件的总记录数rowcount //计算分页总数pageSum //当前页记录行数rows //返回客户端需要的数据(rowCount,pageSum,rows) }
-
使用map封装,查询信息
JDBC调用存储过程
jdbc调用存储过程实现
优点:执行效率高,提高访问速度
缺点:跟换数据库系统时存储过程不兼容
JDBC API 中 CallableStatement接口是唯一处理数据库系统存储过程的通用组件
//定义存储过程名称及参数
String procName = “{call pro_hello(?)}”;
//注册一个输出类型
call.regidterOutParameter(1,Types.varchar);
批处理
Statement接口批处理方法
void addBatch(String sql) throws SQLException
int[] executeBatch() throws SQLException
oid clearCatch() throws SQLException
void addBatch() throws SQLException;
JDBC事务处理
Connection事物处理相关方法
void setAutoCommit(boolean autoCommit) //传入true则自动提交 false关闭自动提交
void commit() //提交事务
void rollback() //撤销 出现异常 异常处理中回滚数据
SavepointsetSavepoint(String name) //保存点
void setTransaction(int level) //设置事务与其他事务的隔离级别
void rollback(Savepoint savepoint)
Timestamp time = new Times(new Date().getTime()); // 获取系统时间
事务的隔离级别: