MyBatis(三、注解开发)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解 ,@Result注解,@One注解,@Many注解组合完成复杂关系的配置。​ 修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可。这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper 映射文件了。.........

1、MyBatis的常用注解

       这几年来注解开发越来越流行,Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper 映射文件了。

  • @Insert:实现新增
  • @Update:实现更新
  • @Delete:实现删除
  • @Select:实现查询
  • @Result:实现结果集封装
  • @Results:可以与@Result 一起使用,封装多个结果集
  • @One:实现一对一结果集封装
  • @Many:实现一对多结果集封装

2、MyBatis注解方式的增删改查

修改MyBatis的核心配置文件,我们使用了注解替代的映射文件,所以我们只需要加载使用了注解的Mapper接口即可。

  <!--加载映射关系-->

   <mappers>

       <!--指定接口所在的包-->

       <package name="com.xmp.mapper"></package>

   </mappers>


@Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
publicvoidsave(Useruser);

@Update("update user set username=#{username},password=#{password} where id=#{id}")
publicvoidupdate(Useruser);

@Delete("delete from user where id=#{id}")
publicvoiddelete(intid);

@Select("select * from user where id=#{id}")
publicUserfindById(intid);
@Select("select * from user")
publicList<User>findAll();

3、MyBatis的注解实现复杂映射

实现复杂关系映射之前我们可以在映射文件中通过配置来实现,使用注解开发后,我们可以使用@Results注解 ,@Result注解,@One注解,@Many注解组合完成复杂关系的配置。

注解 说明
@Results 代替的是标签该注解中可以使用单个@Result注解,也可以使用@Result集 合。使用格式:@Results({@Result(),@Result()})或@Results(@Result())
@Resut 代替了标签和标签 @Result中属性介绍: column:数据库的列名 property:需要装配的属性名 one:需要使用的@One 注解(@Result(one=@One)())) many:需要使用的@Many 注解(@Result(many=@many)()))
@One (一对一) 代替了 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。 @One注解属性介绍: select: 指定用来多表查询的 sqlmapper 使用格式:@Result(column=" ",property="",one=@One(select=""))
@Many (多对一) 代替了标签, 是是多表查询的关键,在注解中用来指定子查询返回对象集合。 使用格式:@Result(property="",column="",many=@Many(select=""))

4、Mybatis注解开发步骤

1.导入maven依赖:

<dependencies>

   <!-- https://mvnrepository.com/artifact/org.objectweb.asm/org.objectweb.asm -->

   <dependency>

       <groupId>org.objectweb.asm</groupId>

       <artifactId>org.objectweb.asm</artifactId>

       <version>3.3.1.v201105211655</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/cglib/cglib -->

   <dependency>

       <groupId>cglib</groupId>

       <artifactId>cglib</artifactId>

       <version>3.2.8</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->

   <dependency>

       <groupId>commons-logging</groupId>

       <artifactId>commons-logging</artifactId>

       <version>1.2</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache-core -->

   <dependency>

       <groupId>net.sf.ehcache</groupId>

       <artifactId>ehcache-core</artifactId>

       <version>2.6.11</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->

   <dependency>

       <groupId>org.javassist</groupId>

       <artifactId>javassist</artifactId>

       <version>3.23.1-GA</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/junit/junit -->

   <dependency>

       <groupId>junit</groupId>

       <artifactId>junit</artifactId>

       <version>4.12</version>

       <scope>test</scope>

   </dependency>

   <!-- https://mvnrepository.com/artifact/log4j/log4j -->

   <dependency>

       <groupId>log4j</groupId>

       <artifactId>log4j</artifactId>

       <version>1.2.17</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->

   <dependency>

       <groupId>org.apache.logging.log4j</groupId>

       <artifactId>log4j-api</artifactId>

       <version>2.11.1</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->

   <dependency>

       <groupId>org.apache.logging.log4j</groupId>

       <artifactId>log4j-core</artifactId>

       <version>2.11.1</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->

   <dependency>

       <groupId>org.mybatis</groupId>

       <artifactId>mybatis</artifactId>

       <version>3.4.6</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->

   <dependency>

       <groupId>org.mybatis.caches</groupId>

       <artifactId>mybatis-ehcache</artifactId>

       <version>1.1.0</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

   <dependency>

       <groupId>mysql</groupId>

       <artifactId>mysql-connector-java</artifactId>

       <version>8.0.12</version>

   </dependency>

   <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->

   <dependency>

       <groupId>org.slf4j</groupId>

       <artifactId>slf4j-log4j12</artifactId>

       <version>1.8.0-beta2</version>

       <scope>test</scope>

   </dependency>

   <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->

   <dependency>

       <groupId>org.slf4j</groupId>

       <artifactId>slf4j-api</artifactId>

       <version>1.8.0-beta2</version>

   </dependency>

</dependencies>

2.数据库信息:

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisjdbc.username=rootjdbc.passwords=root

3.编写日志配置文件:

##将等级为INFO的日志信息输出到stdout和R这两个目的

log4j.rootCategory=INFO, stdout , R  

#日志输出到控制台--   log4j.appender.stdout=org.apache.log4j.ConsoleAppender  

#日志布局样式-自定义样式

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  

#日志样式

log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n  

##日志到每天一个日志文件    

log4j.appender.R=org.apache.log4j.DailyRollingFileAppender

##日志输出地址

log4j.appender.R.File=D:\\my.log  

#日志布局样式-自定义样式  

