目录
Spring持久层 xxxTemplate
- ORM支持
- 快速第三方支持
xxxTemplate -> DataSource -> Connection
连接池的种类
- 本地连接池
- 应用服务器连接池
Spring-jdbc
- 对象xxxTemplate,例如:JDBCTemplate
- 依赖关系都依赖与DataSource
实例流程
- 在pom.xml中引入spring-jdbc、mysql-connector-java和阿里连接池druid 【如果遇到xxxTemplate,那么spring-jdbc必须要加上】
2. 创建application-contextForJDBC.xml文件,配置dataSource,使用
<bean id = "JTemplate" class = "...JDBCTemplate"><bean/>
3. 在团队开发的时候,只需要在基础性的模板中引入其他的xml文件即可 例:
<import resource = "application-context-jdbc.xml">
4. 测试类App测试
DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
Connection connection = dataSource.getConnection();
if(connection != null){sout("ok");}
5. 新建UsersService类,添加JdbcTemplate和方法函数isLogin(),然后getter and setter
6. 使用queryForList实现数据库查询操作
7. 然后在测试类中调用UsersSevice进行测试
练习
1. 批量添加产品
- 在productsService中使用batchUpdate()方法实现批量处理
package org.example.service;
import org.example.domain.Products;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Objects;
public class ProductsService {
private JdbcTemplate jdbcTemplate;
private String sql;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void insertBatchProducts(final List<Products> products){
sql = "INSERT INTO Products(pcode,pname,ptid,pprice) values(?,?,?,?)";
getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Products product = products.get(i);
ps.setString(1, product.getPcode());
ps.setString(2, product.getPname());
ps.setInt(3, product.getPtid());
ps.setFloat(4, product.getPprice() );
}
@Override
public int getBatchSize() {
return products.size();
}
});
}
}
- 在application-context-jdbc.xml中配置productsService
<bean id="productsService" class="org.example.service.ProductsService">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
- 在App.java中进行插入测试
ProductsService productsService = (ProductsService) applicationContext.getBean("productsService");
List<Products> products = new ArrayList<>();
PType pType = new PType(1);
PType pType1 = new PType(2);
Products product = new Products("10004","iphone12",1,6500.0f);
products.add(product);
Products product1 = new Products("20003","ipadmini",2,3450.0f);
products.add(product1);
productsService.insertBatchProducts(products);
- 查看数据库,显示插入数据,插入成功
2. 模糊查询产品
- 在productsService中使用findByLikeProductName()方法实现批量处理
public List<Products> findByLikeProductName(String pname){
sql = "SELECT p.pid,p.pcode,p.pname,pt.ptid,pt.ptname,p.pprice,p.addtime FROM products p INNER JOIN ptype pt "
+ "on p.ptid = pt.ptid where pname like ? order by p.addtime desc";
List<Map<String,Object>> data = jdbcTemplate.queryForList(sql,pname);
List<Products> products = new ArrayList<>();
for (Map<String,Object> row : data){
Products product = new Products(
Integer.parseInt(row.get("pid").toString())
,row.get("pcode").toString()
,row.get("pname").toString()
,new PType(Integer.parseInt(row.get("ptid").toString()),row.get("ptname").toString())
,Float.parseFloat(row.get("pprice").toString())
,row.get("addtime").toString());
products.add(product);
}
return products;
}
- 在App.java中进行测试
List<Products> products = productsService.findByLikeProductName("%"+"iphone"+"%");
for (Products p : products) {
System.out.println("产品id:" + p.getPid()
+",产品code:" + p.getPcode()
+",产品名称:" + p.getPname()
+",产品类型:" + p.getPtid().getPtname()
+",产品价格:" + p.getPprice()
+",上架时间:"+ p.getAddtime());
}
这里我没有选择在sql里面写%,因为有占位符的原因会导致报错,暂时没有找到好的方式可以在使用占位符的方式在sql中进行like语句,欢迎大家一起讨论。
- 测试结果
3. 产品分页 【你要第几页 返回第几页的内容】
- 在productsService中使用findByLimit()方法实现分页查询
public List<Products> findByLimit(int pageNum, int pageSize) {
sql = "select p.pid,p.pcode,p.pname,pt.ptid,pt.ptname,p.pprice,p.addtime " +
"from products p " +
"INNER JOIN ptype pt " +
"on p.ptid = pt.ptid limit ?,?";
List<Map<String,Object>> data = jdbcTemplate.queryForList(sql,pageNum,pageSize);
List<Products> products = new ArrayList<>();
for (Map<String,Object> row : data){
Products product = new Products(
Integer.parseInt(row.get("pid").toString())
,row.get("pcode").toString()
,row.get("pname").toString()
,new PType(Integer.parseInt(row.get("ptid").toString()),row.get("ptname").toString())
,Float.parseFloat(row.get("pprice").toString())
,row.get("addtime").toString());
products.add(product);
}
return products;
}
- 在App.java中进行测试
List<Products> products01 = productsService.findByLimit(1*5,5);
for (Products p : products01) {
System.out.println("产品id:" + p.getPid()
+",产品code:" + p.getPcode()
+",产品名称:" + p.getPname()
+",产品类型:" + p.getPtid().getPtname()
+",产品价格:" + p.getPprice()
+",上架时间:"+ p.getAddtime());
}
- 测试结果