总结目前项目接口测试用到的技术
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
第一章 访问数据库-JDBC
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
目前接口测试,主要用的是包装好的框架进行, 现在对底层使用到的技术或框架进行学习、总结。
1、首先,目前团队用到的操作数据库框架是:把不同的数据分为不同的container,如Dbcontainer、TDDLcontainer,甚至excel、csv都可以作为container
2、使用builder模式,在DbContaier类的内类部Builder里,定义了链接数据库所需要的jdbcUrl、username、password、driverName;定义了connect方法,进行连接数据库(用到的技术是jdbc)
3、使用:直接new 一个DbContaier,并传入参数,调用builde方法
一、访问数据库-JDBC
1、DBC API 主要功能:三件事,具体通过以下类/接口实现:
DriverManager: 管理JDBC驱动
Connection: 连接
Statement(PreparedStatement): 增删改查
CallableStatement : 调用数据库中的存储过程/存储函数
Result : 返回的结果集
2、JDBC访问数据库的具体步骤:
a.导入驱动,加载具体的驱动类
b.与数据库建立连接
Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection connection = DriverManager.getConnection(this.jdbcUrl, this.username, this.password);
// Connection产生操作数据库的对象:
Statement statement = connection.createStatement();
// 预编译,更推荐
Statement statement = connection.PrepareStatement()
c.发送sql,执行
String sql = "insert into student values('zl',10,'1')";
// Statement操作数据库
int count = statement.executeUpdate(sql);
if(count>0) {
System.out.println("操作成功!");
}
statement.close();
connection.close();
}
Statement(PreparedStatement):增删改查(通过Connection产生)
CallableStatement: 调用数据库中的 存储过程/存储函数 (通过Connection产生)
Result: 返回的结果集(上面的Statement等产生)
操作:
增删改: executeUpdate()
查询:executeQuery()
ResultSet():保存结果集 select * from xxx
next() : 光标下移,判断是否有下一条数据:true/false
previous() : true/false
getXxx(字段名/位置):获取具体的字段值
d.处理结果集
3.JDBC总结(模板、八股文)
```java
try{
// a.导入驱动包、加载具体驱动类Class.forName("具体驱动类");
// b.与数据库建立连接connection = DriverManager.getConnection(...);
// c.通过connection获取操作数据库的对象(Statement\preparedStatement\callablestatement)
// stmt = connection.createStatement();
// d.查询需要处理结果集 rs = pstmt.executeQuery()
while(rs.next()){
//判断是否有下一个元素
rs.getXxx(...); //获取这个元素
}
}catch(ClassNotFoundException e)
{
...
}
catch(SQLException e)
{
...
}
catch(Exception e)
{
...
}
finally
{
//打开顺序,与关闭顺序相反
if(rs!=null) {rs.close();}
if(stmt!=null) {stmt.close();}
if(connection!=null) {connection.close();}
}
二、SQL查询
1、 基本原理
目前根据jqqo拼接出来的sql语句可复用,具体如下
XxxSql XxxSql =XxxSql.instance().select().where(XxxSql.ID,EnumOperator.EQ, parentId)
.end()
.orderBy(EnumSqlOrder.DESC, XxxSql.GMT_CREATE)
.end();
System.out.println(XxxSql.getSqlStr());
IEntity<?, ?>[] iEntities = XxxFactory.FACTORY_XXX.create(XxxSql);
2 、JOOQ
1.基于java访问关系型数据库的工具包
轻量,简单,足够灵活,可以轻松使用java面向对象语法来实现各种复杂的sql,并且可以通过实体映射来访问数据库。参考文档:https://blog.csdn.net/dnc8371/article/details/106703338
jOOQ是一种DSL(领域特定语言),它模仿Java API中的标准和特定于供应商的SQL语法。 该API背后的思想很容易理解:
作为内部 DSL,Java编译器可以验证您的SQL查询的语法正确性(例如,SQL关键字的正确顺序)
将表和列作为生成的Java对象,编译器还可以验证元数据的正确性(例如,正确的列名和类型)
换句话说,当您要表达这样的SQL查询时:
SELECT author.first_name, author.last_name
FROM author
ORDER BY author.id
…然后您可以立即使用jOOQ编写相同的查询
select (AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from (AUTHOR)
.orderBy(AUTHOR.ID);
2、Table、Field、Select、Condition、Record、Result、DSLContext
Table jooq对表的抽象
Field jooq对字段的抽象
Select 这里准确来说应该是Select族.Select有很多相似的类型,SelectConditionStep,SelectSelectStep等等,
是对查询一个封装。
Condition jooq对查询条件的抽象,说白了就是where后面条件的一个集合
Record jooq对数据库数据的抽象,可以理解为数据库中的一条或者多条数据
Result 对查询结果集的封装,可以这样用:Record r = select xx,也可以这样玩:Result,目前基本上是用Result这种用法来存查询的结果集。
DSLContext jooq的上下文,通过它,基本上可以做任何你想做的事,其它的元素,都可以通过这得到,所以,搞懂了DSLContext,什么jooq都不是问题了。
3、JDBC结合Jooq使用举例
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
// 连接数据库
String userName = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/test";
Class.forName("com.mysql.jdbc.Driver");
try (Connection conn = DriverManager.getConnection(url,userName,password)) {
// jooq
**DSLContext dsl= DSL.using(conn, SQLDialect.MYSQL);**
**Result<Record> result = dsl.select()
.from(USERSINFO)
.where(USERSINFO.ID.eq(3))
.fetch()**
for ( Record r : result ) {
Integer id = r.getValue(USERSINFO.USERSID);
String name = r.getValue(USERSINFO.USERSNAME);
String pwd = r.getValue(USERSINFO.USERSPWD);
System.out.println("ID: " + id + " NAME : " + name + " PWD : " + pwd);
}
} catch ( Exception e ) {
e.printStackTrace();
}
}
}
2.基于上面的container,只需用到JOOQ的sql builder功能实现sql即可,访问数据库以及更多的其他功能暂未深入调研。
3.2 装饰者模式
对于当前接口测试的sql使用,多复杂的sql也只是一条sql得到一类实体,多个条件以及多表连接,也就相当于给一个sql增加职责增加功能,装饰者模式在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,对于功能扩展更有弹性。