写在前面:
使用数据库连接池技术Druid封装工具类,使用Spring JDBC进行增删改查操作
jdbcTemplate.update(sqlDML,占位符参数列表) |
jdbcTemplate.queryForMap(sqlDQL,占位符参数列表) |
jdbcTemplate.queryForList(sqlDQL,占位符参数列表) |
jdbcTemplate.queryForObject(sqlDQL,返回值类型.class) 执行聚合函数 |
jdbcTemplate.query(sqlDQL, new BeanPropertyRowMapper<类>(类.class) ,占位符参数列表) |
String sqlDQL = "select id,name from stu where id=?";
Map<String, Object> map = jdbcTemplate.queryForMap(sqlDQL, 2);
System.out.println(map);
1. 一些基础知识
JDBC:
Java数据库连接
定义了一套操锁所有关系型数据库的规则(接口)
每种关系型数据库有一种自己的实现类(驱动jar包)
mysql驱动包下载和简单连接:
https://blog.csdn.net/poppy_rain/article/details/97327601
2. JDBC 对象
DriverManager:驱动管理
1. 注册驱动代码:Class.forname("com.mysql.jdbc.Driver");
//Driver源码:DriverManager.registerDriver 注册驱动
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
mysql5之后可以不写注册驱动的代码,因为文件java.sql.Driver中写了驱动
2. 获取连接对象:
Connection connection = DriverManager.getConnection(url, user, password);
//url=jdbc:mysql://localhost:3306/student
Connection:数据库连接
获取执行sql对象:conn.createStatement(); 或者 conn.prepareStatement(sql);
管理事务:setAutoCommit(false);commit();rollback();
连接之后开启事务;执行完提交;catch中回滚;
Statement:执行sql
静态sql,参数都是给定值
boolean execute(sql) //任意sql
int executeUpdate(sql) //增删改,返回影响的行数,>0成功;数据库和表的操作,返回值0
ResultSet executeQuery(sql) //查找,返回结果集
SQL注入问题:在拼接字符串时,有一些特殊字符与字符串拼接会造成安全问题
ResultSet:结果集,封装查询结果
next() //游标向下移动一行(默认在第一行之前),返回boolean
getInt (参数) //getInt,getString等;参数:int表示从1开始的列编号,String表示列名称
PreparedStatement:执行sql(预编译)
解决SQL注入问题:参数使用‘ ? ’作为占位符
步骤如下:
//连接
conn = JDBCUtil.getConnection();
//sql
String sql="select * from stu where name = ?";
//获取 执行sql对象
prst = conn.prepareStatement(sql);
//占位符赋值
prst.setString(1,"小贝");//第一个参数:第几个占位符;第二个参数:占位符处参数值
//执行sql
rs = prst.executeQuery();
3. 数据库连接池:存放数据库连接的容器
基本信息:
获取连接是像底层申请资源
系统初始化好后,容器被创建,容器中会申请一些连接对象,用户访问数据库时从容器中获取对象,用完放回容器
提高效率,节约资源
DataSource 接口:
驱动厂商提供实现类
在javax.sql包中
获取连接:getConnection()
放回容器:conn.close() 如果连接是从数据库连接池中获取的,则调用close不是关闭,而是归还
数据库连接池的实现技术---c3p0:
导jar包:c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar
定义配置文件:c3p0.properties 或 c3p0-config.xml;放在src下
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/student</property>
<property name="user">root</property>
<property name="password">root.123</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property> <!-- 初始化连接数量 -->
<property name="maxPoolSize">10</property> <!-- 最大连接数量 -->
<property name="checkoutTimeout">3000</property>
</default-config>
<!--指定名称的方法连接-->
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/student</property>
<property name="user">root</property>
<property name="password">root.123</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">10</property>
<property name="maxPoolSize">30</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
使用:
//创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//获取1个连接
conn = ds.getConnection();
数据库连接池实现技术---Druid:
导jar包:druid-1.0.9.jar
配置文件:xxx.properties 任意名称任意位置
url=jdbc:mysql://localhost:3306/student
username=root
password=root.123
//driverClassName=com.mysql.jdbc.Driver
driverClassName=com.mysql.cj.jdbc.Driver
initialSize=5
maxActive=10
maxWait=3000
使用:
public void druidTest(){
Connection conn=null;
PreparedStatement ps = null;
ResultSet rs=null;
try {
conn=DruidUtil.getConnection();
String sql="select * from stu where name=?";
ps = conn.prepareStatement(sql);
ps.setString(1,"小贝");
rs=ps.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("id")+rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DruidUtil.close(rs,ps,conn);
}
}
//工具类
public class DruidUtil {
private static DataSource ds;
static {
try {
InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");
Properties properties=new Properties();
properties.load(is);
ds= DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接池
public static DataSource getDataSource() {
return ds;
}
//获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public static void close(ResultSet rs, Statement st,Connection conn){
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//释放资源
public static void close(Statement st,Connection conn){
close(null,st,conn);
}
}
4. Spring JDBC
基本信息:
Spring框架对JDBC的简单封装
提供了JDBCTemplate对象,简化JDBC开发
不需要申请连接,不需要释放资源,内部都做了封装
导jar包:
执行增删改语句:
jdbcTemplate.update(sqlDML,参数1, 参数2.....); //参数依次写入占位符对应的值
执行查找语句:
queryForMap(sqlDQL, 参数1, 参数2.....); //结果集一条,将查询结果放入Map;返回值:Map<字段名,字段值>
queryForList(sqlDQL, 参数1, 参数2.....); //结果集多条,将查询结果放入List;返回值:List<Map<k,v>>
query(sqlDQL, new BeanPropertyRowMapper<类>(类.class)); //将查询结果放入JavaBean对象;返回值:List<类>
⚠️基本数据类型(int、double等)不能接受null,所以采用封装类型(Integer、Double等)
queryForObject(sqlDQL, 返回值类型.class); //一般执行聚合函数
使用:(依赖Druid工具类)
public void springJDBCTest(){
JdbcTemplate jdbcTemplate = new JdbcTemplate(DruidUtil.getDataSource());
try {
//数据库操作:增删改
String sqlDML = "insert into stu(id,name) values(?,?)";
int i = jdbcTemplate.update(sqlDML, 5, "小红");
System.out.println(i); //输出:1
//数据库操作:查找
String sqlDQL = "select id,name from stu where id=?";
Map<String, Object> map = jdbcTemplate.queryForMap(sqlDQL, 2);
System.out.println(map); //输出:{id=2, name=小贝}
sqlDQL = "select id,name from stu where id != ?";
List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sqlDQL, 2);
System.out.println(mapList); //输出:[{id=1, name=小黑}, {id=3, name=小灰}, {id=4, name=小火}, {id=5, name=小红}]
List<Student> studentList = jdbcTemplate.query(sqlDQL, new BeanPropertyRowMapper<Student>(Student.class),2);
System.out.println(studentList); //输出:[Student{id=1, name='小黑'}, Student{id=3, name='小灰'}, Student{id=4, name='小火'}, Student{id=5, name='小红'}]
sqlDQL = "select count(id) from stu";
int n = jdbcTemplate.queryForObject(sqlDQL, Integer.class);
System.out.println(n); //输出:5
}catch (Exception e){
e.printStackTrace();
}
}
public class Student {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}