JDBC
Statement
使用jdbc操控数据库时,一开始学习的时候是这样的
Class.forName(“com.mysql.jdbc.Driver”);
再通过DriverManager获取到Connection
由Connection获得到statement
再利用statement执行SQL语句,返回的结果为ResultSet类。
(resultset类中提供了诸多方法来访问结果集中的数据)
代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test_01 {
public static void main(String[] args)throws Exception{
String url="jdbc:mysql://localhost:3306/newsql";
String username="root";
String password="derder";
Connection conn=null;
Statement statement=null;
String sql="select * from users";
//注册数据库驱动
//DriverManager.deregisterDriver(new com.mysql.jdbc.Driver());
// 该方法会使数据库驱动被注册两次,因为Driver类源码的静态代码块中已经完成了数据库驱动的注册。
Class.forName("com.mysql.jdbc.Driver");//需要在idea 的library中导入mysql的jdbc包
//通过DriverManager对象获取数据库连接。
conn=DriverManager.getConnection(url,username,password);
//通过connection对象获取statement对象
statement=conn.createStatement();
//通过statement对象执行SQL语句。
ResultSet resultSet=statement.executeQuery(sql);//executeQuery()方法会返回一个ResultSet
//回收数据库资源
resultSet.close();
statement.close();
conn.close();
}
}
Preparestatement
Statement每次执行SQL语句都要对其进行编译,所以可以利用preparestatement对SQL进行预编译,PreparedStatement是Statement的子接口,与直接使用Statement不同的是,SQL语句里可用?占位,然后调用preparestatement.setString()方法进行传值。( mybatis里的${ }可将变量用?表示,就源于这里,我不习惯称?为占位符,因为mysql的模糊查询的占位符有_(下划线)和%等等,但是没有?)
代码如下:
String sql="insert into user(name ,password,email,birthday)";
conn=DriverManager.getConnection(url,username,password);
prepareStatement prt=conn.prepareStatement(sql);
prt.setString(1, “com.derder”);
prt.setString(2, “derder”);
prt.setString(3, “derder.com”);
prt.setString(4, “219219”);
批处理
Statement和preparestatement批处理
Statement可利用preparestatement的对象实例ptsm
Statement对象可调用多个addBatch(sql)方法,最后再使用executeBatch方法完成对多个SQL语句进行批量处理(即多个SQL语句提交给数据库一起执行)。
代码如下:
Statement.addBatch(sql1);
Statement.addBatch(sql2);
Statement.addBatch(sql3);
Statement.executeBatch();
Preparestatement批处理
如果是preparestatement的批处理,代码如下:
String sql="insert into user(name ,password,email,birthday)";
conn=DriverManager.getConnection(url,username,password);
prepareStatement prt=conn.prepareStatement(sql);
for (int i=1;i<5;i++) {
prt.setString(1, “com.derder”+i);
prt.setString(2, “derder”+i);
prt.setString(3, “derder.com”+i);
prt.setString(4, “219219”+i);
}
prt.executeBatch();
DataSource
Jdbc提供DataSource接口来负责与数据库进行连接,定义了返回值为connection的方法。
C3p0连接池的核心类ComboPooledDatasource就是DataSource的实现类。
(单独写Mybatis Demo时,DataSource可定义为pool,Unpool和jndi的形式,mybatis使用pool时,我在看代码时没有迹象表明使用的pool是C3P0 pool,而mybatis和spring做整合时,会指定使用C3P0的连接池,如果是mybatis整合springboot时,pom文件中会加入jdbc启动器
<!--jdbc的启动器,默认使用HikariCP连接池-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
这里默认使用HikariCP连接池
)
Dbutils工具类中
QueryRunner可简化代码。
ResultSetHandler接口实现类可用于处理resultset结果集。