JdbcTemplate 香不香

本文探讨了JdbcTemplate与MyBatis、Hibernate等ORM框架在不同场景下的适用性。JdbcTemplate适用于简单灵活的数据操作,如数据迁移和临时数据处理;而ORM框架如MyBatis和Hibernate则在对象关系映射和复杂查询上表现更佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

似曾相识

Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中,配置非常的简单。spring 的好处就是提供了很多非常方便的功能,这个和resttemplate 类似的,对于http请求的封装也是非常的好用,我也是经常的使用的。具体使用随便百度一下即可: https://www.cnblogs.com/caoyc/p/5630622.html 很简单的。

@Bean
JdbcTemplate jdbcTemplate(DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        return jdbcTemplate;
   }

提供方法

JdbcTemplate主要提供以下五类方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
  • update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
  • query方法及queryForXXX方法:用于执行查询相关语句;
  • call方法:用于执行存储过程、函数相关语句。

问题

JdbcTemplate 使用场景是什么呢?如何要使用它,什么场景使用比较ok?
现实生产环境中很多的小伙伴一定是使用mybaits ?(mybaits-plus or mybaits-generator) spring data\hibernate 等等ORM 框架?


对于spring data、Hibernate、mybaits 的优缺点网上有很多的,我这里就不说了,对于这两种我都使用过。简单的谈一下我的感受。

简单聊聊

对于简单的表结构的查询,很明显 Hibernate、spring data 这种JPA类型的比较的方便,基本上都不用写代码纯天然的支持对象的查询,对于数据底层封装的很好,即使是数据库迁移的影响也不是很大;对于mybaits 来说在现有的框架比如mybaits generator、mybaits plus的支持下基本上也是不用写代码的,感觉挺好的,对于底层子查询想优化比较方便 关联想优化比较的简单,相对于Hibernate的关联查询就是鸡肋了…虽然我也不主张用多表的关联查询. 在实际项目中,看到过由于Hibernate进行了封装,封装了一层 基本的操作,然后很多的查询都走的Hibernate exesql 转换为对象的操作,手动编写sql的拼接的逻辑,整个项目中填充了不少…难受想哭,被无理由的封装腐化了Hibernate,这个对于mybatis 来说就比较的友好了,sql的动态组装的逻辑放在xml中实现,支持sql的逻辑处理和对象的映射,然后通过代理透给具体的java类,对于开发比较的友好,然后想优化sql 也比较的简单,代码和sql 分离,使用free mybatis idea 插件+mybaits 扩展库(mybatis-plus,mybatis generator) 基本上的xml 动态是不需要编写的,动态生成的默认代码。编写java 类就行了…

场景

说了这么多还是mybaits 香香的~ 阿?今天的主脚是JdbcTemplate啊,虽然很香啊,but 编写xml的配置文件特别是逻辑条件比较复杂 多表关联,然后编写映射你就会发现不是很简单啊,得相当的熟悉,调试走通这个代码需要一定的time…

数据迁移

项目上线…历史数据处理,数据迁移、跑跑数据,这种内容就是数据更新,数据查询进行处理,需要极度的灵活,编写简单方便,那么JdbcTemplate 可能比较适合做这样的事情,可能有事情这个代码编写之后估计后续就不会使用了仅仅用了一次,那么这种场景真香,简单的拼接sql 即可实现复杂的逻辑查询,xml 不用配置,java 类不用写,是不是很简单。手工编写sql,条件不是十分的复杂,这种场景用起来十分的方便哦。

总结

工具工具…看你怎么用,都香香的。






