1、PreparedStatement
在拼接SQL时,有些sql的特殊关键字参与字符串的拼接,会造成安全性的问题:sql注入问题
比如在做查询时,把条件调成一个恒等式
PreparedStatement是预编译的SQL,SQL语句中的所有的参数都需要?作为占位符
怎么给占位符赋值呢:
String sql = "INSERT INTO USER VALUES(?,?);";PreparedStatement prepstat = conn.prepareStatement(sql);//为什么是setString呢,因为事先知道赋值对象的数据类型//setXxx:明确的情况下直接写,不明确目标类型的话:setObjectprepstat.setString(1,"疾风剑豪"); //给第一个占位符赋值prepstat.setString(2,"mima"); //给第二个占位符赋值//执行SQL语句:DML:增删改prepstat.executeUpdate();//查询语句:DQLprepstat.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.Driverurl=jdbc:mysql://127.0.0.1:3306/库名username=rootpassword=1234initialSize=5maxActive=10maxWait=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:04druid工具类*/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:03JDBCPoolUtil配合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)
