IDEA导入本地jar包
数据库提高批量插入的效率
- 使用prepareStatement
- 攒sql
- 设置不允许自动提交数据
数据库事务
例如转账这件事,要么两个人的数据都改,要么都不改
回滚操作
需要保证数据不被提交
哪些操作会导致数据的自动提交:
- DDL操作
- DML操作(增删改查):默认自动提交,但可以通过sql语句修改
- 关闭连接(关闭窗口)
数据库连接池避免重复造池子: 使用静态代码块
工具包 核心是创建QueryRunner对象,调用方法
以及
ResultSetHandler的实现类的对象作为方法的一个参数传入,不同的实现类对象对应不同的搜索要求(sql字符串), 其中scalaHandler是用来查询特殊值.例如最大值
编程步骤
- 导入jdbc规范化接口
- 添加相应的数据驱动依赖
- 获取连接对象Connection
- 获取Statement对象用以执行sql语句
- 使用ResultSet结果集获取返回结果
- 关闭资源连接
DriverManager
作用
- 注册驱动(例如,MySQL驱动、Oracle驱动)
- 获取连接对象(Connection / Session)
连接数据库的方式
方式一
new com.mysql.cj.jdbc.Drive()使用到了第三方的API, 不利于程序移植, 想要程序正确的执行, 必须添加该jar包, 否则编译错误
@Test
public void test1() throws SQLException {
// 数据库驱动
// com.mysql.cj.jdbc.Driver()是一个具体的实现类, 实现了Driver接口
Driver driver = new com.mysql.cj.jdbc.Driver();
// 可以从Database选项中进行查找
// jdbc:mysql表示协议
// root@localhost表示主机名,前面记得添加root, 否则默认windows对应的用户名
// 3306表示端口号
// jdbc表示数据库
// 8.0版本后必须设置时区
String url = "jdbc:mysql://root@localhost:3306/jdbc";
// 通过查找driver.connect()发现需要一个Properties对象, 并且必须包含username和password属性
Properties info = new Properties();
info.setProperty("username", "root");
info.setProperty("password", "root");
// 接口的多态: 实际上执行的是实现类中重写的connect方法
Connection connection = driver.connect(url, info);
System.out.println(connection);
}
方式二
通过反射来获取Driver实例化对象
@Test
public void test2() throws Exception {
// 通过反射来获取Driver的实现类对象
Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
String url = "jdbc:mysql://root@localhost:3306/jdbc";
Properties info = new Properties();
info.setProperty("username", "root");
info.setProperty("password", "root");
Connection connection = driver.connect(url, info);
System.out.println(connection);
}
方式三
使用DriverManager来获取驱动, MySQL驱动在加载到内存中会自动创建一个
@Test
public void test3() throws Exception {
Class<?> clazz = Class.forName("com.mysql.cj.jdbc.Driver");
// 下面两行代码实际上可以注释掉, 因为Driver中有一个静态代码块, 会自动创建一个对象并加载
Driver driver = (Driver) clazz.newInstance();
DriverManager.registerDriver(driver);
String url = "jdbc:mysql://root@localhost:3306/jdbc";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
System.out.println(connection);
}
com.mysql.cj.jdbc.Driver源代码
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
方式四
基本信息放入到配置信息中, 而不要放在java代码中.
优点
- 实现了数据和代码的解耦
- 如果需要修改配置文件信息, 不需要对程序重新进行打包
@Test
void test4() throws Exception {
// 读取文件创建流, 这里需要注意文件的存放路径
InputStream inputStream = ConnectTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
// 加载流对象, 获取键值对
properties.load(inputStream);
String driverClass = properties.getProperty("driverClass");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
// 进行数据库连接配置
Class.forName(driverClass);
Connection connection = DriverManager.getConnection(url, username, password);
System.out.println(connection);
}
jdbc.properties文件配置如下, 存放路径在resource下
driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://root@localhost:3306/jdbc
username=root
password=root