知识储备
- Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发
- 步骤:
-
导入jar包
-
创建JdbcTemplate对象。依赖于数据源DataSource
- JdbcTemplate template = new JdbcTemplate(ds);
-
调用JdbcTemplate的方法来完成CRUD的操作
- update():执行DML语句。增、删、改语句
- queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
- 注意:这个方法查询的结果集长度只能是1
- queryForList():查询结果将结果集封装为list集合
- 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
- query():查询结果,将结果封装为JavaBean对象
- query的参数:RowMapper
- 一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
- new BeanPropertyRowMapper<类型>(类型.class)
- query的参数:RowMapper
- queryForObject:查询结果,将结果封装为对象
- 一般用于聚合函数的查询
-
=============================================================
JDBC(连接池,template)自己的理解小结
:东西很多容易乱,自己理解为三明治结构,连接的获取和释放都由utils编写(处于两端点)比较稳妥,不管是连接池还是普通连接,即把注册驱动
或者
获取DataSource即new 一个由DruidDataSourceFactory工厂类创造的数据源对象(传入pro文件----字节文件)都写在static代码块内:
小结一个基础,就是传入pro.load的参数的两种不同,一种是字节,一种是字符,字符注意是因为要手动去获取string而来的,注意基本功
utils类的具体1:
private static String Driver;
static {//立马注册驱动,顺便把要的内容拿进来,比如url和user
try {
Properties pro = new Properties();
ClassLoader c = JDBCutils.class.getClassLoader();
URL s = c.getResource("day.properties");
String path = s.getPath();
pro.load(new FileReader(path));/////这里
Driver = pro.getProperty("Driver");
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
Class.forName(Driver);
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
utils类的具体2:
private static DataSource ds;
static {
Properties properties = new Properties();
try {
properties.load(JDBCutils.class.getClassLoader().getResourceAsStream("druid.properties"));////这里
ds = DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
注意细节,类加载器获取的方式不同,第一个是返回一个Resource,第二个是直接返回一个字节流,
- 第一个为什么要获取这个URL统一资源,因为这个url类有个方法可以获取路径path,兜了一圈都是为了从这个资源获取路径,然后这个路径可以帮助新建一个FileReader匿名对象从而pro加载的都是字符串的内容,便于后期手动的获取内容。
- 而第二个简直粗暴,直接字节流,说明Druid的太强大了,工厂类直接处理properties(内是字节流)文件,就能知道你的信息,所以properties要写的规范一点
三明治结构的中间就是JDBCtemplate:
注意先来区别一下,不用template和使用了的区别,看下面代码,可以知道,以前需要获取具体的连接,然后再执行,preparedStatement设置一些参数,而且需要释放资源,而且如果需要返回一个集合,自己定义一个类后得手动定义一个LIST然后用while语句添加,很麻烦
PreparedStatement preparedStatement = null;
Connection connection = null;
try {
connection = JDBCutils.getConnection();
String sql = "insert into user values(null,?,?)";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "sss");
preparedStatement.setString(2, "12313");
int i = preparedStatement.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCutils.close(null, preparedStatement, connection);
}
使用了template之后,可以说只需要给他一个数据源,即数据库连接池,连接都不用拿,只需要写sql,连接都不拿,这得多懒,相当于扔给你一个池子,只说一句sql,拿连接跟释放都是由template完成的。好处,返回结果集时候封装好,但是不要忘记即使用了Spring的template和Druid提供的DataSource(需要pro),还是需要自己去写好JDBCutils,更好地把获取一个池封装好,定义方法,相当于池子要自己造,造完了就坐旁边敲大腿发指挥sql就行了!!!!
DataSource dataSource = JDBCutils.getDataSource();
JdbcTemplate template = new JdbcTemplate(dataSource);
String sql = "update user set username = 'avc' where id = ?";
int update = template.update(sql, 1);
System.out.println(update);