【Mybatis】学习笔记01:连接数据库,实现增删改

【Mybatis】学习笔记02:实现简单的查

【MyBatis】学习笔记03:配置文件进一步解读(非常重要)

【MyBatis】学习笔记04:配置文件模板

【MyBatis】学习笔记05:获取参数值的两种方式

【总结】

1.查询出的数据只有一条:

(1)可以通过实体类对象接收

(2)可以通过List集合接收(Eg1)

(3)可以通过map接收(Eg4)

2.若查询的数据有多条:

(1)可以通过List集合接收(Eg2)

(2)可以通过map类型的List集合接收(Eg5(1))

(3)可以在mapper接口的方法上添加@MapKey注解,此时就可以将每条数据转为map集合作为值,以某个字段的值作为键,放在同一个map集合里面。(Eg5(2))

(注意)|(一定不能通过实体类对象接收,否则会抛出异常TooManyResultsException)

准备

(1)创建接口

(2)创建对应的映射文件

查询一个实体类对象

  1. //SelectMapper 接口
  2. public interface SelectMapper {
  3. /**
  4. * 查询用户信息
  5. * @param id 用户id
  6. * @return 用户对象
  7. */
  8. User getUserById(Integer id);
  9. }
  1. <!-- User getUserById(Integer id);-->
  2. <select id="getUserById" resultType="User">
  3. select * from t_users where id= #{id}
  4. </select>
  1. @Test
  2. public void getUserById(){
  3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  4. SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5. User result = mapper.getUserById(4);
  6. System.out.println(result);
  7. }

cc.mllt.sky.utils.SqlSessionUtils.java

  1. package cc.mllt.sky.utils;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. public class SqlSessionUtils {
  9. public static SqlSession getSqlSession(){
  10. SqlSession sqlSession = null;
  11. try{
  12. InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
  13. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
  14. sqlSession = sqlSessionFactory.openSession(true);
  15. }catch (IOException e){
  16. e.printStackTrace();
  17. }
  18. return sqlSession;
  19. }
  20. }

查询返回一个List集合

Eg1:查询出的数据只有一条

  1. //SelectMapper 接口
  2. public interface SelectMapper {
  3. /**
  4. * 查询用户信息
  5. * @param id 用户id
  6. * @return 用户对象
  7. */
  8. List<User> getUserById(Integer id);
  9. }
  1. <!-- User getUserById(Integer id);-->
  2. <select id="getUserById" resultType="User">
  3. select * from t_users where id= #{id}
  4. </select>
  1. @Test
  2. public void getUserById(){
  3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  4. SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5. List<User> result = mapper.getUserById(4);
  6. System.out.println(result);
  7. }

Eg2:查询出的数据有多条

  1. //SelectMapper 接口
  2. /**
  3. * 查询所有用户
  4. * @return List<User>
  5. */
  6. List<User> getUsers();
  1. <!-- List<User> getUsers();-->
  2. <select id="getUsers" resultType="User">
  3. select * from t_users
  4. </select>
  1. @Test
  2. public void getUsers(){
  3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  4. SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5. List<User> result = mapper.getUsers();
  6. System.out.println(result);
  7. }

其他返回数据类型(补充:MyBatis类型别名)

Eg3:返回数据为一行一列

  1. //SelectMapper 接口
  2. /**
  3. * 查询用户表行数
  4. * @return Integer
  5. */
  6. Integer getCount();
  1. <!-- Integer getCount();-->
  2. <select id="getCount" resultType="java.lang.Integer">
  3. select count(*) from t_users
  4. </select>

resultType中填写IntegerintegerintInt_int都不会报错

原因在 官方手册Configuration XML > typeAliases(类型别名)

因为MyBatis中设置默认的类型别名

Alias Mapped Type
_int int
int Integer
integer Integer

Alias:别名

Mapped Type:映射地址


java.lang.Integer --> int , Integer

int --> _int , _integer

Map --> map

String --> string

  1. @Test
  2. public void getCount(){
  3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  4. SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5. Integer result = mapper.getCount();
  6. System.out.println(result);
  7. }

Eg4:返回一条数据 返回数据类型为Map集合

  1. //SelectMapper 接口
  2. /**
  3. * 根据用户id获取Map类型的信息
  4. * @param id 用户id
  5. * @return Map类型用户信息 Map<String,Object>
  6. */
  7. Map<String,Object> getUserByIdToMap(@Param("id") Integer id);
  1. <!-- Map<String,Object> getUserByIdToMap(@Param("id") Integer id);-->
  2. <select id="getUserByIdToMap" resultType="map">
  3. select * from t_users where userId= #{id}
  4. </select>
  1. @Test
  2. public void getUserByIdToMap(){
  3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  4. SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5. Map<String, Object> result = mapper.getUserByIdToMap(4);
  6. System.out.println(result);
  7. }

获得的map集合结果以字段为键

输出结果如下

  1. {userPassword=123456改了密码, userCount=test001, userGrade=1, userRegDate=2022-03-01T00:00, userName=测试用户改了名, userId=4, userBlance=0}

Eg5:返回多条数据 返回数据类型为map集合

(1)方式1: 将多个Map放在List中

  1. //SelectMapper 接口
  2. /**
  3. * 获取所有用户信息
  4. * @return Map类型用户信息 Map<String,Object>
  5. */
  6. List<Map<String,Object>> getusersToMap();
  7. }
  1. <!-- Map<String,Object> getusersToMap();-->
  2. <select id="getusersToMap" resultType="map">
  3. select * from t_users
  4. </select>
  1. @Test
  2. public void getUsersToMap(){
  3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  4. SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5. List<Map<String, Object>> result = mapper.getusersToMap();
  6. System.out.println(result);
  7. }

