概述
上一篇针对Mybatis进行了入门体验,本节将继续介绍Mybatis基本映射--单表查询。
本系列文章是基于Mybatis 3.4.6 版本。
创建表
针对于上一节,我们对sys_user表结构进行了优化,字段类型更规范了些,这样做更有利于数据库性能,我们参考了一些数据库设计规范,后续抽时间整理分享出来,修改后SQL语句为:
CREATE TABLE `sys_user` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_account` varchar(50) NOT NULL COMMENT '用户账户',
`user_password` char(32) NOT NULL COMMENT 'MD5加密的用户密码',
`user_email` varchar(20) DEFAULT NULL COMMENT '用户邮箱',
`user_phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`created_date` datetime NOT NULL COMMENT '创建时间',
`modified_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`yn` tinyint(1) unsigned NOT NUll DEFAULT 1 COMMENT '是否有效(0无效,1有效)',
`modified_user` varchar(50) DEFAULT NULL COMMENT '修改人',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户信息表';
实体
我们的SysUser实体代码如下(使用lombok注解,在类中不必写get/set方法,提高开发效率以及代码更整洁):
package com.github.dalianghe.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.Date;
@Getter
@Setter
@ToString
public class SysUser {
private Long id;
private String userAccount;
private String userPassword;
private String userEmail;
private String userPhone;
private Date createdDate;
private Date modifiedDate;
private Integer yn;
private String modifiedUser;
private String remark;
}
接口
Mybatis3.0相比于2.0,支持使用接口调用方法,并且对于多参数需求,支持在方法参数中使用注解@Param设置参数的名字(2.0中需要使用对象或map来传多参数),接口代码如下:
package com.github.dalianghe.mapper;
import com.github.dalianghe.model.SysUser;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface SysUserMapper {
// 返回多值需用List接收
public List<SysUser> selectAll() throws Exception;
// 返回单个或0个使用对象接收
public SysUser selectUserById(Long id) throws Exception;
// 多参数方法
public SysUser selectUserByAccountAndPass(@Param("userAccount") String userAccount,
@Param("userPassword") String userPassword) throws Exception;
}
接口类中定义了无参、一个参数和多个参数的查询方法,在mapper配置文件中需定义三个id为方法名的select查询标签。
需注意的是查询SQL返回的结果数量,当返回1个或0个时,使用对象,返回多个时使用List,否则会报错。
mapper配置文件
定义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">
<!-- namespace与mapper接口的全限定类名进行关联 -->
<mapper namespace="com.github.dalianghe.mapper.SysUserMapper">
<!-- resultMap标签用于配置查询字段与java对象属性的映射关系 -->
<resultMap id="userMap" type="SysUser">
<id property="id" column="id"/>
<result property="userAccount" column="user_account"/>
<result property="userPassword" column="user_password"/>
<!-- ... 省略其他字段 ... -->
</resultMap>
<!-- id与mapper接口方法关联,使用resultMap进行字段映射,其值与上面resultMap的id值对应 -->
<select id="selectAll" resultMap="userMap">
select id,user_account,user_password,user_email from sys_user
</select>
<!-- 单参数查询,指定参数类型,并且使用别名与对象字段映射 -->
<select id="selectUserById" parameterType="java.lang.Integer" resultType="SysUser">
select id,user_account userAccount,user_password userPassword,user_email userEmail from sys_user
where id=#{id}
</select>
<!-- 多参数查询,指定参数类型为map -->
<select id="selectUserByAccountAndPass" parameterType="java.util.Map" resultMap="userMap">
select id,user_account,user_password,user_email from sys_user
where user_account=#{userAccount}
and user_password=#{userPassword}
</select>
</mapper>
mybatis配置文件
mybatis配置文件代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- logImpl属性配置指定使用LOG4J输出日志 -->
<setting name="logImpl" value="LOG4J2" />
<!-- true可以自动将SQL字段下划线转换为java对象的驼峰式命名属性中,默认为false -->
<setting name= "mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!-- -->
<package name="com.github.dalianghe.model"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--
方法一:逐一配置需要加载的mapper文件
-->
<mapper resource="mappers/SysUserMapper.xml"/>
<!--
方法二:配置接口所在的包路径,此配置将:
1、判断接口接口对应的命名空间是否已存在,存在报错,不存在进行下操作
2、加载接口对应的XML映射文件,将接口全限定名转换为maper文件路径
如:com.github.dalianghe.mapper.SysUserMapper-》com/github/dalianghe/mapper.SysUserMapper.xml
3、处理接口中的注解方法
此方法需Mapper接口与mapper配置文件放在同一目录下
-->
<!--<package name="com.github.dalianghe.mapper"/>-->
</mappers>
</configuration>
测试
编写测试用例对mapper方法进行测试,代码如下:
package com.github.dalianghe;
import com.github.dalianghe.mapper.SysUserMapper;
import com.github.dalianghe.model.SysUser;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class UserMapperTest {
private static SqlSessionFactory sqlSessionFactory;
@Before
public void init(){
try{
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch (IOException e){
e.printStackTrace();
}
}
public SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
@Test
public void testSelectAll(){
SqlSession sqlSession = getSqlSession();
try{
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
List<SysUser> users = sysUserMapper.selectAll();
users.forEach(user -> {
System.out.println(user.toString());
});
}catch (Exception e){
e.printStackTrace();
}
}
@Test
public void testSelectUserById(){
SqlSession sqlSession = getSqlSession();
try{
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
SysUser sysUser = sysUserMapper.selectUserById(1L);
System.out.println(sysUser);
}catch (Exception e){
e.printStackTrace();
}
}
@Test
public void testSelectUserByAccountAndPass(){
SqlSession sqlSession = getSqlSession();
try{
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
SysUser sysUser = sysUserMapper.selectUserByAccountAndPass("admin","123");
System.out.println(sysUser);
}catch (Exception e){
e.printStackTrace();
}
}
}
运行测试方法即可。
总结
本节实例了mybatis基本查询及映射,这些也是实际工作中用的最多的功能,虽然简单,日积月累会构建起我们的知识结构和体系,一步一步来。。。
最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。