MyBatis查询功能演示

准备工作

① 创建数据库&数据表

## 创建数据库
CREATE DATABASE `dbtest1`;

## 创建数据表
CREATE TABLE `t_user` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(20) DEFAULT NULL,
  `password` VARCHAR(20) DEFAULT NULL,
  `age` INT DEFAULT NULL,
  `gender` CHAR(1) DEFAULT NULL,
  `email` VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

② 创建实体类

public class User {

    private int id;
    private String username;
    private String password;
    private int age;
    private String gender;
    private String email;

    public User() {
    }

    public User(int id, String username, String password, int age, String gender, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.gender = gender;
        this.email = email;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

③ 创建mybatis核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 引入外部properties文件,此后就可以在当前文件的数据源连接信息使用${}的方式访问value -->
    <properties resource="jdbc.properties"/>
    <!-- 设置类型别名 -->
    <typeAliases>
        <!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
        <package name="com.evan.entity"/>
    </typeAliases>
    <!--配置多个连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--设置连接数据库的驱动-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--设置连接数据库的连接地址-->
                <property name="url" value="${jdbc.url}"/>
                <!--设置连接数据库的用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--设置连接数据库的密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 引入mybatis的映射文件 -->
    <mappers>
        <!--
            以包为单位引入映射文件
            要求:
            1、mapper接口所在的包要和映射文件所在的包一致
            2、mapper接口要和映射文件的名字一致
        -->
        <package name="com.evan.mapper"/>
    </mappers>
</configuration>

④ 创建jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/dbtest1?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456

⑤ 添加依赖

<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.32</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
</dependencies>

⑥ 创建SqlSessionUtil

public class SqlSessionUtil {

    private static final Log logger = LogFactory.getLog(SqlSessionUtil.class);

    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        try (InputStream is = Resources.getResourceAsStream("mybatis-config.xml");) {
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            logger.error(e);
        }
        return sqlSession;
    }
}

⑦ 创建log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info" />
    </logger>
    <root>
        <level value="debug" />
        <appender-ref ref="STDOUT" />
    </root>
</log4j:configuration>

查询返回实体类对象的用户信息

查询返回一条数据使用实体类接收。

/**
  * 根据id查询用户信息
  * @param id
  * @return
  */
User getUserById(@Param("id") Integer id);
<select id="getUserById" resultType="com.evan.entity.User">
	select * from t_user where id = #{id}
</select>
@Test
public void test1() {
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
	System.out.println(mapper.getUserById(17));
	sqlSession.close();
}

查询返回List集合的所有用户信息

使用List集合接收查询返回的多条数据。

    /**
     * 查询所有用户信息
     * @return
     */
    List<User> getAllUser();
    <select id="getAllUser" resultType="com.evan.entity.User">
        select * from t_user
    </select>
@Test
public void test2() {
	SqlSession sqlSession = SqlSessionUtil.getSqlSession();
	SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
	List<User> users = mapper.getAllUser();
	users.forEach(System.out::println);
	sqlSession.close();
}

说明:
当查询的数据为多条时,不能使用实体类作为返回值,否则会抛出异常TooManyResultsException
但是若查询的数据只有一条,可以使用实体类或集合作为返回值。

查询返回Map集合的所有用户信息

Map集合返回单条记录

    /**
     * 根据id查询用户信息(Map集合接收)
     * @param id
     * @return
     */
    Map<String,Object> getUserByIdMap(@Param("id") Integer id);
<!--Map<String,Object> getUserByIdMap(@Param("id") Integer id);-->
<select id="getUserByIdMap" resultType="map">
    select * from t_user where id = #{id}
</select>
@Test
public void test3() {
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    Map<String, Object> users = mapper.getUserByIdMap(1002);
    System.out.println(users);
    sqlSession.close();
}

Map集合返回多条记录

方式1:使用List集合接收Map查询的数据

/**
  * 查询所有用户信息(list集合接收Map集合查询的所有数据)
  * @return
  */
List<Map<String,Object>> getAllUserMap();
<!-- List<Map<String,Object>> getAllUserMap(); -->
<select id="getAllUserMap" resultType="map">
    select * from t_user
</select>
@Test
public void test5() {
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    List<Map<String, Object> > userList = mapper.getAllUserMap();
    userList.forEach(System.out::println);
    sqlSession.close();
}

方式2:@MapKey注解

@MapKey("id")
Map<String,Object> getAllUserMap();
<!-- Map<String,Object> getAllUserMap(); -->
<select id="getAllUserMap" resultType="map">
    select * from t_user
</select>
@Test
public void test5() {
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    Map<String, Object> userMap = mapper.getAllUserMap();
    System.out.println(userMap);
    sqlSession.close();
}

结论:
查询所有的用户信息为map集合时:
若查询的数据有多条时,并且要将每条数据转换为map集合,此时有两种解决方案:
1、将mapper接口方法的返回值设置为泛型是map的list集合
List<Map<String,Object>> getAllUserMap();
显示结果的格式(无序结果集):
{password=123456,gender=男,id=1001,age=18,email=lisi@qq.com,username=李四}
2、可以将每条数据转换的map集合放到一个大的Map集合中,但是必须要通过@MapKey注解将查询的某个字段的值作为大的Map集合的键。
@MapKey("id")
Map<String,Object> getAllUserMap();
相当于:Map<String,Map<String,Object>>
显示结果格式:
{
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=张三}
}

