测试类中的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 + '\'' +'}';}
}
直接在sql语句中搞一搞:令数据库的name等于iName:name as iName
(每一次调用都要写这么一大段,贼麻烦)
name as iName ,age,gander
当然把sql语句全部写进标签也可以
resultType
改成resultMap
,再把resultMap标签的id写进去(比之上俩方便很多)
上一篇:C++之异常
下一篇:Linux 和数据库笔记-02