Mybatis控制台打印sql能查到数据,但是程序返回null

关于传参,Mybatis IN函数的用法,太马虎了浪费很多时间。

错误实例:Mybatis xml配置文件

控制台输出语句

正确的Mybatis xml文件配置

控制台输出语句

### MyBatis 实现控制台多级菜单的增删改查功能 在开发基于控制台的应用程序时,通常会涉及对多级菜单的数据管理操作。以下是利用 MyBatis 实现控制台多级菜单的增删改查功能的具体方法。 #### 数据库设计 假设有一个 `menu` 表用于存储菜单信息: | 字段名 | 类型 | 描述 | |--------------|--------------|--------------------------| | menu_id | INT | 主键,自增长 | | parent_id | INT | 父节点 ID | | name | VARCHAR(100) | 菜单名称 | SQL 创建语句如下: ```sql CREATE TABLE IF NOT EXISTS menu ( menu_id INT AUTO_INCREMENT PRIMARY KEY, parent_id INT DEFAULT NULL, name VARCHAR(100) NOT NULL ); ``` --- #### 映射文件配置 (`MenuMapper.xml`) 定义 MyBatisSQL 查询和更新逻辑: ```xml <mapper namespace="com.example.mapper.MenuMapper"> <!-- 查询所有菜单 --> <select id="selectAllMenus" resultType="com.example.model.Menu"> SELECT menu_id, parent_id, name FROM menu ORDER BY parent_id ASC; </select> <!-- 根据ID查询菜单 --> <select id="selectMenuById" parameterType="int" resultType="com.example.model.Menu"> SELECT menu_id, parent_id, name FROM menu WHERE menu_id = #{id}; </select> <!-- 添加新菜单 --> <insert id="addMenu" parameterType="com.example.model.Menu"> INSERT INTO menu(parent_id, name) VALUES (#{parentId}, #{name}); </insert> <!-- 更新菜单 --> <update id="updateMenu" parameterType="com.example.model.Menu"> UPDATE menu SET parent_id = #{parentId}, name = #{name} WHERE menu_id = #{id}; </update> <!-- 删除菜单 --> <delete id="deleteMenu" parameterType="int"> DELETE FROM menu WHERE menu_id = #{id}; </delete> </mapper> ``` --- #### Java实体类 (`Menu.java`) 创建对应的实体类来表示菜单对象: ```java public class Menu { private int menuId; private Integer parentId; // 可能为空 private String name; // Getters and Setters } ``` --- #### Mapper接口 (`MenuMapper.java`) 定义与 XML 配置对应的操作方法: ```java import org.apache.ibatis.annotations.Param; import java.util.List; public interface MenuMapper { List<Menu> selectAllMenus(); Menu selectMenuById(@Param("id") int id); void addMenu(Menu menu); void updateMenu(Menu menu); void deleteMenu(@Param("id") int id); } ``` --- #### 控制台交互逻辑 编写主程序实现增删改查功能: ```java import com.example.mapper.MenuMapper; import com.example.model.Menu; import org.apache.ibatis.session.SqlSession; import java.util.Scanner; public class ConsoleApp { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (true) { System.out.println("\n请选择操作:"); System.out.println("1. 查看所有菜单"); System.out.println("2. 新增菜单"); System.out.println("3. 修改菜单"); System.out.println("4. 删除菜单"); System.out.println("5. 退出"); int choice = scanner.nextInt(); switch (choice) { case 1 -> viewAllMenus(scanner); case 2 -> addNewMenu(scanner); case 3 -> updateExistingMenu(scanner); case 4 -> deleteMenu(scanner); case 5 -> { System.out.println("退出程序..."); return; } default -> System.out.println("无效选项!"); } } } private static void viewAllMenus(Scanner scanner) { try (SqlSession session = SqlSessionUtils.getSqlSession()) { MenuMapper mapper = session.getMapper(MenuMapper.class); List<Menu> menus = mapper.selectAllMenus(); for (Menu menu : menus) { System.out.printf("ID: %d, Parent ID: %s, Name: %s\n", menu.getMenuId(), menu.getParentId() == null ? "-" : menu.getParentId().toString(), menu.getName()); } } } private static void addNewMenu(Scanner scanner) { System.out.print("请输入父节点ID(无则输入0):"); int parentId = scanner.nextInt(); System.out.print("请输入菜单名称:"); String name = scanner.next(); Menu menu = new Menu(); menu.setParentId(parentId == 0 ? null : parentId); menu.setName(name); try (SqlSession session = SqlSessionUtils.getSqlSession()) { MenuMapper mapper = session.getMapper(MenuMapper.class); mapper.addMenu(menu); session.commit(); System.out.println("新增成功!"); } } private static void updateExistingMenu(Scanner scanner) { System.out.print("请输入要修改的菜单ID:"); int id = scanner.nextInt(); System.out.print("请输入新的父节点ID(无则输入0):"); int parentId = scanner.nextInt(); System.out.print("请输入新的菜单名称:"); String name = scanner.next(); Menu menu = new Menu(); menu.setMenuId(id); menu.setParentId(parentId == 0 ? null : parentId); menu.setName(name); try (SqlSession session = SqlSessionUtils.getSqlSession()) { MenuMapper mapper = session.getMapper(MenuMapper.class); mapper.updateMenu(menu); session.commit(); System.out.println("修改成功!"); } } private static void deleteMenu(Scanner scanner) { System.out.print("请输入要删除的菜单ID:"); int id = scanner.nextInt(); try (SqlSession session = SqlSessionUtils.getSqlSession()) { MenuMapper mapper = session.getMapper(MenuMapper.class); mapper.deleteMenu(id); session.commit(); System.out.println("删除成功!"); } } } ``` 上述代码实现了基本的增删改查功能,通过控制台提供用户交互界面[^1]。 --- ### 注意事项 - **字段映射一致性**:确保实体类中的属性名与数据库表中的列名保持一致,或者通过 `<resultMap>` 进行显式映射[^2]。 - **空值处理**:对于可能为空的字段(如 `parent_id`),需特别注意其默认值设置以及在业务逻辑中的判断条件[^3]。 - **事务管理**:每次操作完成后记得提交事务关闭资源[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值