Mapper代理和别名
迪丽瓦拉
2024-05-29 05:32:06
0

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 selectall();
}

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




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;}@Overridepublic String toString() {return "com.itjh.pojo.User{" +"name='" + name + '\'' +", age=" + age +", gander='" + gander + '\'' +'}';}
}

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





(重点):

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

    @Testpublic 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 list=userMapper.selectall();System.out.println(list);}

别名

有时候当你的实体类中的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;}@Overridepublic String toString() {return "Employee{" +"iName='" + iName + '\'' +", age=" + age +", gander='" + gander + '\'' +'}';}
}

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

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



  • 加鲁鲁进化:利用sql标签,将一部分sql语句写在里面(很麻烦,要写很多sql语句)
name as iName ,age,gander

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

  • 加鲁鲁超级进化——无敌霸王龙:利用resultMap标签,记得把resultType改成resultMap,再把resultMap标签的id写进去(比之上俩方便很多)


上一篇:C++之异常

下一篇:Linux 和数据库笔记-02

相关内容