一、JDBC
1.什么是JDBC
Java数据库连接,是一种用于执行SQL语句的JavaAPI,它是一套统一的、基于Java语言的关系数据库编程接口规范,该规范允许你把SQL语句作为参数通过JDBC接口发送给远端数据库,远端数据库接受到你的SQL后进行语法分析、验证,然后执行、响应。
2.JDBC的本质
Jdbc是一个普通的Java类,是数据库厂商提供的驱动jar包,可以实现sun提供一套接口规范!
java.sql.Driver:驱动接口---->驱动jar包—>实现了这个接口
java.sql.Connection:数据库的连接会话—>驱动jar包—>ConnectionImpl实现了这个接口
3.JDBC的七大步骤
1)导入java驱动jar包
mysql-connnector-java
2)注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
3)准备SQL语句
DML和DQL
参数化SQL
String sql = “select * from 表面 where 字段1=?”
4)获取数据库的连接对象
Connection conn = DriverManager.getConnection(
//MySQL5.7
"jdbc:mysql://localhost:3306/库名",
//如果使用mysql8.0的jar包,此时后面带上一些参数:时区以及编码格式
//jdbc:mysql://localhost:3306/库名?characterEncoding=utf-8&timezone=utc
"数据库用户名",
"数据库密码") ;
5)通过连接对象获取执行对象Statement
Statement stmt = conn.createStatement() ;
预编译执行对象PreparedStatement
PreparedStatement ps = conn.prepareStatement(sql);
ps.setXXX(占位符,值) ; //占位符从1开始
6)执行SQL
int count = stmt.executeUpdate(sql) ; //通用DML语句
ResultSet rs = stmt.executeQuery(sql) ; //执行DQL语句
预编译执行SQL
int i = ps.executeUpdate()
ResultSet rs = ps.executeQuery()
7)释放资源
stmt.close();
conn.close();
3.1读取ResultSet结果集中的数据
ResultSet rs = stmt.executeQuery() ;
//next():将指针移动到当前位置的下一行,初始位置为第一行之前
while(rs.next()){
//获取结果中的数据
XXX name = rs.getXXX(表字段索引/表字段名称);
System.out.prinltn(name);
}
4.自定义JDBC工具类
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/库名
user=root
password=123456
class JdbcUtils{
private static String user = null ;
private static String password = null ;
private static String driverClass = null ;
private static String url = null ;
//定义static代码块
static{
//读取配置文件
Properties prop = new Properties() ;
//获取key对应的value,赋值给上面四个成员变量
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties") ;
user = prop.getProperty("user") ;
password = prop.getProperty("password") ;
url = prop.getPrpperty("url") ;
driverClass = prop.getProperty("driverClass") ;
//注册驱动
Class.forName(driverClass) ;
}
private JdbcUtils(){}
public static Connnection getConnection(){
Connection conn = DriverManager.getConnection(url,user,password) ;
return conn ;
}
//释放资源
//带三个参数:ResultSet ,Statment,Connection---针对DQL语句操作
//带两个参数:Satement,Connection--->针对DML语句
}
二、数据库连接池
1.连接池作用
数据库连接池 负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
2.Druid连接池的使用步骤:
1)导包 druid-1.1.10.jar包
2)准备好连接池的配置文件
3)从连接池获取连接对象
提供jar包—>com.alibaba.druid.pool.DruidDataSource—>
本质实现了一个接口javax.sql.DataSource—>Connection getConnection()
//3)创建数据源DruidDataSource对象
//德鲁伊提供的数据源工厂:DruidDataSourceFactory提供静态方法,返回值就是DataSource
//public static DataSource createDataSource(Properties properties)
//创建属性集合列表
Properties prop = new Properties() ;
//读取src下配置文件
InputStream inputStream = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
//将字节输入流加载进来
prop.load(inputStream) ;
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
for(int x = 1 ; x <=11 ; x++){
//System.out.println(dataSource.getConnection());
Connection conn = dataSource.getConnection() ;
if(x==3){
conn.close(); //暂时释放,归还连接池中
}
System.out.println(conn);
}
三、DBUtils
1.DBBtils简介
commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,创建连接、结果集封装、释放资源,同时也不会影响程序的性能。创建连接、结果集封装、释放资源
2.commons-dbutils的使用步骤:
1)导包 commons-dbutils-1.6.jar
2)创建执行器 QueryRunner—> 底层PreparedStatement
public QueryRunner(DataSource ds) 参数就是数据源—>自定义工具获取到了数据源 (自动提交)
public QueryRunner():创建执行器,手动提交
3)准备好sql语句
DML语句—添加/修改/删除
insert into
update
delete from…
QueryRunner提供通用的更新操作:
public int update(Connection conn, String sql, Object... params) throws SQLException :手动提交
public int update(String sql, Object... params):自动提交
DQL语句— 查询语句
QueryRunner提供的通用查询操作
public <T> T query(String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException
第一个参数:查询的sql语句
第二个参数:ResultSetHandler结果集的处理
BeanHandler---->
将查询的某一条记录封装到实体类中(JavaBean:是具体类,属性私有,对外提供setXXX()/getXXX)
Employee emp = qr.query(sql, new BeanHandler<>(实体类.class), 参数);
BeanListHandler<T>--->
将查询的多条记录封装到List集合中,List集合都是当前类对象
List<实体类> list = qr.query(sql, new BeanListHandler<>(实体类.class));
ScalarHandler--->
通过聚合函数(count(列名称),其他max(xx),avg(xxx))查询单行单的列的数据的结果封装到Object类中
Object object = qr.query(sql, new ScalarHandler<>());
第三个参数:就是赋值的实际参数params,没有参数可以不写
3.Jdbc控制事务:
public void setAutoCommit(boolean auto) ;参数为true,表示自动提交,如果是false,手动提交
void rollback():事务回滚,撤销之前所有更改,必须释放连接对象,连接对象需要从线程中解绑
void commit():提交事务,将更改数据永久保存,提交完毕,释放连接对象,需要从线程中解绑
try {
//获取连接池中的初始化连接数量中的连接对象
conn = DruidJdbcUtils.getConnection();
//开启手动提交模式(开启事务)
//public void setAutoCommit(boolean auto) ;参数为true,表示自动提交,如果是false,手动提交
conn.setAutoCommit(false) ;
//执行的SQL语句,当作一个整体
// void commit():提交事务,将更改数据永久保存,提交完毕,释放连接对象,需要从线程中解绑
conn.commit(); //事务提交
} catch (SQLException throwables) {
//事务回滚
// void rollback():事务回滚,撤销之前所有更改,必须释放连接对象,连接对象需要从线程中解绑
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
} finally {
DruidJdbcUtils.close(ps1,conn) ;
DruidJdbcUtils.close(ps2,conn) ;
}
四、Junit单元测试
1.Junit注解
@Test:标记这个方法是单元测试方法
@Before:标记的方法:是在执行单元测试之前执行
@After:标记的方法:是在执行单元测试之后执行
2.junit单元测试的使用步骤
1)导入junit的核心包: 4.13.1以及依赖包
2)建立测试类—XXXTest
3)定义单元测试方法,在方法上加入@Test
4)方法中要么Assert断言,要么直接测试指定功能(XXXDao—>添加,删除,修改,查询的功能)
3.应用
@Before
public void init(){
System.out.println("执行单元测试方法之前执行了...");
}
@Test
//测试添加学生
public void testaddStudent() throws Exception {
System.out.println("进入单元测试方法了");
}
@After
public void close(){
System.out.println("执行单元测试方法之后执行了...");
}