1、PreparedStatement
在拼接SQL时,有些sql的特殊关键字参与字符串的拼接,会造成安全性的问题:sql注入问题
比如在做查询时,把条件调成一个恒等式
PreparedStatement是预编译的SQL,SQL语句中的所有的参数都需要?作为占位符
怎么给占位符赋值呢:
String sql = "INSERT INTO USER VALUES(?,?);";
PreparedStatement prepstat = conn.prepareStatement(sql);
//为什么是setString呢,因为事先知道赋值对象的数据类型
//setXxx:明确的情况下直接写,不明确目标类型的话:setObject
prepstat.setString(1,"疾风剑豪"); //给第一个占位符赋值
prepstat.setString(2,"mima"); //给第二个占位符赋值
//执行SQL语句:DML:增删改
prepstat.executeUpdate();
//查询语句:DQL
prepstat.executeQuery();
2、数据库连接池
实际开发过程中,频繁的获得连接或释放资源是非常消耗资源的两个过程,为了解决此类问题,通常我们采用连接池技术,来共享Connection
让池来管理Connection,那么我们就不用了自己来创建Connection了。而是通过池来获取,当我们用完之后,把他再放回到池子里,循环利用
数据库连接规范:
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口,这样应用程序可以方便的切换不同厂商的连接池了
常见的数据库连接池:
DBCP:
DBCP是一个开源的连接池,是Apache Connection成员之一,在早期企业开发中比较常见,现在已经很少使用了
C3P0:
C3P0是一个开放源代码的JDBC连接池,C3P0用用比DBCP更丰富的配置属性
Druid:
数据库连接池实现技术,由阿里巴巴提供,是淘宝与支付宝专用的数据库连接池,支持所有兼容的数据库
3、数据库连接池_C3P0
1、C3P0需要导两个jar包
2、C3P0有两个配置文件
c3p0.properties
c3p0-config.xml
注意:配置文件名称不可更改
~~~~~~~~~~~~~~~~~c3p0-config.xml~~~~~~~~~~~~~~~~~~~~~
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/库名</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 连接池参数 -->
<!--当系统启动时,连接池中有5个连接-->
<property name="initialPoolSize">5</property>
<!--设置c3p0最大可以有多少条连接对象-->
<property name="maxPoolSize">10</property>
<!--设置超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/库名</property>
<property name="user">root</property>
<property name="password">1234</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
使用方法:
public class ComboPooledDataSourceDemo{
public static void main(String[] args){
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();
System.out.println(conn);
//获取到conn了都,后边的还是一样的操作
......
}
}
4、数据库连接池_druid
需要编写配置文件:druid.preperties
名字起成原来的jdbc也可,反正用的时候是自己手动设置读取配置文件的地址
建议放在src目录下
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/库名
username=root
password=1234
initialSize=5
maxActive=10
maxWait=3000
使用方法:
public class DruidDataSourceDemo{
public static void main(String[] args){
//3.加载配置文件
Properties pro = new Properties();
//固定写法
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//5.获取连接
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
druid工具类:
package com.smiledog.util;
/*
@ClassName JDBCPoolUtil
@Author SmILeDog
@Date 2021/5/21
@Time 12:04
druid工具类
*/
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.Properties;
public class JDBCPoolUtil {
private static DataSource dataSource;
static{
try {
//读取配置文件
InputStream is = JDBCPoolUtil.class.getClassLoader().getResourceAsStream("druid.properties");
Properties pro = new Properties();
pro.load(is);
// 创建Druid的数据库连接池对象
dataSource =DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
//提供一个方法用于获取连接池
public static DataSource getDataSource(){
return dataSource;
}
}
升级版使用方法:
package com.smiledog.demo;
/*
@ClassName UseProperStatmentAnddruidDemo
@Author SmILeDog
@Date 2021/5/21
@Time 12:03
JDBCPoolUtil配合JdbcTemplate使用
*/
import com.smiledog.domain.User;
import com.smiledog.util.JDBCPoolUtil;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UseProperStatmentAnddruidDemo {
private static JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCPoolUtil.getDataSource());
public static void main(String[] args) {
updateUser();
getAllUser();
}
private static void updateUser() {
String sql = "insert into user (username,password) values(?,?);";
jdbcTemplate.update(sql, "李刚", "666");
}
private static void getAllUser() {
String sql = "SELECT * FROM USER;";
//获取的记录直接封装成bean对象,---反射
List<User> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
for (User user : query) {
System.out.println(user);
}
}
}
JdbcTemplate:
JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。
JdbcTemplate处理了资源的建立和释放。
他帮助我们避免一些常见的错误,比如忘了总要关闭连接。
他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。
使用方法:
1、execute:可以执行所有的SQL语句,一般用于执行DDL语句
2、update:一般用于执行DML语句:insert ,update,delete
3、queryXxx:一般用于执行DQl查询语句
有一个类配合JdbcTemplate的查询使用,可以直接将获取的数据封装成一个对象:BeanPropertyRowMapper<>(类名.class)