学习MyBatis必知必会(6)~MyBatis基础拓展(别名、属性、resultMap、Mapper接口、多参数处理、myBatis插件)

简介: 学习MyBatis必知必会(6)~MyBatis基础拓展(别名、属性、resultMap、Mapper接口、多参数处理、myBatis插件)

一、typeAlias 类型别名【自定义别名、系统自带别名】

1、类型别名:为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写


2、配置自定义别名:

(1)方式一:为具体某个类配置别名

//在全局配置文件中添加别名的配置:
<configuration>   
   <!-- 类型别名 -->
   <typeAliases>
      <typeAlias type="com.shan.hello.User" alias="User"/>
   </typeAliases>
</configuration>    
//在Mapper文件中使用:
<select id="get" parameterType="java.lang.Long" resultType="User">
  select * from t_user where id = #{id}
</select>


★(2)方式二:为具体包配置别名【一般包名就写到domain包即可】,然后包下的类 直接类首字母小写 即可使用:

//在全局配置文件中添加别名的配置:
<configuration>  
  <!-- 类型别名 -->
   <typeAliases>
       <!-- <typeAlias type="com.shan.hello.User" alias="User"/>-->
      <!-- 一般包写到domain包即可,系统自动为该包的类起别名,使用直接是简单类首字母小写 -->
      <package name="com.shan.hello"/>
   </typeAliases>
</configuration> 
//在Mapper文件中使用:
<select id="get" parameterType="java.lang.Long" resultType="user">
  select * from t_user where id = #{id}
</select>
  • myBatis中别名是不区分大小写的


(3)方式三:使用注解的方式,贴标签到domain类上 @Alias("**")


3、系统自带的别名【基本类型+包装类型,还有map类型】---作用:需要返回值时,设置返回类型 resultType

---就是基本类型加个下划线,包装类型的别名就是基本类型啦。例如int的别名是_int, Integer的别名是int

■ 举例: 查询的返回类型是整型,使用别名int:

<!-- 查询总数 -->
<select id="getCounts" resultType="int">
  select count(id) from t_user;
</select>
  /* 测试查询总数 */
  @Test
  public void testGetCounts() throws IOException {
        SqlSession session = MyBatisUtil.getSession();
    //4、进行数据库操作(CRUD)
    int count = session.selectOne("com.shan.hello.UserMapper.getCounts");
    System.out.println(count);
    //5、关闭资源
    session.close();
  }

■ 举例: 查询的返回类型是部分列,使用别名map:

<!-- 查询部分列,每一行记录以map[键值对]形式返回 -->
<select id="getPartCrows" resultType="map">
   select id, name from t_user where id = #{id};
</select>
  /* 测试查询部分列 */
  @Test
  public void testGetPartCrows() throws IOException {
        SqlSession session = MyBatisUtil.getSession();
    //4、进行数据库操作(CRUD)
    Map<String, Object> user = session.selectOne("com.shan.hello.UserMapper.getPartCrows", 2L);
    System.out.println(user);
    //5、关闭资源
    session.close();
  }


二、properties 属性配置 [动态引入]

1、动态替换:属性在外部进行配置,然后进行动态替换:

(1)建立一个外部的.properties 文件 【key=value形式】:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdemo
username=root
password=admin

(2)引入和动态替换,通过properties的resource引入,然后动态替换是使用${}:

<configuration>
    <!-- 属性properties配置 --> <!-- 文件的根目录是.classpath路径 --> 
    <properties resource="db.properties"/>
    <environments default="dev">
      <!-- 1、配置数据库的环境 -->
      <environment id="dev">
        <!-- ① 事务管理器 -->
        <transactionManager type="JDBC"/>
        <!-- ② 连接池【连接数据库4要素】 -->
        <dataSource type="POOLED">
          <property name="driver" value="${driver}"/>
          <property name="url" value="${url}"/>
          <property name="username" value="${username}"/>
          <property name="password" value="${password}"/>
        </dataSource>
      </environment>
  </environments>
 </configuration>