查询总记录数

/**
* 查询用户总记录数
* @return
*/
Integer getCount();
<!--int getCount();-->
<!-- 在MyBatis中,默认对于Java中常用的类型都设置了类型别名 -->
<select id="getCount" resultType="integer">
    select count(1) from t_user
</select>
@Test
public void test4() {
    SqlSession sqlSession = SqlSessionUtil.getSqlSession();
    SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
    Integer count = mapper.getCount();
    System.out.println(count);
    sqlSession.close();
}

MyBatis对Java常用类型设置的类型别名

image


image

原文地址:https://www.cnblogs.com/lisong0626/p/18003725

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.pom.xml引入依赖 &lt;dependency&gt; &lt;groupId&gt;com.github.pagehelper&lt;/groupId&gt; &lt;artifactId&gt;pagehelper&lt;/artifactId&gt; &lt;version&gt;5
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; &lt;!DOCTYPE configuration PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot; &qu
准备工作 ① 创建数据库&amp;数据表 ## 创建数据库 CREATE DATABASE `dbtest1`; ## 创建数据表 CREATE TABLE `t_user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(20) DEF
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。 创建逆向工程的步骤 1、添加依赖&amp;插件 &lt;!-- 控制Mave
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
resultMap作用是处理数据表中字段与java实体类中属性的映射关系。 准备工作 ① 创建数据库&amp;数据表 CREATE DATABASE `dbtest1`; CREATE TABLE `t_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT, `em
EHCache缓存针对于MyBatis的二级缓存。 MyBatis默认二级缓存是SqlSessionFactory级别的。 添加依赖 &lt;!-- MyBatis-EHCache整合包 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.cac
MyBatis 提供了一级缓存和二级缓存的支持,用于提高数据库查询的性能,减少不必要的数据库访问。 一级缓存(SqlSession 级别的缓存) 一级缓存是 MyBatis 中最细粒度的缓存,也称为本地缓存。它存在于每个 SqlSession 的生命周期中,当 SqlSession 被关闭或清空时,
动态SQL是 MyBatis 中非常强大且灵活的功能,允许你根据不同的条件构建SQL查询。 这主要通过 &lt;if&gt;、&lt;choose&gt;、&lt;when&gt;、&lt;otherwise&gt;、&lt;foreach&gt;等标签实现。 查询场景 /** * 根据条件查询员工
本教程操作系统:windows10系统、DELL G3电脑。 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,配置数据库连接是非常重要的第一步。下面将详细介绍如何配置 MyBatis 的
今天小编给大家分享的是MyBatis批量查询、插入、更新、删除如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。
今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇文章和大家了解一下mybatis集成到spring的方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1 前言1.1 集成spring前使用mybat...
今天小编给大家分享的是mybatis-plus分页查询的3种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇内容主要讲解“mybatis之BaseTypeHandler怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis...
这篇文章主要介绍了mybatisforeach怎么传两个参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mybatisforeach怎...
这篇“MyBatis映射文件中parameterType与resultType怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的...
这篇文章主要介绍“MyBatis怎么获取自动生成的键值”,在日常操作中,相信很多人在MyBatis怎么获取自动生成的键值问题上存在疑惑,小编查阅了各式资料,整理出
这篇文章主要讲解了“怎么去掉IntelliJIDEA中mybatis对应的xml文件警告”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入...
这篇文章主要介绍“MybatisPlus使用@TableId主键id自增长无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这...