log4j.appender.R.layout=org.apache.log4j.PatternLayout  

#日志样式

1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n  

 

##下面是指定具体的包下面的所有日志的级别

log4j.logger.com.neusoft=DEBUG  

log4j.logger.com.opensymphony.oscache=ERROR  

log4j.logger.net.sf.navigator=ERROR  

log4j.logger.org.apache.commons=ERROR  

log4j.logger.org.apache.struts=WARN  

log4j.logger.org.displaytag=ERROR  

log4j.logger.org.springframework=DEBUG  

log4j.logger.com.ibatis.db=WARN  

log4j.logger.org.apache.velocity=FATAL  

4.编写配置文件:

SqlMapConfig.xml:

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><propertiesresource="db.properties"></properties><settings><settingname="lazyLoadingEnabled"value="true"/><settingname="aggressiveLazyLoading"value="false"/><settingname="cacheEnabled"value="true"></setting></settings><typeAliases><!--别名--><!--<typeAliastype="com.xmp.entity.User"alias="user"></typeAlias>--><packagename="com.xmp..pojo"></package></typeAliases><environmentsdefault="development"><environmentid="development"><transactionManagertype="JDBC"></transactionManager><dataSourcetype="POOLED"><propertyname="driver"value="${jdbc.driver}"></property><propertyname="url"value="${jdbc.url}"></property><propertyname="username"value="${jdbc.username}"></property><propertyname="password"value="${jdbc.password}"></property></dataSource></environment></environments><mappers><!--<mapperresource="sqlmap/User.xml"></mapper>--><!--<mapperresource="mapper/UserMapper.xml"></mapper>--><!--Mapper接口和映射文件必须在同一文件夹下遵循规范<mapperclass="com.xmp..mapper.UserMapper"></mapper>--><!--Mapper接口的包名,自动扫描。遵循规范<packagename=""></package>--><packagename="com.xmp.mapper"></package><packagename="com.xmp.pojo"></package></mappers></configuration>

5.编写pojo类和Mapper接口:

@MapperpublicinterfaceUserMapper {
@Select("select * from user where id=#{id}")
publicUsergetUserById(Integerid);
@Delete("delete from user where id=#{id}")
publicvoiddeleteUserById(Integerid);
@Insert("insert user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address})")
publicvoidaddUser(Useruser);
@Update("update user set id=#{id},username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}")
publicvoidupdateUser(Useruser);
}

public class User {

   private int id;

   private String username;

   private Date birthday;

   private Integer sex;

   private String address;


   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 Date getBirthday(Date date) {

       return birthday;

   }


   public void setBirthday(Date birthday) {

       this.birthday = birthday;

   }


   public Integer getSex() {

       return sex;

   }


   public void setSex(Integer sex) {

       this.sex = sex;

   }


   public String getAddress() {

       return address;

   }


   public void setAddress(String address) {

       this.address = address;

   }


   @Override

   public String toString() {

       return "User{" +

               "id=" + id +

               ", username='" + username + '\'' +

               ", birthday=" + birthday +

               ", sex=" + sex +

               ", address='" + address + '\'' +

               '}';

   }

}

6.编写测试类:

public class UserMapperTest {

   SqlSessionFactory sqlSessionFactory;

   @Before

   public void setUp() throws Exception {

       InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");

       //初始化mybatis,创建SqlSessionFactory类的实例

       sqlSessionFactory =  new SqlSessionFactoryBuilder().build(resourceAsStream);

   }


 

@TestpublicvoidgetUserById() {
SqlSessionsqlSession=sqlSessionFactory.openSession();
UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);
UseruserById=userMapper.getUserById(10);
System.out.println("Message="+userById);
    }



 

@TestpublicvoiddeleteUserById() {
SqlSessionsqlSession=sqlSessionFactory.openSession();
UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);
userMapper.deleteUserById(26);
    }


 

@TestpublicvoidaddUser() {
SqlSessionsqlSession=sqlSessionFactory.openSession();
UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);
Useruser=newUser();
user.setId(30);
user.setUsername("xmp");
user.setBirthday(newDate());
user.setAddress("SH");
userMapper.addUser(user);
sqlSession.commit();
    }


 

@TestpublicvoidupdateUser() {
SqlSessionsqlSession=sqlSessionFactory.openSession();
UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);
UseruserById=userMapper.getUserById(1);
userById.setBirthday(newDate());
userById.setAddress("广西柳州");
userMapper.updateUser(userById);
sqlSession.commit();
    }

}


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
28 13
|
1月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
1月前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
83 5
|
1月前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
55 3
|
1月前
|
SQL 存储 数据库
深入理解@TableField注解的使用-MybatisPlus教程
`@TableField`注解在MyBatis-Plus中是一个非常灵活和强大的工具,能够帮助开发者精细控制实体类与数据库表字段之间的映射关系。通过合理使用 `@TableField`注解,可以实现字段名称映射、自动填充、条件查询以及自定义类型处理等高级功能。这些功能在实际开发中,可以显著提高代码的可读性和维护性。如果需要进一步优化和管理你的MyBatis-Plus应用程
190 3
|
1月前
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
121 1
|
3月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
2月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
81 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
3月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
4月前
|
SQL Java 数据库
5、Mybatis-Plus 常用注解
这篇文章详细介绍了Mybatis-Plus中常用的注解,包括解决实体类与数据库表名不一致、字段不匹配的问题,主键生成策略的配置,以及逻辑删除的实现方法。
5、Mybatis-Plus 常用注解