MyBatis学习笔记8——使用总结

依赖加入

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

<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatisartifactId>
    <version>3.3.1version>
dependency>
<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatis-springartifactId>
    <version>1.2.4version>
dependency>

加入配置文件

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

<context-param>
    <param-name>contextConfigLocationparam-name>
    <param-value>classpath:spring-mybatis.xmlparam-value>
context-param>

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


<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-3.1.xsd  
                        http://www.springframework.org/schema/mvc  
                        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    
    <context:component-scan base-package="com.hand" />
    
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties" />
    bean>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        
        <property name="initialSize" value="${jdbc.initialSize}">property>
        
        <property name="maxActive" value="${jdbc.maxActive}">property>
        
        <property name="maxIdle" value="${jdbc.maxIdle}">property>
        
        <property name="minIdle" value="${jdbc.minIdle}">property>
        
        <property name="maxWait" value="${jdbc.maxWait}">property>
    bean>

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        
        <property name="mapperLocations" value="classpath:com/hand/mapping/*.xml">property>
    bean>

    
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.hand.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">property>
    bean>

    
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    bean>

beans>

搭建mybatis环境

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

常见标签

功能 标签名称
定义Sql语句 insert
delete
update
select
配置java对象属性与查询结果集中列名对应关系 resultMap
控制动态sql拼接 foreach
if
choose
格式化输出 where
set
trim
配置关联关系 collection
association
定义常量 sql
引用常量 include

注意事项

自动化 CRUD

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

public interface RoleMapper extends Mapper<Role> {
}

动态 SQL

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

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

开发流程

后端开发

1. 业务需求整理

2. 设计表结构

3. 编写 liquibase 脚本

4. 编写 DTO

4.1 创建 DTO 类

  • DTO不需要提供任何实现,所以属于供应方的服务接口层。创建在项目模块 的 xxx..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..mapper 包下。
  • 每一个 Mapper 接口类封装了对数据库表的操作,每一个 Mapper 对应一个 DTO 类,所以命名为 DTO 类名 + Mapper。如:UserRoleMapper 对应表为 UserRole 类。
  • 基础的 CRUD 操作不需要再次实现,通过继承 Mapper 类实现。其中 T 为对应 DTO 的泛型。
  • 复杂的数据库操作需要定义具体的接口方法。
package tk.mybatis.simple.mapper;

public interface UserMapper{

}

5.2 创建 Mapper.xml

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


<mapper namespace="tk.mybatis.simple.mapper.UserMapper">

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..service 包下。
  • 接口(interface)统一以大写字母 I 做为命名前缀。
  • 每一个 Service 对应一个 DTO 类,所以命名为I + DTO 类名 + Service。如:IUserRoleService 对应表为 UserRole 类。
  • Service 里的每一个方法需要加上IRequest对象作为参数。
  • Service 接口,如无特殊例外,需要继承 ProxySelf< T > 接口,TService 本身。

6.2 创建 Service 实现类

  • Service 接口的具体实现通过服务实现层提供,所以属于供应方的服务实现层。创建在项目模块的 xxx..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..controllers 包下。
  • 每一个 Controller 是对一个具体的 DTO 资源进行处理的,所以命名为 DTO 类名 + Controller。如: UserRoleController 对应 UserRole 类。
  • 需要通过 @Controller 指定该类为一个 Controller 类。
  • 需要在每一个 Controller 中通过 @Autowired 注入 Service
  • Controller 的每一个方法只在最后调用一次该 Controller 所注入的 Service ,因此当有调用多个Service的需求应该放在注入的 Service 中。

前端开发

界面设计

你可能感兴趣的:(MyBatis)