博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis学习笔记8——使用总结
阅读量:3941 次
发布时间:2019-05-24

本文共 5501 字,大约阅读时间需要 18 分钟。

依赖加入

pom.xml中加入mybatis的相关依赖:

org.mybatis
mybatis
3.3.1
org.mybatis
mybatis-spring
1.2.4

加入配置文件

在web.xml中加入核心配置文件

contextConfigLocation
classpath:spring-mybatis.xml

在resource中加入mybatis配置文件,如:

搭建mybatis环境

  1. 创建实体类
  2. 创建数据访问接口(xxxMapper.java
  3. 加入SQL映射语句文件(xxxMapper.xml)

常见标签

功能 标签名称
定义Sql语句
配置java对象属性与查询结果集中列名对应关系
控制动态sql拼接
格式化输出
配置关联关系
定义常量
引用常量

注意事项

自动化 CRUD

Mapper 接口继承 通用 Mapper< T >,可以自动完成基本的增删改查操作

public interface RoleMapper extends Mapper
{
}

动态 SQL

MyBatis 可以用 一些内置的标签来动态的组织 SQL 语句,常用的标签有:

  • if:当 test 语句通过时,if 内包含的 SQL 会起作用
user_id = #{userId,jdbcType=INTEGER}
  • where:以 where 开头,将一组标签的返回值拼接起来,自动去除首尾多余的ANDOR,专门用于生成动态 WHERE 条件
code_id = #{codeId,jdbcType=INTEGER}
AND code = #{code,jdbcType=VARCHAR}
  • set:以 set 开头,将一组标签的返回值拼接起来,自动去除首尾多余的逗号 ,专门用于生成动态的 set 语句
user_name = #{userName,jdbcType=VARCHAR},
user_age = #{userAge,jdbcType=INTEGER},
  • trim:功能强大的标签,包含 whereset 的功能,将一组标签的结果拼接起来,支持指定移除首部或尾部指定的内容,支持自动在首部或者尾部添加指定的内容
AND b.id =#{id}
AND b.menu_name like #{name}
  • wheretrim 写法
code_id = #{codeId,jdbcType=INTEGER}
AND code = #{code,jdbcType=VARCHAR}
  • settrim 写法
user_name = #{userName,jdbcType=VARCHAR},
user_age = #{userAge,jdbcType=INTEGER},
  • foreach:用于遍历访问集合内的元素
#{item}

开发流程

后端开发

1. 业务需求整理

2. 设计表结构

3. 编写 liquibase 脚本

4. 编写 DTO

4.1 创建 DTO 类

  • DTO不需要提供任何实现,所以属于供应方的服务接口层。创建在项目模块 的 xxx.<module>.dto 包下。
  • 每一个 DTO 类即为一个实体类,对应数据库中的一个具体表
  • 名称与表名称相同,表名中 _ 替换为驼峰命名法,首字母大写,且忽略前缀。如:UserRole 对应表为 sys_user_role

4.2 指定对应表

  • @Table(name = "table_name") 指定 DTO 对应数据库中表的名称。
  • 每一个 DTO 对应数据库中的一个具体表,一般都需要继承 BaseDTO 类。

4.3 属性规范

  • 所有属性均为private属性。
  • 每一个属性需要生成对应的 gettersetter 方法。
  • 字段名称应根据驼峰命名规则从数据库列名转换过来
    - 例如:数据库列名为 USER_NAME,则字段名为 userName
    - 特殊字段名称,可以在字段在添加@Column(name = "xxx") 注解,指定数据库列名
  • 非数据库字段,需要用@Transient 标注
    - javax.persistence.Transient
  • 属性的的类型与字段的 type 对应
    - 不使用基本类型,全部使用基本类型的包装类,如 Long 对应数据库中的 INTEGER,而不是使用 long
    - 数字类型主键统一采用 Long
    - 金额、数量 等精度严格浮点类型采用 BigDecimal(注意 BigDecimal 在计算、比较方面的特殊性)
  • 所有的主键字段都需要用@Id标注
    - 对于自增长、序列(SEQUENCE)类型的主键,需要添加注解@GeneratedValue
    - 序列命名规范:表名_S,例如:表 SYS_USER 对应的序列为 SYS_USER_S

4.4 数据多语言支持

hap 数据多语言可以通过在 DTO 上添加注解来自动完成。

  • DTO 类上添加@MultiLanguage,此注解说明该 DTO 需要支持数据多语言
  • DTO 字段上添加 @MultiLanguageField,此注解说明该字段是一个多语言字段,当有多个多语言字段时,这些字段都需要添加
  • 当使用 DTO 执行标准 insert 操作时,框架会自动插入多条数据到对应的 TL
  • 当执行 delete 操作时,会自动删除对应的多语言数据
  • 当执行标准 query 时,会自动关联 TL

5. 编写 Mapper

5.1 创建 Mapper 接口类

  • Mapper 接口类即为传统意义上的 DAO,但与 interface 不同,Mapper 本身就是对数据访问的具体实现,所以属于供应方的服务实现层。创建在项目模块 的 xxx.<module>.mapper 包下。
  • 每一个 Mapper 接口类封装了对数据库表的操作,每一个 Mapper 对应一个 DTO 类,所以命名为 DTO 类名 + Mapper。如:UserRoleMapper 对应表为 UserRole 类。
  • 基础的 CRUD 操作不需要再次实现,通过继承 Mapper<T> 类实现。其中 T 为对应 DTO 的泛型。
  • 复杂的数据库操作需要定义具体的接口方法。
package tk.mybatis.simple.mapper;public interface UserMapper{
}

5.2 创建 Mapper.xml

  • Mapper.xml 是数据库的的具体映射,与 Mapper 接口同级,创建在项目模块 resources 目录的 xxx.<module>.mapper 包下。
  • Mapper.xml,与 Mapper 接口对应。所以命名与 Mapper 接口类相同。
  • 对于基本的 CRUD 不需要进行配置,所以也就不需要创建对应的 Mapper.xml 文件。
  • 对于自定义的数据库方法,需要创建对应的 Mapper.xml 文件。
  • Mapper.xml 中的操作 id 对应 Mapper 接口类的方法名。

需要注意的是<mapper>根标签的namespace属性。当Mapper接口和XML文件关联的时候,命名空间namespace的值就需要配置成接口的全限定名称,例如UserMapper接口对应的tk.mybatis.simple.mapper.UserMapperMyBatis内部就是通过这个值将接口和XML关联起来的。

当只使用XML而不使用接口的时候,namespace的值可以设置为任意不重复的名称。

标签的id属性值在任何时候都不能出现英文句号.,并且同一个命名空间下不能出现重复的id

因为接口方法是可以重载的,所以接口中可以出现多个同名但参数不同的方法,但是XMLid的值不能重复,因而接口中的所有同名方法会对应着XML中的同一个id的方法。最常见的用法就是,同名方法中其中一个方法增加一个RowBound类型的参数用于实现分页查询。

5.3 基础 CRUD 操作

操作 方法
插入
插入一条 int insertSelective( T entity );
删除
根据 ID 删除一条 int deleteByPrimaryKey( Object id );
修改
根据 ID 修改 int updateByPrimaryKeySelective( T entity );
查询
根据 ID 查询 T selectByPrimaryKey( Object id );
根据条件查询一条记录 T selectOne( T entity );
根据条件,查询全部记录 List select(T example);

6. 编写Service

6.1 创建 Service 接口类

  • Service 接口类定义了业务操作的一系列接口,并不提供实现,具体实现需要通过服务实现层提供,所以属于供应方的服务接口层。创建在项目模块 的 xxx.<module>.service 包下。
  • 接口(interface)统一以大写字母 I 做为命名前缀。
  • 每一个 Service 对应一个 DTO 类,所以命名为I + DTO 类名 + Service。如:IUserRoleService 对应表为 UserRole 类。
  • Service 里的每一个方法需要加上IRequest对象作为参数。
  • Service 接口,如无特殊例外,需要继承 ProxySelf< T > 接口,TService 本身。

6.2 创建 Service 实现类

  • Service 接口的具体实现通过服务实现层提供,所以属于供应方的服务实现层。创建在项目模块的 xxx.<module>.service.impl 包下。
  • 每一个 Service 实现类对应一个 Service 接口类,所以命名为 Service 接口类名(去掉I前缀) + Impl。如:UserRoleServiceImpl 对应 IUserRoleService 类。
  • 实现类,如无特殊情况,需要用@Service标注,以自动扫描注册。
  • 实现类可以通过继承BaseServiceImpl< T > 来获得标准的 CRUD 操作支持,需要 Service 接口类继承 IBaseService< T >
  • ServiceImpl 中对于 MapperCRUD 操作参照“基础 CRUD 操作”。

7. 编写Controller

7.1 创建 Controller 类

  • Controller 负责对 ModelView 的处理,创建在项目模块的 xxx.<module>.controllers 包下。
  • 每一个 Controller 是对一个具体的 DTO 资源进行处理的,所以命名为 DTO 类名 + Controller。如: UserRoleController 对应 UserRole 类。
  • 需要通过 @Controller 指定该类为一个 Controller 类。
  • 需要在每一个 Controller 中通过 @Autowired 注入 Service
  • Controller 的每一个方法只在最后调用一次该 Controller 所注入的 Service ,因此当有调用多个Service的需求应该放在注入的 Service 中。

前端开发

界面设计

转载地址:http://zgiwi.baihongyu.com/

你可能感兴趣的文章
Python字符串类型转换函数
查看>>
Python有用的命令
查看>>
Python条件语句
查看>>
Python eval()函数
查看>>
Linux rz和sz命令详解
查看>>
Python 集合set
查看>>
Codeforces Round #400 (Div. 1 + Div. 2, combined)D - The Door Problem(2-sat)
查看>>
IDEA中Struts2文件上传时404错误The origin server did not find a current representation for the target resour
查看>>
Perl/Tk 变量追踪及类线程实现
查看>>
1.嵌入式开发环境搭建--虚拟机安装(unbutu)系统
查看>>
2.嵌入式开发环境搭建--(unbutu)系统
查看>>
Linux USB驱动分析之USB2.0协议分析
查看>>
关于iwpriv :no private ioctls 的问题
查看>>
SQL Server Union等操作时解决不同数据库字符集冲突的问题
查看>>
Linq GroupJoin(二)
查看>>
递归:访问页面的控件或文件夹的下文件
查看>>
DataGridView分頁控件
查看>>
Linq 使用entity framework查询视图返回重复记录的问题(转)
查看>>
项目中得到执行文件版本或其它信息
查看>>
WinForm DatagridView绑定大量数据卡顿的问题
查看>>