MyBatis查询功能演示

铁佛  金牌会员 | 2024-4-22 05:07:26 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

准备工作

① 创建数据库&数据表
  1. ## 创建数据库
  2. CREATE DATABASE `dbtest1`;
  3. ## 创建数据表
  4. CREATE TABLE `t_user` (
  5.   `id` INT NOT NULL AUTO_INCREMENT,
  6.   `username` VARCHAR(20) DEFAULT NULL,
  7.   `password` VARCHAR(20) DEFAULT NULL,
  8.   `age` INT DEFAULT NULL,
  9.   `gender` CHAR(1) DEFAULT NULL,
  10.   `email` VARCHAR(50) DEFAULT NULL,
  11.   PRIMARY KEY (`id`)
  12. ) ENGINE=INNODB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
复制代码
② 创建实体类
  1. public class User {
  2.     private int id;
  3.     private String username;
  4.     private String password;
  5.     private int age;
  6.     private String gender;
  7.     private String email;
  8.     public User() {
  9.     }
  10.     public User(int id, String username, String password, int age, String gender, String email) {
  11.         this.id = id;
  12.         this.username = username;
  13.         this.password = password;
  14.         this.age = age;
  15.         this.gender = gender;
  16.         this.email = email;
  17.     }
  18.     public int getId() {
  19.         return id;
  20.     }
  21.     public void setId(int id) {
  22.         this.id = id;
  23.     }
  24.     public String getUsername() {
  25.         return username;
  26.     }
  27.     public void setUsername(String username) {
  28.         this.username = username;
  29.     }
  30.     public String getPassword() {
  31.         return password;
  32.     }
  33.     public void setPassword(String password) {
  34.         this.password = password;
  35.     }
  36.     public int getAge() {
  37.         return age;
  38.     }
  39.     public void setAge(int age) {
  40.         this.age = age;
  41.     }
  42.     public String getGender() {
  43.         return gender;
  44.     }
  45.     public void setGender(String gender) {
  46.         this.gender = gender;
  47.     }
  48.     public String getEmail() {
  49.         return email;
  50.     }
  51.     public void setEmail(String email) {
  52.         this.email = email;
  53.     }
  54.     @Override
  55.     public String toString() {
  56.         return "User{" +
  57.                 "id=" + id +
  58.                 ", username='" + username + '\'' +
  59.                 ", password='" + password + '\'' +
  60.                 ", age=" + age +
  61.                 ", gender='" + gender + '\'' +
  62.                 ", email='" + email + '\'' +
  63.                 '}';
  64.     }
  65. }
复制代码
③ 创建mybatis核心配置文件
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3.         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4.         "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6.    
  7.     <properties resource="jdbc.properties"/>
  8.    
  9.     <typeAliases>
  10.         
  11.         <package name="com.evan.entity"/>
  12.     </typeAliases>
  13.    
  14.     <environments default="development">
  15.         <environment id="development">
  16.             <transactionManager type="JDBC"/>
  17.             <dataSource type="POOLED">
  18.                
  19.                 <property name="driver" value="${jdbc.driver}"/>
  20.                
  21.                 <property name="url" value="${jdbc.url}"/>
  22.                
  23.                 <property name="username" value="${jdbc.username}"/>
  24.                
  25.                 <property name="password" value="${jdbc.password}"/>
  26.             </dataSource>
  27.         </environment>
  28.     </environments>
  29.    
  30.     <mappers>
  31.         
  32.         <package name="com.evan.mapper"/>
  33.     </mappers>
  34. </configuration>
复制代码
④ 创建jdbc.properties
  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/dbtest1?serverTimezone=UTC
  3. jdbc.username=root
  4. jdbc.password=123456
复制代码
⑤ 添加依赖
  1. <dependencies>
  2. <dependency>
  3.     <groupId>org.mybatis</groupId>
  4.     <artifactId>mybatis</artifactId>
  5.     <version>3.5.7</version>
  6. </dependency>
  7. <dependency>
  8.     <groupId>junit</groupId>
  9.     <artifactId>junit</artifactId>
  10.     <version>4.13.2</version>
  11.     <scope>test</scope>
  12. </dependency>
  13. <dependency>
  14.     <groupId>mysql</groupId>
  15.     <artifactId>mysql-connector-java</artifactId>
  16.     <version>8.0.32</version>
  17. </dependency>
  18. <dependency>
  19.     <groupId>log4j</groupId>
  20.     <artifactId>log4j</artifactId>
  21.     <version>1.2.17</version>
  22. </dependency>
  23. <dependency>
  24.     <groupId>commons-logging</groupId>
  25.     <artifactId>commons-logging</artifactId>
  26.     <version>1.2</version>
  27. </dependency>
  28. </dependencies>
复制代码
⑥ 创建SqlSessionUtil
  1. public class SqlSessionUtil {
  2.     private static final Log logger = LogFactory.getLog(SqlSessionUtil.class);
  3.     public static SqlSession getSqlSession() {
  4.         SqlSession sqlSession = null;
  5.         try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml");) {
  6.             SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
  7.             SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
  8.             sqlSession = sqlSessionFactory.openSession(true);
  9.         } catch (IOException e) {
  10.             logger.error(e);
  11.         }
  12.         return sqlSession;
  13.     }
  14. }
