上一篇针对Mybatis进行了入门体验,本节将继续介绍Mybatis基本映射--单表查询。java
本系列文章是基于Mybatis 3.4.6 版本。mysql
针对于上一节,咱们对sys_user表结构进行了优化,字段类型更规范了些,这样作更有利于数据库性能,咱们参考了一些数据库设计规范,后续抽时间整理分享出来,修改后SQL语句为:git
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方法,提升开发效率以及代码更整洁):github
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;
}sql
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查询标签。apache
需注意的是查询SQL返回的结果数量,当返回1个或0个时,使用对象,返回多个时使用List,不然会报错。session
定义mapper映射文件,代码以下:mybatis
<?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配置文件代码以下:app
<?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"/> <!-- 方法二:配置接口所在的包路径,此配置将: 一、判断接口接口对应的命名空间是否已存在,存在报错,不存在进行下操做 二、加载接口对应的XML映射文件,将接口全限定名转换为maper文件路径 如:com.github.dalianghe.mapper.SysUserMapper-》com/github/dalianghe/mapper.SysUserMapper.xml 三、处理接口中的注解方法 此方法需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,共同窗习、共同进步,谢谢!