1、PreparedStatement

在拼接SQL时,有些sql的特殊关键字参与字符串的拼接,会造成安全性的问题:sql注入问题
比如在做查询时,把条件调成一个恒等式
PreparedStatement是预编译的SQL,SQL语句中的所有的参数都需要?作为占位符
怎么给占位符赋值呢:

  1. String sql = "INSERT INTO USER VALUES(?,?);";
  2. PreparedStatement prepstat = conn.prepareStatement(sql);
  3. //为什么是setString呢,因为事先知道赋值对象的数据类型
  4. //setXxx:明确的情况下直接写,不明确目标类型的话:setObject
  5. prepstat.setString(1,"疾风剑豪"); //给第一个占位符赋值
  6. prepstat.setString(2,"mima"); //给第二个占位符赋值
  7. //执行SQL语句:DML:增删改
  8. prepstat.executeUpdate();
  9. //查询语句:DQL
  10. 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
注意:配置文件名称不可更改

  1. ~~~~~~~~~~~~~~~~~c3p0-config.xml~~~~~~~~~~~~~~~~~~~~~
  2. <c3p0-config>
  3. <!-- 使用默认的配置读取连接池对象 -->
  4. <default-config>
  5. <!-- 连接参数 -->
  6. <property name="driverClass">com.mysql.jdbc.Driver</property>
  7. <property name="jdbcUrl">jdbc:mysql://localhost:3306/库名</property>
  8. <property name="user">root</property>
  9. <property name="password">1234</property>
  10. <!-- 连接池参数 -->
  11. <!--当系统启动时,连接池中有5个连接-->
  12. <property name="initialPoolSize">5</property>
  13. <!--设置c3p0最大可以有多少条连接对象-->
  14. <property name="maxPoolSize">10</property>
  15. <!--设置超时时间-->
  16. <property name="checkoutTimeout">3000</property>
  17. </default-config>
  18. <named-config name="otherc3p0">
  19. <!-- 连接参数 -->
  20. <property name="driverClass">com.mysql.jdbc.Driver</property>
  21. <property name="jdbcUrl">jdbc:mysql://localhost:3306/库名</property>
  22. <property name="user">root</property>
  23. <property name="password">1234</property>
  24. <!-- 连接池参数 -->
  25. <property name="initialPoolSize">5</property>
  26. <property name="maxPoolSize">8</property>
  27. <property name="checkoutTimeout">1000</property>
  28. </named-config>
  29. </c3p0-config>

使用方法:

  1. public class ComboPooledDataSourceDemo{
  2. public static void main(String[] args){
  3. //1.创建数据库连接池对象
  4. DataSource ds = new ComboPooledDataSource();
  5. //2. 获取连接对象
  6. Connection conn = ds.getConnection();
  7. System.out.println(conn);
  8. //获取到conn了都,后边的还是一样的操作
  9. ......
  10. }
  11. }

4、数据库连接池_druid

需要编写配置文件:druid.preperties
名字起成原来的jdbc也可,反正用的时候是自己手动设置读取配置文件的地址
建议放在src目录下

  1. driverClassName=com.mysql.jdbc.Driver
  2. url=jdbc:mysql://127.0.0.1:3306/库名
  3. username=root
  4. password=1234
  5. initialSize=5
  6. maxActive=10
  7. maxWait=3000

使用方法:

  1. public class DruidDataSourceDemo{
  2. public static void main(String[] args){
  3. //3.加载配置文件
  4. Properties pro = new Properties();
  5. //固定写法
  6. InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
  7. pro.load(is);
  8. //4.获取连接池对象
  9. DataSource ds = DruidDataSourceFactory.createDataSource(pro);
  10. //5.获取连接
  11. Connection conn = ds.getConnection();
  12. System.out.println(conn);
  13. }
  14. }

druid工具类:

  1. package com.smiledog.util;
  2. /*
  3. @ClassName JDBCPoolUtil
  4. @Author SmILeDog
  5. @Date 2021/5/21
  6. @Time 12:04
  7. druid工具类
  8. */
  9. import com.alibaba.druid.pool.DruidDataSourceFactory;
  10. import javax.sql.DataSource;
  11. import java.io.InputStream;
  12. import java.util.Properties;
  13. public class JDBCPoolUtil {
  14. private static DataSource dataSource;
  15. static{
  16. try {
  17. //读取配置文件
  18. InputStream is = JDBCPoolUtil.class.getClassLoader().getResourceAsStream("druid.properties");
  19. Properties pro = new Properties();
  20. pro.load(is);
  21. // 创建Druid的数据库连接池对象
  22. dataSource =DruidDataSourceFactory.createDataSource(pro);
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. //提供一个方法用于获取连接池
  28. public static DataSource getDataSource(){
  29. return dataSource;
  30. }
  31. }

升级版使用方法:

  1. package com.smiledog.demo;
  2. /*
  3. @ClassName UseProperStatmentAnddruidDemo
  4. @Author SmILeDog
  5. @Date 2021/5/21
  6. @Time 12:03
  7. JDBCPoolUtil配合JdbcTemplate使用
  8. */
  9. import com.smiledog.domain.User;
  10. import com.smiledog.util.JDBCPoolUtil;
  11. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  12. import org.springframework.jdbc.core.JdbcTemplate;
  13. import java.util.List;
  14. public class UseProperStatmentAnddruidDemo {
  15. private static JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCPoolUtil.getDataSource());
  16. public static void main(String[] args) {
  17. updateUser();
  18. getAllUser();
  19. }
  20. private static void updateUser() {
  21. String sql = "insert into user (username,password) values(?,?);";
  22. jdbcTemplate.update(sql, "李刚", "666");
  23. }
  24. private static void getAllUser() {
  25. String sql = "SELECT * FROM USER;";
  26. //获取的记录直接封装成bean对象,---反射
  27. List<User> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
  28. for (User user : query) {
  29. System.out.println(user);
  30. }
  31. }
  32. }

直接就不用获取Connection了,多省事

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)