三、resultMap [解决表的列名和对象的属性名不匹配的问题]

✿ 默认情况下,通过设置返回类型resultType 是要求表的列名和对象的属性名要一致,否则会出错。

1、方式一:使用别名:

<select id="getList" parameterType="java.lang.Long" resultType="user">
   select u_id id, u_name name, u_salary salary from t_user;
 </select>


★ 2、方式二:使用resultMap:

  • resultMap 和 resultType不能同时使用
<!-- resultMap 结果集合对象映射:解决表的列名和对象的属性名不匹配的问题
       id:唯一标识
       type:封装结果集的每一行记录的类型
       子元素:result 匹配对象中的哪一个属性对应表的哪一列 【若是主键,建议使用id元素代替result元素提高性能】
   -->
      <resultMap id="BaseResultMap" type="User" >
        <id column="u_id" property="id"/>
        <result column="u_name" property="name"/>
        <result column="u_salary" property="salary"/>
      </resultMap>
<select id="getList" parameterType="java.lang.Long" resultMap="BaseResultMap">
   select u_id, u_name, u_salary from t_user;
</select>


四、Mapper接口和原理 [好比是DAO层]

1、回顾之前执行sql的方式是:使用namespace.id 的方式找到sql元素,并执行sql语句。

■ 该方式存在几个问题:

public void testGet() throws IOException {
    // 创建SqlSession会话对象,好比连接对象Connection
    SqlSession session = MyBatisUtil.getSession();
    // 进行数据库操作(CRUD)
    User user = session.selectOne("com.shan.hello.UserMapper.get", 2L);//第一个参数是字符串无法编译时检查,第二个参数是Object类型也无法编译时检查
    System.out.println(user);
    // 关闭资源
    session.close();
  }

(1)第一个参数:因为传入的是String类型的参数,可能会写错,写错检查也是等到运行时才发现

(2)第二个参数:Object类型,不需要被检查,万物皆对象

(3)每个操作【增删改查】的代码模板是相同的,可以抽取


--------解决:使用Mapper 接口,类似DAO接口,在Mapper接口中去定义每一个操作方法。

★ DAO诞生的背景:以前我们是把数据库的操作代码编写到客户端里:
跟业务代码混杂在一起;②而且每次操作数据库时都需要重复书写代码


2、Mapper组件:Mapper接口+Mapper文件

(1)Mapper 文件和Mapper 接口应该放到同一包下

(2)Mapper文件中的namespace 对应 Mapper接口的全限定名称

(3)Mapper文件中的操作元素的**id **对应 Mapper接口的方法名称

