jdbc操作
1,什么是jdbc操作?
答:通俗的来讲,就是用java从数据库拿到数据,然后进行crud。
2为什么要用jdbc?
答:因为我们项目中的数据太过于庞大,不能存在于集合与数组。他们存储的数据不是太单一就是存储的量远远达不到实际所应用的数据访问量。有小伙伴可能会说为什么不用文档,我们在java基础中不学过文件的操作吗?文件的操作太过于麻烦,并且不好管理内容。
3jdbc的操作有哪些步骤?
答
:1、 加载数据库驱动,通常可以使用配置文件加载。
1:导入jar包
1:在使用mybatis的时候导入的jar包mysql-connector-java-5.1.7-bin.jar
2:没有使用mybatis的时候导入依赖比较多,数据库连接的jar包,配置文件的jar包,等。
2、 创建并获取数据库链接
要使用工具的包:commons-dbutils-1.7.jar。
3、 创建jdbc statement对象
我们可以在我们的项目中创建一个帮助类进行以上的封装
package com.qf.day42.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public class DBConnection {
private static final Properties PROPERTIES = new Properties(); // 封装连接信息对象
private static final ThreadLocal THREAD_LOCAL = new ThreadLocal<>(); // 线程共享
public static DataSource dataSource; // 数据源连接池
static {
try {
// 加载资源文件
InputStream inputStream = DBConnection.class.getResourceAsStream("/jdbc.properties");
// 将资源文件数据封装到集合
PROPERTIES.load(inputStream);
// 通过集合中的配置创建连接池数据源
dataSource = DruidDataSourceFactory.createDataSource(PROPERTIES);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获得连接
*
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
Connection connection = THREAD_LOCAL.get(); // 在线程共享集合对象中获取连接
// 如果没有获取到则去连接池中获取连接
if (connection == null) {
connection = dataSource.getConnection();
THREAD_LOCAL.set(connection); // 将获取到的连接放入线程共享集合
}
return connection;
}
/**
* 关闭连接
*
* @throws SQLException
*/
public static void close() throws SQLException {
Connection connection = THREAD_LOCAL.get();
if (connection != null) {
connection.close();
THREAD_LOCAL.remove();
}
}
}
4、 设置sql语句
设置sql语句也是一个特别注意的一点,我们在进行书写sql 的时候我们一定要在相应的数据库中去运行一遍
在整合sql的时候我们一定要把sql放在接口中,并且要使用站位符"?":
例如: String SQL_DEPARTMENT_FIND_ALL = “SELECT id, name
FROM department”;
5.我们已经做好了jdbc的操作的“框架部分”接下来操作三层:
第一层是DAO层,也就是数据访问层。那我们来说一说数据访问层。首先我们得明白数据存放在那里(存放在数据库);好我们现在明白了我们第一层是要干什么,第一层是要进拿取数据,拿取数据,所以我们要用到的就是sql语句。第二点我们在Dao层需要使用到接口与实现类。有同学会说为什么要使用接口,为什么不直接使用类:第一接口是外面可以直接进行访问的,而类我们一般是自己用来使用,第二:为了让java更加具有延展性,第三为了后期的更加好进行维护,第三:为了是java代码具有规范性。
Dao的接口如下:
public interface Admidao {
Admin find(String name) throws SQLException;
}
```java
public class Admidaoimpl implements Admidao {
//这里是进行连接,创建连接,这里就是我之前提到过的1、导入相关依赖。commons-dbutils-1.7.jar
QueryRunner runner = new QueryRunner(DBConnection.dataSource);
@Override
public Admin find(String name) throws SQLException {
//这里是使用的是 QueryRunner中的查询的方法,第一个参数是sql,第二个是封装结果集,通过反射。
return runner.query(mySQL.SQL_ADMIN_FIND_BY_USERNAME,new BeanHandler<Admin>(Admin.class),name);
}
}
还有一种是实体类中的字段与数据库中的字段不是一样的封装
```java
@Override
public List<Employee> findall(int skip, int size) throws SQLException {
return runner.query(mySQL.SQL_EMPLOYEE_FIND_ALL_BY_PAGE, new ResultSetHandler<List<Employee>>() {
@Override
public List<Employee> handle(ResultSet resultSet) throws SQLException {
List<Employee> list = new ArrayList<>();
while (resultSet.next()) {
Employee employee = new Employee(resultSet.getInt("id"),
resultSet.getString("name"),
resultSet.getInt("sex"),
resultSet.getInt("age"),
resultSet.getInt("salary"),
resultSet.getString("photo"),
new Department(resultSet.getInt("dept_id"),
resultSet.getString("dept_name")),
resultSet.getString("hobby"),
resultSet.getTimestamp("createtime"),
resultSet.getTimestamp("updatetime"),
resultSet.getString("photoname"));
list.add(employee);
}
return list;
}
},
skip, size);
}
这里就要一一对应的进行封装使用的就是。new ResultSetHandler<List>() 。
第二层就是我们的数据操作层或者是业务逻辑层 service
这里是进行数据的操作:比如分页的操作,或则密码加密操作。也是一个接口一个实现类。
public interface EmployeeService {
PageBean findall (int page) throws SQLException;
//增加
boolean insert( Employee employee) throws SQLException;
//删除
boolean delete(Integer id) throws SQLException;
//修改
boolean update(Employee employee) throws SQLException;
//按照id来查询
Employee find(Integer iD) throws SQLException;
}
//实现类
public class EmployeeServiceimpl implements EmployeeService {
EmployeeDAO employeed=new Employeeimpl();
@Override
public PageBean findall(int page) throws SQLException {
int skip=(page-1)*PageBean.PAGE_SIZE;
final long count = employeed.count();
if (skip<count){
//分页操作
final List<Employee> findall = employeed.findall(skip, PageBean.PAGE_SIZE);
return new PageBean(count,page,findall);
}
return null;
}
```}
欢迎大佬讨论。第三层等待后续总结与研究