在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>
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-mybatis.xmlparam-value>
context-param>
<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>
xxxMapper.java
)xxxMapper.xml
)功能 | 标签名称 |
---|---|
定义Sql语句 | insert |
delete | |
update | |
select | |
配置java对象属性与查询结果集中列名对应关系 | resultMap |
控制动态sql拼接 | foreach |
if | |
choose | |
格式化输出 | where |
set | |
trim | |
配置关联关系 | collection |
association | |
定义常量 | sql |
引用常量 | include |
Mapper
接口继承 通用 Mapper< T >
,可以自动完成基本的增删改查操作
public interface RoleMapper extends Mapper<Role> {
}
MyBatis
可以用 一些内置的标签来动态的组织 SQL
语句,常用的标签有:
if
:当 test
语句通过时,if
内包含的 SQL
会起作用<if test="userId != null">
user_id = #{userId,jdbcType=INTEGER}
if>
where
:以 where
开头,将一组标签的返回值拼接起来,自动去除首尾多余的AND
、OR
,专门用于生成动态 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
:功能强大的标签,包含 where
和 set
的功能,将一组标签的结果拼接起来,支持指定移除首部或尾部指定的内容,支持自动在首部或者尾部添加指定的内容<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>
where
的 trim
写法<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>
set
的 trim
写法<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>
DTO
类不需要提供任何实现,所以属于供应方的服务接口层。创建在项目模块 的 xxx..dto
包下。DTO
类即为一个实体类,对应数据库中的一个具体表。UserRole
对应表为 sys_user_role
。@Table(name = "table_name")
指定 DTO
对应数据库中表的名称。DTO
对应数据库中的一个具体表,一般都需要继承 BaseDTO
类。private
属性。getter
和 setter
方法。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
hap
数据多语言可以通过在 DTO
上添加注解来自动完成。
DTO
类上添加@MultiLanguage
,此注解说明该 DTO
需要支持数据多语言DTO
字段上添加 @MultiLanguageField
,此注解说明该字段是一个多语言字段,当有多个多语言字段时,这些字段都需要添加DTO
执行标准 insert
操作时,框架会自动插入多条数据到对应的 TL
表delete
操作时,会自动删除对应的多语言数据query
时,会自动关联 TL
表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{
}
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.UserMapper
,MyBatis
内部就是通过这个值将接口和XML
关联起来的。
当只使用XML
而不使用接口的时候,namespace
的值可以设置为任意不重复的名称。
标签的id
属性值在任何时候都不能出现英文句号.
,并且同一个命名空间下不能出现重复的id
。
因为接口方法是可以重载的,所以接口中可以出现多个同名但参数不同的方法,但是XML
中id
的值不能重复,因而接口中的所有同名方法会对应着XML
中的同一个id
的方法。最常见的用法就是,同名方法中其中一个方法增加一个RowBound
类型的参数用于实现分页查询。
操作 | 方法 |
---|---|
插入 | |
插入一条 | 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); |
Service
接口类定义了业务操作的一系列接口,并不提供实现,具体实现需要通过服务实现层提供,所以属于供应方的服务接口层。创建在项目模块 的 xxx..service
包下。interface
)统一以大写字母 I
做为命名前缀。Service
对应一个 DTO
类,所以命名为I + DTO 类名 + Service
。如:IUserRoleService
对应表为 UserRole
类。Service
里的每一个方法需要加上IRequest
对象作为参数。Service
接口,如无特殊例外,需要继承 ProxySelf< T >
接口,T
为 Service
本身。Service
接口的具体实现通过服务实现层提供,所以属于供应方的服务实现层。创建在项目模块的 xxx..service.impl
包下。Service
实现类对应一个 Service
接口类,所以命名为 Service 接口类名(去掉I前缀) + Impl
。如:UserRoleServiceImpl
对应 IUserRoleService
类。@Service
标注,以自动扫描注册。BaseServiceImpl< T >
来获得标准的 CRUD
操作支持,需要 Service
接口类继承 IBaseService< T >
。ServiceImpl
中对于 Mapper
的 CRUD
操作参照“基础 CRUD
操作”。Controller
负责对 Model
和 View
的处理,创建在项目模块的 xxx..controllers
包下。Controller
是对一个具体的 DTO
资源进行处理的,所以命名为 DTO 类名 + Controller
。如: UserRoleController
对应 UserRole
类。@Controller
指定该类为一个 Controller
类。Controller
中通过 @Autowired
注入 Service
。Controller
的每一个方法只在最后调用一次该 Controller
所注入的 Service
,因此当有调用多个Service
的需求应该放在注入的 Service
中。