MyBatis中sql映射文件详细讲解

sql映射是MyBatis框架中最具特色的部分,功能强大使用简单。MyBatis框架的主要思想就是将sql语句从代码程序中分离出来,对jdbc访问数据库的代码进行封装,从程序中消除了所有sql参数设置,以及处理结果集的jdbc代码,从而大幅减少数据访问层的编码量。并且sql语句与代码解耦,可以最大限度的对sql语句的灵活管理,方便sql调优保证性能。

 sql映射文件中的几个顶级元素介绍如下。

         mapper:sql映射文件的根元素。只有一个namespace,用于区分不同的mapper,必须全局唯一。

        cache:为给定命名空间配置缓存

        cache-ref:引用给其他命名空间中的缓存配置

        resultMap:用来描述查询结果集中的字段和java实体类属性的对应关系。

        sql:定义可重用的sql语句块,可以在其他语句映射中引用,提高编写的维护sql语句的效率

        insert:映射insert语句

        update:映射update语句

        delete:映射delete语句

        select:映射select语句

1.MyBatis框架的条件查询

        1.1实现单一查询

        再次之前  先建立好一个Mybatis框架(若没搭建完成,请观看我上一篇文档“Mabatis框架内搭建”)

        编写实体类

        

package pojo;

import java.util.Date;
import java.util.List;

public class SysUser {

    private static final long serialVersionUID = 1L;
    /**
     * 主键ID
     */
    private Integer id;
    /**
     * 账号
     */
    private String account;
    /**z
     * 真实姓名
     */
    private String realName;
    /**
     * 密码
     */
    private String password;
    /**
     * 性别(1:女、 2:男)
     */
    private Integer sex;
    /**
     * 出生日期(年-月-日)
     */
    private Date birthday;
    /**
     * 手机号码
     */
    private String phone;
    /**
     * 用户地址
     */
    private String address;
    /**
     * 用户角色id
     */
    private Integer roleId;
    /**
     * 身份证照片
     */
    private String idPicPath;
    /**
     * 工作证照片
     */
    private String workPicPath;
    /**
     * 创建人
     */
    private Integer createdUserId;
    /**
     * 创建时间
     */
    private Date createdTime;
    /**
     * 修改人
     */
    private Integer updatedUserId;
    /**
     * 修改时间
     */
    private Date updatedTime;
    /**
     * 角色
     */
    // private String userRoleName;


    public SysUser() {
    }

    public SysUser(Integer id, String account, String realName, String password, Integer sex) {
        this.id = id;
        this.account = account;
        this.realName = realName;
        this.password = password;
        this.sex = sex;
    }

    public SysUser(Integer id, String account, String realName, String password, Integer sex, Date birthday, String phone, String address, Integer roleId, String idPicPath, String workPicPath, Integer createdUserId, Date createdTime, Integer updatedUserId, Date updatedTime) {
        this.id = id;
        this.account = account;
        this.realName = realName;
        this.password = password;
        this.sex = sex;
        this.birthday = birthday;
        this.phone = phone;
        this.address = address;
        this.roleId = roleId;
        this.idPicPath = idPicPath;
        this.workPicPath = workPicPath;
        this.createdUserId = createdUserId;
        this.createdTime = createdTime;
        this.updatedUserId = updatedUserId;
        this.updatedTime = updatedTime;

    }

    @Override
    public String toString() {
        return "SysUser{" +
                "id=" + id +
                ", account='" + account + '\'' +
                ", realName='" + realName + '\'' +
                ", password='" + password + '\'' +
                ", sex=" + sex +
                ", birthday=" + birthday +
                ", phone='" + phone + '\'' +
                ", address='" + address + '\'' +
                ", roleId=" + roleId +
                ", idPicPath='" + idPicPath + '\'' +
                ", workPicPath='" + workPicPath + '\'' +
                ", createdUserId=" + createdUserId +
                ", createdTime=" + createdTime +
                ", updatedUserId=" + updatedUserId +
                ", updatedTime=" + updatedTime +

                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getRoleId() {
        return roleId;
    }

    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }

    public String getIdPicPath() {
        return idPicPath;
    }

    public void setIdPicPath(String idPicPath) {
        this.idPicPath = idPicPath;
    }

    public String getWorkPicPath() {
        return workPicPath;
    }

    public void setWorkPicPath(String workPicPath) {
        this.workPicPath = workPicPath;
    }

    public Integer getCreatedUserId() {
        return createdUserId;
    }

    public void setCreatedUserId(Integer createdUserId) {
        this.createdUserId = createdUserId;
    }

    public Date getCreatedTime() {
        return createdTime;
    }

    public void setCreatedTime(Date createdTime) {
        this.createdTime = createdTime;
    }

    public Integer getUpdatedUserId() {
        return updatedUserId;
    }

    public void setUpdatedUserId(Integer updatedUserId) {
        this.updatedUserId = updatedUserId;
    }

    public Date getUpdatedTime() {
        return updatedTime;
    }

    public void setUpdatedTime(Date updatedTime) {
        this.updatedTime = updatedTime;
    }


}

        

创建一个SysUserMapper接口

    /**
     * 根据用户真实姓名模糊查询用户,参数realName为需要传递给SQL语句的查询语句
     * @return
     */
    List<SysUser> getUserByRealName(String realName);

在util包中创建一个MyBatisUtil工具类

aaa