复制代码
⑦ 创建log4j.xml
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  3. <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  4.     <appender name="STDOUT" >
  5.         <param name="Encoding" value="UTF-8" />
  6.         <layout >
  7.             <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n" />
  8.         </layout>
  9.     </appender>
  10.     <logger name="java.sql">
  11.         <level value="debug" />
  12.     </logger>
  13.     <logger name="org.apache.ibatis">
  14.         <level value="info" />
  15.     </logger>
  16.     <root>
  17.         <level value="debug" />
  18.         <appender-ref ref="STDOUT" />
  19.     </root>
  20. </log4j:configuration>
复制代码
查询返回实体类对象的用户信息

查询返回一条数据使用实体类接收。
  1. /**
  2.   * 根据id查询用户信息
  3.   * @param id
  4.   * @return
  5.   */
  6. User getUserById(@Param("id") Integer id);
复制代码
  1. <select id="getUserById" resultType="com.evan.entity.User">
  2.         select * from t_user where id = #{id}
  3. </select>
复制代码
  1. @Test
  2. public void test1() {
  3.         SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.         SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5.         System.out.println(mapper.getUserById(17));
  6.         sqlSession.close();
  7. }
复制代码
查询返回List集合的所有用户信息

使用List集合接收查询返回的多条数据。
  1.     /**
  2.      * 查询所有用户信息
  3.      * @return
  4.      */
  5.     List<User> getAllUser();
复制代码
  1.     <select id="getAllUser" resultType="com.evan.entity.User">
  2.     <select id="getAllUserMap" resultType="map">
  3. <select id="getAllUserMap" resultType="map">
  4.     select * from t_user
  5. </select>
  6. </select>
  7.     </select>
复制代码
  1. @Test
  2. public void test2() {
  3.         SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.         SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5.         List<User> users = mapper.getAllUser();
  6.         users.forEach(System.out::println);
  7.         sqlSession.close();
  8. }
复制代码
说明:
当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常TooManyResultsException;
但是若查询的数据只有一条,可以使用实体类或集合作为返回值。
查询返回Map集合的所有用户信息

Map集合返回单条记录
  1.     /**
  2.      * 根据id查询用户信息(Map集合接收)
  3.      * @param id
  4.      * @return
  5.      */
  6.     Map<String,Object> getUserByIdMap(@Param("id") Integer id);
复制代码
  1. <select id="getUserByIdMap" resultType="map">
  2. <select id="getAllUserMap" resultType="map">
  3. <select id="getAllUserMap" resultType="map">
  4.     select * from t_user
  5. </select>
  6. </select> where id = #{id}
  7. </select>
复制代码
  1. @Test
  2. public void test3() {
  3.     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.     SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5.     Map<String, Object> users = mapper.getUserByIdMap(1002);
  6.     System.out.println(users);
  7.     sqlSession.close();
  8. }
复制代码
Map集合返回多条记录

方式1:使用List集合接收Map查询的数据
  1. /**
  2.   * 查询所有用户信息(list集合接收Map集合查询的所有数据)
  3.   * @return
  4.   */
  5. List<Map<String,Object>> getAllUserMap();
复制代码
  1. <select id="getAllUserMap" resultType="map">
  2. <select id="getAllUserMap" resultType="map">
  3.     select * from t_user
  4. </select>
  5. </select>
复制代码
  1. @Test
  2. public void test5() {
  3.     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.     SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5.     List<Map<String, Object> > userList = mapper.getAllUserMap();
  6.     userList.forEach(System.out::println);
  7.     sqlSession.close();
  8. }
复制代码
方式2:@MapKey注解
  1. @MapKey("id")
  2. Map<String,Object> getAllUserMap();
复制代码
  1. <select id="getAllUserMap" resultType="map">
  2. <select id="getAllUserMap" resultType="map">
  3.     select * from t_user
  4. </select>
  5. </select>
复制代码
  1. @Test
  2. public void test5() {
  3.     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.     SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5.     Map<String, Object> userMap = mapper.getAllUserMap();
  6.     System.out.println(userMap);
  7.     sqlSession.close();
  8. }
复制代码
结论:
查询所有的用户信息为map集合时:
若查询的数据有多条时,并且要将每条数据转换为map集合,此时有两种解决方案:
1、将mapper接口方法的返回值设置为泛型是map的list集合
List getAllUserMap();
显示结果的格式(无序结果集):
{password=123456,gender=男,id=1001,age=18,email=lisi@qq.com,username=李四}
2、可以将每条数据转换的map集合放到一个大的Map集合中,但是必须要通过@MapKey注解将查询的某个字段的值作为大的Map集合的键。
@MapKey("id")
Map getAllUserMap();
相当于:Map
显示结果格式:
{
1001={password=123456, gender=男, id=1001, age=15, email=root@qq.com, username=root},
1002={password=123456, gender=女, id=1002, age=20, email=zh3@sina.cn, username=张三}
}
查询总记录数
  1. /**
  2. * 查询用户总记录数
  3. * @return
  4. */
  5. Integer getCount();
复制代码
  1. <select id="getCount" resultType="integer">
  2.     select count(1) from t_user
  3. </select>
复制代码
  1. @Test
  2. public void test4() {
  3.     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
  4.     SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
  5.     Integer count = mapper.getCount();
  6.     System.out.println(count);
  7.     sqlSession.close();
  8. }
复制代码
MyBatis对Java常用类型设置的类型别名




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表