你不得不知道的Spring基础知识之Spring持久层(4)

本文详细介绍了Spring JDBC的使用,包括xxxTemplate、连接池类型、JdbcTemplate的实例流程,以及批量添加产品、模糊查询和产品分页的实战步骤。通过JdbcTemplate实现了数据的高效操作,如批量插入、模糊查询和分页查询,展示了Spring JDBC在数据库操作中的灵活性。
摘要由CSDN通过智能技术生成

目录

Spring持久层 xxxTemplate

连接池的种类

Spring-jdbc

实例流程

练习

    1. 批量添加产品

    2. 模糊查询产品

    3. 产品分页 【你要第几页 返回第几页的内容】


Spring持久层 xxxTemplate

  • ORM支持
  • 快速第三方支持

image.png

xxxTemplate -> DataSource -> Connection

 

连接池的种类

  • 本地连接池
  • 应用服务器连接池

Spring-jdbc

  • 对象xxxTemplate,例如:JDBCTemplate
  • 依赖关系都依赖与DataSource

实例流程

  1. 在pom.xml中引入spring-jdbc、mysql-connector-java和阿里连接池druid 【如果遇到xxxTemplate,那么spring-jdbc必须要加上】

image.png

     2. 创建application-contextForJDBC.xml文件,配置dataSource,使用

<bean id = "JTemplate" class = "...JDBCTemplate"><bean/>

image.png

     3. 在团队开发的时候,只需要在基础性的模板中引入其他的xml文件即可 例:

<import resource = "application-context-jdbc.xml">

image.png

     4. 测试类App测试

DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
Connection connection = dataSource.getConnection();
if(connection != null){sout("ok");}

image.png

     5. 新建UsersService类,添加JdbcTemplate和方法函数isLogin(),然后getter and setter

image.png

     6. 使用queryForList实现数据库查询操作

image.png

     7. 然后在测试类中调用UsersSevice进行测试

image.png

 

练习

    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());
        }

       -  测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TomLazy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值