上一篇針對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,共同窗習、共同進步,謝謝!