jdbc是java语言用来规范客户端如何访问数据库的应用程序接口,提供了查询和更新数据库中数据的方法。
jdbc是面向关系型数据库的。
不同的数据库厂商有不同的jdbc的jar包。
jdbc基本步骤
DataSource基本概念
常见的数据库连接池:dbcp,c3p0,druid
druid使用步骤
导入依赖
提供db.properities
driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql:///javaweb
username = root
password = root
使用druid创建DataSource
package com.rookie.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class DruidUtils {
private static DataSource dateSource = null;
//静态代码块,类加载的时候就会执行
static{
try {
//1.读取配置文件
InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("db.properties");
//2.将is导入properties
Properties pp = new Properties();
pp.load(is);
//3.创建连接池对象
dateSource = DruidDataSourceFactory.createDataSource(pp);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDateSource(){
return dateSource;
}
}
JdbcTemplate是spring对传统的jdbc的封装。
JdbcTemplate比较灵活,但是和ORM框架相比,JdbcTemplate功能则力不从心,学习JdbcTemplate是为了学习ORM框架做铺垫。
@Test
public void test4(){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(DruidUtils.getDateSource());
//1.增删改
//因为id为主键,会自增,所以可以填NULL;不会出现主键冲突
jdbcTemplate.update("INSERT INTO ACCOUNT VALUES(NULL,?,?,?)","QWE","1000","0");
jdbcTemplate.update("UPDATE ACCOUNT SET NAME = ? WHERE ID = ?","ZXC","5");
jdbcTemplate.update("DELETE FROM ACCOUNT WHERE ID = ?","6");
//2.查询所有;<> 和 ()内都要填写
List<User> list = jdbcTemplate.query("SELECT * FROM ACCOUNT", new BeanPropertyRowMapper<User>(User.class));
list.forEach(user -> System.out.println(user));
//3.查询一条数据
User user = jdbcTemplate.queryForObject("SELECT * FROM ACCOUNT where id = ?", new BeanPropertyRowMapper<User>(User.class), "1");
System.out.println(user);
}
//把DataSource接收保存
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(DruidUtils.getDateSource());
//经过多次重载,内部调用update方法
//update执行了两件事(1.封装sql语句;2.封装参数)
jdbcTemplate.update("INSERT INTO ACCOUNT VALUES(NULL,?,?,?)","QWE","1000","0");
//通过判断,内部执行的是execute方法
{
获取数据库连接对象
初始化statement对象
通过回调函数执行update函数中的ps->{}里面的逻辑
//ps->{}包括
{
将prepareStatement对象和传入的参数进行封装
int rows = ps.executeUpdate(); 执行sql
return rows
}
}
总结:
jdbcTemplate的update方法:
List<User> list = jdbcTemplate.query("SELECT * FROM ACCOUNT", new BeanPropertyRowMapper<User>(User.class));
BeanPropertyRowMapper的作用:
query和queryForObject都会执行query()方法,传参和不传参的执行流程不一样,但是最终都会执行execute方法。
注:queryForObject查找不到数据或者查找到的数据数量大于1,都会抛出异常(因为在源码中将result集合的大小设定为了1)
//把DataSource接收保存
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(DruidUtils.getDateSource());
//经过多次重载,内部调用query方法
//update执行了两件事(1.封装sql语句;2.封装参数)
User user = jdbcTemplate.queryForObject("SELECT * FROM ACCOUNT where id = ?", new BeanPropertyRowMapper<User>(User.class), "1");
//通过判断,内部执行的是execute方法
{
获取数据库连接对象
初始化statement对象
action实际对象是匿名内部类
{
将prepareStatement对象和传入的参数进行封装
rs = ps.executeQuery(); 执行sql
return rse.extractData(rs)
{
创建一个大小为1的集合
使用BeanPropertyRowMapper将结果集中的数据封装到一个指定的对象中(通过反射 + 内省 实现)
}
}
}
原文:https://www.cnblogs.com/rookie--/p/14737190.html