(2)方式2: @MapKey()注解

  1. //SelectMapper 接口
  2. /**
  3. * 获取所有用户信息
  4. * @return Map类型用户信息 Map<String,Object>
  5. */
  6. @MapKey("userId")//MySQl中字段名,最好为key
  7. Map<String,Object> getusersToMap();
  1. <!-- Map<String,Object> getusersToMap();-->
  2. <select id="getusersToMap" resultType="map">
  3. select * from t_users
  4. </select>
  1. @Test
  2. public void getUsersToMap(){
  3. SqlSession sqlSession = SqlSessionUtils.getSqlSession();
  4. SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5. // List<Map<String, Object>> result = mapper.getusersToMap();
  6. Map<String, Object> result = mapper.getusersToMap();
  7. System.out.println(result);
  8. }

输出结果如下

  1. {1={userPassword=qq2686485465, userCount=mllt9920, userGrade=999, userRegDate=2022-03-20T00:00, userName=萌狼蓝天, userId=1, userBlance=100000000}, 2={userPassword=134679852, userCount=xrilang, userGrade=888, userRegDate=2022-03-25T00:00, userName=向日狼, userId=2, userBlance=10240000}, 4={userPassword=123456改了密码, userCount=test001, userGrade=1, userRegDate=2022-03-01T00:00, userName=测试用户改了名, userId=4, userBlance=0}, 5={userPassword=123, userCount=mllt@xrilang.com, userGrade=0, userName=张三, userId=5, userBlance=0}}

【MyBatis】学习笔记06:各种查询所返回数据的数据类型的更多相关文章

  1. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  2. mybatis学习笔记(10)-一对一查询

    mybatis学习笔记(10)-一对一查询 标签: mybatis mybatis学习笔记10-一对一查询 resultType实现 resultMap实现 resultType和resultMap实 ...

  3. Mybatis学习笔记(七) —— 关联查询

    一.一对多查询 需求:查询所有订单信息,关联查询下单用户信息. 注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则 ...

  4. Mybatis学习笔记7 - select查询的相关属性使用

    1.当接口的返回类型是集合List时,resultType要写集合中元素的类型 示例如下: 接口定义: package com.mybatis.dao; import com.mybatis.bean ...

  5. mybatis学习笔记(14)-查询缓存之中的一个级缓存

    mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...

  6. Mybatis学习笔记(二) 之实现数据库的增删改查

    开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...

  7. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  8. Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)

    一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...

  9. mybatis学习笔记--常见的错误

    原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...

  10. mybatis学习笔记(五):mybatis 逆向工程

    mybatis学习笔记(五):mybatis 逆向工程 在日常开发中,如果数据库中存在多张表,自己手动创建 多个pojo 类和编写 SQL 语法配置文件,未免太过繁琐,mybatis 也提供了一键式生 ...

随机推荐

  1. USB 逻辑分析仪分析丢包怎么分析(lecroy USB 逻辑分析仪)

    使用 LeCroy USB 逻辑分析仪分析 USB 数据传输中的丢包现象,通常涉及以下步骤: 1. 设置触发条件 在 LeCroy USB 逻辑分析仪中,设置适当的触发条件来捕获数据包丢失的场景.常见 ...

  2. Serilog文档翻译系列(八) - 记录器的生命周期、可靠性

    01.记录器的生命周期 Serilog 大多数情况下"只需使用",并且在创建和处理日志记录器时不需要过多考虑.然而,由于以下原因: 某些接收器(sink)涉及后台进程,特别是那些使 ...

  3. for 和双重 for 的区别?

    1. 内层的循环可以看作外层循环的语句 2. 外层循环执行 1 次 ,内层循环执行全部

  4. webpack与grunt、gulp的不同

    首先,它们的共同点三者都是前端构建工具,grunt和gulp早期比较流行,现在 webpack 是主流: 区别:grunt 和 gulp 基于 任务和流 : webpack 基于入口文件,webpac ...

  5. KubeSphere 使用 OpenLDAP 进行统一认证完全指南

    作者:申红磊,青云QingCloud 容器解决方案架构师,开源项目爱好者,KubeSphere Member. 背景 在实际使用中,会有一些用户,在不同场景中经常碰到 OpenLDAP 对接问题: 能 ...

  6. AI五子棋_02_03 Get传输数据 公共密钥

    AI五子棋 第二步 恭喜你到达第二步! 警告:如果你是直接使用浏览器获得本页地址的话,请你返回第一步. 在前一步里,你得到的这样的返回结果 {"is_success": true, ...

  7. Shell之根据关键字符串替换文件中的行

    KEY="所要搜索的关键字符串"FullPath=所要搜索的文件的路径str="要替换行的字符串"     根据关键字符串定位行号:line=`sed -n ' ...

  8. 5.7 Linux Vim可视化模式

    相信大家都使用过带图形界面的操作系统中的文字编辑器,用户可以使用鼠标来选择要操作的文本,非常方便.在 Vim 编辑器中也有类似的功能,但不是通过鼠标,而是通过键盘来选择要操作的文本. 在 Vim 中, ...

  9. 关于C++当中全局变量的释放问题

    一.由来 主要是在修改公司的一个MFC项目的时候遇到的问题,我在MFC页面的析构函数当中对一个全局图像变量进行了释放,具体如下: ai_engine_OCR::~ai_engine_OCR() { / ...

  10. 孤立森林(IForest)代码实现及与PyOD对比

    孤立森林(Isolation Forest)是经典的异常检测算法(论文网址).本文用python对其进行实现,以及与常用的异常检测包PyOD进行效果对比. 简单来说,孤立森林(IForest)中包含若 ...