Connection的创建方式
private final String driverClass = "com.mysql.jdbc.Driver"; private final String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/test"; private final String username = "root"; private final String password = "mysql";
方式一:通过驱动driver类来连接数据库
Driver driver = new Driver(); Properties properties = new Properties(); InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("jdbc.properties"); properties.load(inputStream); Connection connect = driver.connect(jdbcUrl, properties); System.out.println(connect);
方式二:通过反射Driver,加载Driver里面的静态代码块,实现自动注册Driver,在DriverManager连接数据库
通过Class.forName反射会自动执行static代码块。
Class.forName(driverClass); Connection connection = DriverManager.getConnection(jdbcUrl, username, password); System.out.println(connection);
方式三:通过DriverManager,注册Driver,来连接数据库(和class.forName相同)
DriverManager.registerDriver(new Driver());
Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
System.out.println(connection);
可以直接一行,可能是ide中自动加载jar包中所有class文件。
Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement execute 或者Statement执行插入成功却返回false:
如果第一个结果是 ResultSet 对象(简单理解为查询select语句),则返回 true;如果第一个结果是更新计数或者没有结果,则返回 false
开源数据库连接池
DBCP
需要两个jar包
1.不使用配置文件
//1. 构建数据源对象
BasicDataSource dataSource = new BasicDataSource();
//连的是什么类型的数据库, 访问的是哪个数据库 , 用户名, 密码。。
//jdbc:mysql://localhost/bank 主协议:子协议 ://本地/数据库
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost/test");
dataSource.setUsername("root");
dataSource.setPassword("mysql");
//2. 得到连接对象
Connection conn = dataSource.getConnection();
String sql = "insert into hah values(5 ,?)";
PreparedStatement ps = conn.prepareStatement(sql);
// parameterIndex the first parameter is 1, the second is 2, ...
ps.setString(1, "admin");
int i = ps.executeUpdate();
System.out.println(i);
2.使用配置文件
jdbc.properties
url=jdbc:mysql://localhost/test username=root password=mysql driverClassName=com.mysql.jdbc.Driver
Connection conn = null;
PreparedStatement ps = null;
try {
BasicDataSourceFactory factory = new BasicDataSourceFactory();
Properties properties = new Properties();
InputStream is = new FileInputStream("src//dbcp.properties");
properties.load(is);
DataSource dataSource = factory.createDataSource(properties);
//2. 得到连接对象
conn = dataSource.getConnection();
String sql = "insert into hah values(6 , ? )";
ps = conn.prepareStatement(sql);
ps.setString(1, "properties");
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
if (ps!=null){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if ((conn != null)) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
C3P0
依赖jar包:
0.9.1及前,一个包
0.9.1之后需要
mchange-commons是c3p0-0.9.2版本后分离出来的包
1.不使用配置文件
Connection conn = null;
PreparedStatement ps = null;
try {
//1. 创建datasource
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2. 设置连接数据的信息
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost/test");
dataSource.setUser("root");
dataSource.setPassword("mysql");
//2. 得到连接对象
conn = dataSource.getConnection();
String sql = "insert into hah values(7 , ? )";
ps = conn.prepareStatement(sql);
ps.setString(1, "c3p0");
int i = ps.executeUpdate();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
}
2.使用配置文件
必须在src目录下新建名为c3p0-config.xml的文件
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property> <!-- jdbc协议地址 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <!-- 驱动 --> <property name="user">root</property> <!-- 数据库的用户名 --> <property name="password">mysql</property> <!-- 数据库密码 ,若没有密码,该项可省略 --> </default-config> </c3p0-config>
try {
//默认会找 xml 中的 c3p0-config 分支。
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2. 得到连接对象
Connection conn = dataSource.getConnection();
String sql = "insert into hah values(9 , ? )";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "test");
int i = ps.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}
c3p0与DBCP区别:
1.dbcp没有自动的去回收空闲连接的功能
2.c3p0有自动回收空闲连接功能
两者主要是对数据连接的处理不同c3p0提供最大空闲时间,dbcp提供最大连接数。前者是如果连接时间超过最大连接时间,就会断开当前连接。dbcp如果超过最大连接数,就会断开所有连接。
JNDI数据源配置说明 值得一看
Druid
DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池(据说是目前最好的连接池,不知道速度有没有BoneCP快)。
添加druid的jar包
1.不使用配置文件
try {
DruidDataSource dd = new DruidDataSource();
dd.setDriverClassName("com.mysql.jdbc.Driver");
dd.setUrl("jdbc:mysql://localhost/test");
dd.setUsername("root");
dd.setPassword("mysql");
Connection conn = dd.getConnection("root", "mysql");
String sql = "insert into hah values(11, ? )";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "druid");
int i = ps.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}
2.使用配置文件
druid.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///test username=root password=mysql # 初始化连接数量 initialSize=5 # 最大连接数 maxActive=10 # 最大等待时间 maxWait=3000
try {
Properties pro = new Properties();
InputStream is = this.getClass().getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();
String sql = "insert into hah values(10 , ? )";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, "druid");
int i = preparedStatement.executeUpdate();
System.out.println(i);
} catch (Exception e) {
e.printStackTrace();
}