前言
作者: Ant QQ:517377100
相對於使用JdbcTemplate,Mybatis可自動建立pojo類型與數據庫列的映射關系,數據庫訪問層的開發簡單了許多
所有數據庫訪問操作,均封裝在各個Mapper接口中,接口的實現即為數據庫sql操作,sql可以注解的形式提供,也可以定義在xml文件中(復雜的sql操作優選xml)
引入Mybatis框架步驟簡單,這里做一些整理
本人集成開發環境使用 Intellij
添加Mybatis依賴項
pom.xml增加如下依賴項
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
Bean聲明
相關Bean的聲明統一在DatabaseConfiguration類型中
其中包含了UserMapper、CommodityMapper、CommodityCategoryMapper三個Bean的聲明
代碼如下
@Configuration
public class DatabaseConfiguration {
@Bean
public DataSource dataSource() {
...
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
sqlSessionFactoryBean.setTypeAliases(new Class[]{User.class, Commodity.class, CommodityCategory.class});
sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sqlSessionFactoryBean.getObject();
}
private <T> MapperFactoryBean getMapper(Class<T> mapperInterface) {
MapperFactoryBean<T> mapperFactoryBean = new MapperFactoryBean<T>();
try {
mapperFactoryBean.setSqlSessionFactory(sqlSessionFactory());
mapperFactoryBean.setMapperInterface(mapperInterface);
} catch (Exception ex) {
logger.error("error when create mapper: ", ex);
throw new RuntimeException(ex);
}
return mapperFactoryBean;
}
@Bean
public MapperFactoryBean userMapper() {
return getMapper(UserMapper.class);
}
@Bean
public MapperFactoryBean commodityCategoryMapper() {
return getMapper(CommodityCategoryMapper.class);
}
@Bean
public MapperFactoryBean commodityMapper() {
return getMapper(CommodityMapper.class);
}
}
創建SqlSessionFactory的同時,將其配置項MapUnderscoreToCamelCase設置為true,如數據庫列 user_name將自動映射到pojo中的userName屬性
通過setTypeAliases,指定使用的Pojo類型,后續Mapper.xml中就不需要指定Pojo類型的完整限定名(即無需指定namespace)
Mapper interface
package com.antsoft.docoding.mapper;
import java.util.List;
import com.antsoft.docoding.model.User;
public interface UserMapper {
List<User> getUsers();
User getUser(long id);
void addUser(User user);
void clear();
void updateUser(User user);
}
Mapper xml
Mapper.xml所在目錄需要與對應的Mapper接口位於統一個包中
上述UserMapper接口,對應的UserMapper.xml 位於目錄resources/com/antsoft/docoding/mapper/中,內容如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.antsoft.docoding.mapper.UserMapper">
<resultMap id="user" type="user">
<result column="user_type" property="userType" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
</resultMap>
<delete id="clear">
DELETE FROM dc_user
</delete>
<select id="getUsers" resultMap="user">
SELECT id, user_name, user_type FROM dc_user
</select>
<select id="getUser" resultMap="user">
SELECT id, user_name, user_type FROM dc_user WHERE id = #{id}
</select>
<insert id="addUser" useGeneratedKeys="true" keyProperty="id" parameterType="user">
INSERT INTO dc_user(user_name, user_type)
VALUES(#{userName}, #{userType, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler})
</insert>
<update id="updateUser" parameterType="user">
UPDATE dc_user SET user_name = #{userNmae},
user_type = #{userType, typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}
WHERE id = #{id}
</update>
</mapper>
關於EnumOrdinalTypeHandler,可以完成枚舉值敘述與枚舉類型的自動轉換
使用Mapper
使用Mapper的方式與以前使用Dao類型的方法完全一致,通過@Autowired實現依賴注入,如下:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void clear() {
userMapper.clear();
}
public List<User> getUsers() {
return userMapper.getUsers();
}
public void addUser(User user) {
userMapper.addUser(user);
}
public void updateUser(User user) {
userMapper.updateUser(user);
}
public User getUser(long id) {
return userMapper.getUser(id);
}
}