/* Mapper 接口*/
public interface UserMapper {
  void save(User user);
  void delete(Long id);
  void update(User user);
  void get(Long id);
  List<User> getListAll();
}
<!-- Mapper文件 -->
<!-- Mapper文件的namespace对应Mapper 接口的全限定名 -->
  <mapper namespace="com.shan.hello.mapper.UserMapper">
      <!-- 保存操作 -->  <!-- Mapper 文件的操作元素的id对应Mapper接口的方法名 -->
    <insert id="save">
      insert into t_user (name, salary) values (#{name}, #{salary});
    </insert>   
    <!-- 删除操作 -->
    <delete id="delete">
      delete from t_user where id = #{id};
    </delete>
    <!-- 更改操作 -->
    <update id="update">
      update t_user set name = #{name}, salary = #{salary} where id = #{aid}; 
    </update>
      <!-- 查询操作 -->
    <select id="get" parameterType="java.lang.Long" resultType="user">
      select * from t_user where id = #{id}
    </select>
    <select id="getListAll" parameterType="java.lang.Long" resultType="user">
      select * from t_user;
    </select>
</mapper>
/* 测试,调用Mapper接口操作数据库 */
@Test
public void testGetList() throws IOException{
  SqlSession session = MyBatisUtil.getSession();
  UserMapper userMapper = session.getMapper(UserMapper.class);
  List<User> users = userMapper.getListAll();
  System.out.println(users);  
}


五、参数处理【使用注解@Param实现处理多个参数】

---myBatis默认情况下只能处理一个参数,解决查询多个参数的方法:

1、方法一:封装成一个对象 【可以,但是麻烦,需要定义很多的javaBean对象】

2、方法二:封装成Map对象 (Map的key好比时javaBean对象的属性名,Map的value好比时javaBean的属性值)【也有点麻烦,因为每次都需要创建一个Map对象】

/* ClientMapper 接口 */
public interface ClientMapper {
  //将多个参数封装成一个Map对象
  Client login2(Map<String,Object> map);
}
<!-- Mapper文件 -->
<mapper namespace="com.shan.params.mapper.ClientMapper">
   <select id="login2" resultType="Client">
    select id, username, password from client where username = #{username} and password = #{password} ;
    </select>
</mapper>
/* 测试 */       
@Test
public void testLogin2() throws IOException {
  Map<String,Object> paramMap = new HashMap<String, Object>() {
    {
        //设置map的元素的键值对的值
        this.put("username", "shan");
        this.put("password", "1");
    }
  };
  SqlSession session = MyBatisUtil.getSession();
  ClientMapper clientMapper = session.getMapper(ClientMapper.class);  
  Client client = clientMapper.login2(paramMap);
  System.out.println(client);
  session.close();
}


★ 3、方法三:使用Param注解,底层原理就是方式二,myBatis帮我们使用map来封装。

/* ClientMapper 接口 */
public interface ClientMapper {
  //使用params注解封装多个参数
  Client login3(@Param("username")String username, @Param("password")String password);
}
<!-- Mapper文件 -->
<mapper namespace="com.shan.params.mapper.ClientMapper">
   <select id="login3" resultType="Client">
    select id, username, password from client where username = #{username} and password = #{password} ;
    </select>
</mapper>
/* 测试 */       
@Test
public void testLogin2() throws IOException {
  SqlSession session = MyBatisUtil.getSession();
  ClientMapper clientMapper = session.getMapper(ClientMapper.class);  
  Client client = clientMapper.login3("shan", "1");
  System.out.println(client);
  session.close();
}


六、myBatis插件 [eclipse的插件MyBatipse]

  • 作用:编写映射文件时有代码提示

1、eclipse 安装 插件MyBatispse

■ 方式一(在线安装):看插件官网提供的方式【有的插件会提供拖动安装,重启eclipse即可】

● 通用:Help -> Eclipse Marketplace -> 搜 MyBatipse,然后进行安装即可


12.png


■ 验证是否安装成功,在eclipse的window->Preferences-> 搜 MyBatipse,有看到即成功


目录
相关文章
|
5月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
956 1
Spring boot 使用mybatis generator 自动生成代码插件
|
6月前
|
SQL Java 数据安全/隐私保护
发现问题:Mybatis-plus的分页总数为0,分页功能失效,以及多租户插件的使用。
总的来说,使用 Mybatis-plus 确实可以极大地方便我们的开发,但也需要我们理解其工作原理,掌握如何合适地使用各种插件。分页插件和多租户插件是其中典型,它们的运用可以让我们的代码更为简洁、高效,理解和掌握好它们的用法对我们的开发过程有着极其重要的意义。
666 15
|
8月前
|
SQL XML Java
七、MyBatis自定义映射resultMap
七、MyBatis自定义映射resultMap
229 6
|
9月前
|
XML SQL Java
十二、MyBatis分页插件
十二、MyBatis分页插件
259 17
|
10月前
|
缓存 NoSQL Java
Mybatis学习:Mybatis缓存配置
MyBatis缓存配置包括一级缓存(事务级)、二级缓存(应用级)和三级缓存(如Redis,跨JVM)。一级缓存自动启用,二级缓存需在`mybatis-config.xml`中开启并配置映射文件或注解。集成Redis缓存时,需添加依赖、配置Redis参数并在映射文件中指定缓存类型。适用于查询为主的场景,减少增删改操作,适合单表操作且表间关联较少的业务。
197 6
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
1830 5
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
669 0
|
10月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
445 2
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
587 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
497 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块