# 美食推荐系统实现 ## 【案例目标】 通过所学的 Spring 数据库编程知识,实现美食推荐系统的基础功能。用户在控制台输入美食类别,系统返回该类别下的推荐菜品及其详情(如食材、做法简介)。若类别存在则提示 “无该类别美食”。 **项目运行成功后控制台效果示例**: ``` 欢迎来到美食推荐系统 请输入想吃的美食类别(如中餐、西餐、甜点): 中餐 推荐菜品:麻婆豆腐 食材:豆腐、牛肉末、辣椒、花椒 做法简介:豆腐焯水切块,炒肉末和调料,加入豆腐焖煮,勾芡收汁即可。 推荐菜品:鱼肉丝 食材:猪里脊肉、黑木耳、胡萝卜、笋丝 做法简介:肉丝腌制后炒制,加入混合调味汁和配菜翻炒,酸甜咸口味。 ``` ## 【思路分析】 根据美食推荐系统需求,实现步骤如下: 1. **创建数据库**:存储美食类别、菜品名称、食材、做法等信息。 1. **配置数据库连接**:在 XML 文件中配置数据源和 JDBC 模板。 1. **编写 Dao 层**:实现按类别查询菜品的方法。 1. **编写 Controller 层**:处理用户输入逻辑,调用 Dao 层获取数据并输出结果。 ## 【实现步骤】 ### 1. 创建数据库 在 MySQL 的food_recommend数据库中创建dish表,表结构如下: | 字段名 | 类型 | 长度 | 是否主键 | 说明 | | ------------ | ------- | ---- | -------- | ------------------ | | id | int | 11 | 是 | 菜品编号 | | category | varchar | 255 | 否 | 美食类别(如中餐) | | dish_name | varchar | 255 | 否 | 菜品名称 | | ingredients | varchar | 1000 | 否 | 食材列表 | | cooking_desc | varchar | 1000 | 否 | 做法简介 | ### 2. 编写实体类 在项目的com.food.entity包中创建Dish类,定义属性及对应的 getter/setter 方法: ``` package com.food.entity; public class Dish { private int id; private String category; private String dishName; private String ingredients; private String cookingDesc; // getter/setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getDishName() { return dishName; } public void setDishName(String dishName) { this.dishName = dishName; } public String getIngredients() { return ingredients; } public void setIngredients(String ingredients) { this.ingredients = ingredients; } public String getCookingDesc() { return cookingDesc; } public void setCookingDesc(String cookingDesc) { this.cookingDesc = cookingDesc; } } ``` ### 3. 编写配置文件(applicationContext-food.xml) 在resources文件夹下创建配置文件,配置数据源和 JDBC 模板: ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> <!-- 配置数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/food_recommend?useSSL=false" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <!-- 配置JDBC模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置Dao层Bean --> <bean id="dishDao" class="com.food.dao.impl.DishDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate" /> </bean> </beans> ``` ### 4. 编写 Dao 层 #### 接口定义(DishDao.java) 在com.food.dao包中创建接口,声明按类别查询菜品的方法: ``` package com.food.dao; import com.food.entity.Dish; import java.util.List; public interface DishDao { List<Dish> findDishesByCategory(String category); } ``` #### 实现类(DishDaoImpl.java) 在com.food.dao.impl包中实现接口方法,使用 JDBC 模板查询数据: ``` package com.food.dao.impl; import com.food.dao.DishDao; import com.food.entity.Dish; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import java.util.List; public class DishDaoImpl implements DishDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public List<Dish> findDishesByCategory(String category) { String sql = "SELECT * FROM dish WHERE category = ?"; return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Dish.class), category); } } ``` ### 5. 编写 Controller 层(FoodController.java) 在com.food.controller包中创建类,处理用户输入和业务逻辑: ``` package com.food.controller; import com.food.dao.DishDao; import com.food.entity.Dish; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import java.util.List; import java.util.Scanner; public class FoodController { public static void main(String[] args) { System.out.println("欢迎来到美食推荐系统"); System.out.print("请输入想吃的美食类别(如中餐、西餐、甜点): "); Scanner scanner = new Scanner(System.in); String category = scanner.nextLine(); // 加载配置文件并获取Dao实例 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-food.xml"); DishDao dishDao = context.getBean("dishDao", DishDao.class); // 查询该类别下的菜品 List<Dish> dishes = dishDao.findDishesByCategory(category); if (dishes.isEmpty()) { System.out.println("无该类别美食"); } else { for (Dish dish : dishes) { System.out.println("\n推荐菜品:" + dish.getDishName()); System.out.println("食材:" + dish.getIngredients()); System.out.println("做法简介:" + dish.getCookingDesc()); } } scanner.close(); } } ``` ## 【扩展任务】(可选) 在基础功能上实现注册新菜品功能: 1. 用户输入菜品名称、类别、食材、做法,系统将数据存入数据库。 1. 可添加简单验证(如类别是否合法、食材格式是否正确)。 1. 调用第三方接口(如美食图片 API)为推荐菜品返回配图链接。idea软件实现na
05-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值