public class MyBatisUtil {
    /**
     * 数据库会话工厂模式
     */
    private static SqlSessionFactory factory;

    static {
        try{
            // 获取核心配置文件
            InputStream is = Resources.getResourceAsStream("MyBatis-Config.xml");
            // 获取数据库会话工厂模式
            factory = new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 创建并返回一个SqlSession对象
     * @return
     */
    public static SqlSession creatSqlSession(){
        return factory.openSession(false); // 关闭自动提交事务
    }

    /**
     * 关闭SqlSession对象
     * @param sqlSession
     */
    public static void closeSqlSession(SqlSession sqlSession){
        if(sqlSession!=null){
            sqlSession.close();
        }
    }
}

之后  在resource包下  创建 com.yl.mapper包

代码如下

  <select id="getUserByRealName" resultType="sysUser" parameterType="string">
        SELECT * FROM t_sys_user where realName like CONCAT ('%',#{param},'%')
    </select>

在test测试包下创建com.yl.mapper

 在mapper接口中点击getuserbyrealname方法并按ctrl+shift+t 自动生成测试类

代码如下

   @Test
    public void testGetUserByRealName() {
        // 获取数据库会话
        SqlSession sqlSession = MyBatisUtil.creatSqlSession();
        // 获取mapper对象
        SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class);
        // 获取根据用户真实姓名模糊查询用户,参数realName为需要传递给SQL语句的查询语句
        List<SysUser> list = mapper.getUserByRealName("徐");
        list.forEach(user -> System.out.println(user));
    }

一个简答的查询就完成了

之后我们需要在MyBatis-Config文件中配置sql映射

   <mappers>
        <mapper resource="com/yl/mapper/StorageRecordMapper.xml"/>
        <mapper resource="com/yl/mapper/SupperlierMapper.xml"/>
<!--                <package name="com/yl/mapper"/>-->
    </mappers>

 之后运行测试代码

运行结果

sql映射文件中的select元素使用一个新的属性parameterType,他表示为sql语句传入的传输类型,使用完全限定名,支持基础数据类型和复杂数据类型

而在被映射的sql语句中,阐述的表示方法为#{参数名},MyBatis框架会将其转换成PreparedStatement参数并为其复制

对于单一查询条件,使用paramterType属性指定其数据类型即可,甚至sql语句中的参数名都不需要和Mapper接口方式的参数名可以匹配,MyBatis框架将映射的sql语句自动转换成“?”占位符的sql语句并正确实现了赋值

别名映射类型             别名映射的类型
boolean       BooleanstringString
byteBytebigdecimalBigdecimal
longLongdateDate
shortShortmapMap
intIntegerhashmapHashMap
doubleDoublelistList
floatFloatarraylistArrayList

单条件查询看完了现在再来看多条件查询

1.  以实体类为一个参数

编写mapper类

/**
     * 查询用户列表
     * @param sysUser
     * @return
     */
    List<SysUser> getUserListByPojo(SysUser sysUser);

映射sql如下

    <select id="getUserListByPojo" resultType="sysUser">
        SELECT * FROM t_sys_user where realName like CONCAT('%',#{realName},'%') and roleId = #{roleId}
    </select>

测试代码如下

  @Test
    public void testGetUserListByPojo() {
        // 获取数据库会话
        SqlSession sqlSession = MyBatisUtil.creatSqlSession();
        // 获取mapper对象
        SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class);
        SysUser user = new SysUser();
        user.setRealName("李");
        user.setRoleId(3);
        // 查询用户列表
        List<SysUser> list = mapper.getUserListByPojo(user);
        list.forEach(users -> System.out.println(users));
    }

运行结果

2.使用map方式

    /**
     * 查询用户列表
     * @param userMap
     * @return
     */
    List<SysUser> getUserListByMap(Map<String,Object> userMap);

映射

 <select id="getUserListByMap" resultType="sysUser" parameterType="map">
        SELECT * FROM t_sys_user where realName like CONCAT('%',#{rName},'%') and roleId = #{rId}
    </select>

测试

 @Test
    public void testGetUserListByMap() {
        // 获取数据库会话
        SqlSession sqlSession = MyBatisUtil.creatSqlSession();
        // 获取mapper对象
        SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class);
        // 创建一个Map集合
        Map<String, Object> map = new HashMap<String, Object>();
        // 放参数
        map.put("rName", "赵");
        map.put("rId", 2);
        List<SysUser> list = mapper.getUserListByMap(map);
        list.forEach(user -> System.out.println(user));
    }

运行结果

3.以@Param(“”)方式

    /**
     * 查询用户列表
     * @param realName
     * @return
     */
    List<SysUser> getUserListByParams(@Param("realName") String realName,@Param("roleId") int roleId);

映射

   <select id="getUserListByParams" resultType="sysUser">
        SELECT * FROM t_sys_user where realName like CONCAT('%',#{realName},'%') and roleId = #{roleId}
    </select>

测试

    @Test
    public void testGetUserListByParams(){
        // 获取数据库会话
        SqlSession sqlSession = MyBatisUtil.creatSqlSession();
        // 获取mapper对象
        SysUserMapper mapper = sqlSession.getMapper(SysUserMapper.class);
        List<SysUser> list = mapper.getUserListByParams("赵", 2);
        list.forEach(user -> System.out.println(user));
    }

是否很简单  今天就写这点未完待续!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值