Mapper代理、别名(实体类属性与映射文件sq参数的别名,实体类在mybatis配置文件中的别名)

Mapper代理

测试类中的sql语句的id硬编码问题:
启用Mapper代理方式:

  • 建立与sql映射文件同路径同名的Mapper接口(如:接口建立在分层式的com.it.Mapp中那么已经存在于resources中的sql映射文件就需要同样放在同样的 路径下:在resources下建一个包com/it/Mapp,注意:用的是/,然后在电脑中找到项目工程的target点进入发现接口文件和sql映射文件在一起了)
  • sql映射文件中的namespace改成接口的全限定名
  • Mapper接口中定义方法名与sql映射文件的id相同,返回类型一致
  • 测试类中用SqlSession的对象sqlSession.getMapper(Mapper接口.class);

Mapper接口:(方法名为Mapper映射文件中的id,返回值为实体类User)

package com.itjh.mapp;

import com.itjh.pojo.User;
import java.util.List;

public interface UserMapper {
    List<User> selectall();
}

Mapper映射文件(xml后缀的文件):id:对应Mapper接口中的selectall方法;namespace:Mapper接口全限定名;resultType为返回结果类型:User类的全限定名

<?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.itjh.mapp.UserMapper">
    <!--resultType:返回结果的类型,比如User类-->
    <select id="selectall" resultType="com.itjh.pojo.User">
        select * from farther;
    </select>
</mapper>

User类:接收数据库中数据进来并且提供打印(toString()方法)

{
    String name   ;
    Integer age    ;
    String gander ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGander() {
        return gander;
    }

    public void setGander(String gander) {
        this.gander = gander;
    }

    @Override
    public String toString() {
        return "com.itjh.pojo.User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gander='" + gander + '\'' +
                '}';
    }
}

mybatis:加载mapper文件换成扫描mapper文件所属的包

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///parent"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--加载sql映射文件-->
    <mappers>
<!--        <mapper resource="com.itjh.mapp"/>-->
        <package name="com.itjh.mapp"/>
    </mappers>
</configuration>

(重点):

测试类中改变的那两行:得到一个接口对象,再调用接口的方法,而这个方法名又和sql映射文件里的id相同,且俩文件都在一个路径下,所以接口中的这个方法会自动的进入sql映射文件,再通过映射文件得到集合,而接口中的方法的返回类型也是集合,于是就自然把得到的集合返回,测试类这边在用一个集合收住,最后打印

    @Test
    public void show() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession=sqlSessionFactory.openSession();

        //获得UserMapper接口的代理对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        //返回一个集合
        List<User> list=userMapper.selectall();
        System.out.println(list);
    }

别名1

有时候当你的实体类中的settter()方法(如setiName(),取set后面的部分,即:Name)与数据库中的你想要的字段名对不上号时,就会显示null等 (String 类型的就显示null)

[Employee{iName=null, age=45, gander='男'}

瞅一眼实体类:数据库的为name,而当前实体类的就是iName

package com.itjh.pojo;

public class Employee {
    String iName;
    Integer age;
    String gander;

    public String getYouName() {
        return iName;
    }

    public void setiName(String name) {
        this.iName = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGander() {
        return gander;
    }

    public void setGander(String gander) {
        this.gander = gander;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "iName='" + iName + '\'' +
                ", age=" + age +
                ", gander='" + gander + '\'' +
                '}';
    }
}

那么就在Mapper文件中进行别名的配置 ###:

直接在sql语句中搞一搞:令数据库的name等于iName:name as iName(每一次调用都要写这么一大段,贼麻烦)

<mapper namespace="com.itjh.mapp.EmployeeMapper">
    <select id="selectall" resultType="com.itjh.pojo.Employee">
        select name as iName ,age,gander
        from farther
    </select>
</mapper>
  • 加鲁鲁进化:利用sql标签,将一部分sql语句写在里面(很麻烦,要写很多sql语句)
<mapper namespace="com.itjh.mapp.EmployeeMapper">
    <sql id="employee_column">
        name as iName ,age,gander
    </sql>
    <select id="selectall" resultType="com.itjh.pojo.Employee">
       	 select 
       	 <include refid="employee_column"></include> 
       	 from farther
    </select>
</mapper>

当然把sql语句全部写进标签也可以

  • 加鲁鲁超级进化——无敌霸王龙:利用resultMap标签,记得把resultType改成resultMap,再把resultMap标签的id写进去(比之上俩方便很多)
<mapper namespace="com.itjh.mapp.EmployeeMapper">
    <resultMap id="employee" type="com.itjh.pojo.Employee">
        <result property="iName" column="name"></result>
    </resultMap>
    <select id="selectall" resultMap="employee">
        select
        *
        from farther
    </select>
</mapper>

别名2

在Mapper配置文件中:resultType参数为实体类全限定名,但比较麻烦

 <select id="selectall" resultType="com.itjh.pojo.Dao">
        select * from bank where id = #{id}
    </select>

解决办法:在mybatis配置文件中添加别名:扫描实体类所在的包,当映射文件的resultType填写参数时,写入类的小写类名就行(因为扫描,所以类名小写自动变成了可以用的别名)
在这里插入图片描述

<typeAliases>
	<package name="com.itjh.pojo"/>
</typeAliases>

Mapper映射文件:

<select id="selectall" resultType="dao">
        select * from bank where id = #{id}
    </select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis是一款开源的持久化框架,可以简化Java应用程序与数据库之间的交互操作。在Mybatismapper是用于定义数据库操作接口的一种方式。而实体类则是用于表示数据库的表结构的Java类。 mapper接口是指定义了一系列数据库操作的方法,这些方法的实现由Mybatis框架自动生成。我们可以通过mapper接口的方法完成数据库的增删改查等操作。 在使用mapper接口时,我们需要创建一个与之对应的实体类实体类属性数据库表的列一一对应,通过实体类的对象可以方便地进行数据的传递和操作。 以一个用户表为例,假设该表包含了id、name和age字段。我们可以创建一个User实体类,类包含了对应的属性和对应的getter和setter方法。在mapper接口,我们定义了一些常用的数据库操作方法,比如根据id查询用户、添加用户、修改用户等。 使用Mybatis框架时,我们可以通过注解或者XML配置文件的方式来完成mapper接口与实体类映射关系。将数据操作的SQL语句定义在mapper接口的方法Mybatis框架会根据这些方法来自动生成对应的SQL语句,并执行相应的数据库操作。 通过使用Mybatismapper实体类,我们可以更加方便地操作数据库,避免了手写SQL语句的繁琐。同时,mapper实体类的使用也提高了代码的可读性和可维护性,使得我们的开发工作更加便捷高效。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值