Mybatis框架(二)resultType与resultMap的基本实现

执行一些sq的l语法和方法

mybatis看这一篇就够了,简单全面一发入魂_抠脚的大灰狼的博客-CSDN博客_mybatis看这一篇

@Param

//注解@Param标签会被mybatis处理并封装成一个Map对象
    @Select("SELECT * FROM student WHERE name like '%${name}%' AND age = #{age}")
    List<Student> findByid(@Param("name") String name,@Param("age") Integer age);
@Test
public void testqueryByid() throws IOException {
    init();
    PureStudentMapper mapper = sqlSession.getMapper(PureStudentMapper.class);
    List<Student> studentList = mapper.findByid("Tomcat",60);
    studentList.forEach(System.out::println); 
}

当传入n个参数 ,类型一样,那么就会不知道参数的顺序所以手动map,key-value的方式确保参数的具体位置

<select id="find2" resultType="student.pojo.Student">
     SELECT * FROM student WHERE name like '%${name}%' AND age = #{age};
</select>

测试片段代码

Map<String ,Object> map =new HashMap<>();
map.put("name","name");
map.put("age",60);
List<Student> studentList =mapper.find2(map);

主键返回

Oracle是没有自增主键的用第二种,但是mysql有,两种方法都可

第一种方式使用useGeneratedKeyskeyProperty属性

 第二种方式使用<selectKey>子标签

 测试

 批量查询

传入集合 

 

--         prefix=添加前缀    suffix=添加后缀
--         prefixOverrides=去掉前缀    suffixOverrides=去掉后缀

 where语法

 

 

resultType与resultMap

resultType

普通查询时候可以用resultType,比如单表查询

 

resultMap的关联查询

 涉及到复杂的查询就会用到N张表之间的关联,这也就涉及到配置查询结果集映射关系

比方说三张表(不考虑表设计是否合理)

 现在要通过三张表执行以下语句

 那么查到的数据相当于四个列,也就是四个关键字,理论上讲java类也需要四个属性与之配上

 String   String   String   String 

 

 但是我们类中只有一个String ,这就代表返回的结果没法承接。

虽然我们可以添加三个string类去承接,但是这违背了我们用java类去映射数据库字段一一对应的初衷。所以我们添加了两个类:dept,job。

 

 

为什么这么填呢

那么本sql的要求就是满足条件的人的名字、部门名字、部门地点、职务名字的查询。

相当于用的是一个全新的类去映射也就是

e.empname,
d.deptname,
j.jobname,
d.deptloc

但是我们原有的类种已经有相应的信息,我们需要讲三个类给融合在一起

这样四个字段就满足了。

id:就是这个新的映射的名字

result column:表的主键字段,或者可以为查询语句中的别名字段

property:映射到pojo对象的一个属性(类里设置的变量名字)

Type     javaType:引用类的路径

association :就是关联的意思

相当于新的id为emp的映射里包括emp、job、dept类的所有属性,但是可但是!!!

我们在上面写的result种有的字段它才会去识别,因为查询几个字段就返回几个字段,也就是最多给几个属性赋值,那么如果没有给属性进行映射result那么就不会有值

 

1.正常结果演示

 

2.去掉其中一个映射字段

 

 我们可以发现字段的值为null

3.全部属性展示

emp(empId=null, empName=tom, empJobId=null, empDeptId=null, empSal=null, dept=dept(deptId=null, deptName=保卫部, deptLoc=上海), job=job(jobId=null, jobName=保安, jobSal=null))
emp(empId=null, empName=jack, empJobId=null, empDeptId=null, empSal=null, dept=dept(deptId=null, deptName=保卫部, deptLoc=上海), job=job(jobId=null, jobName=保安, jobSal=null))
emp(empId=null, empName=小a, empJobId=null, empDeptId=null, empSal=null, dept=dept(deptId=null, deptName=财务部, deptLoc=北京), job=job(jobId=null, jobName=会计, jobSal=null))
emp(empId=null, empName=小b, empJobId=null, empDeptId=null, empSal=null, dept=dept(deptId=null, deptName=教育部, deptLoc=大连), job=job(jobId=null, jobName=教师, jobSal=null))
emp(empId=null, empName=小c, empJobId=null, empDeptId=null, empSal=null, dept=dept(deptId=null, deptName=后勤部, deptLoc=深圳), job=job(jobId=null, jobName=保洁阿姨, jobSal=null))
emp(empId=null, empName=小d, empJobId=null, empDeptId=null, empSal=null, dept=dept(deptId=null, deptName=医疗部, deptLoc=南京), job=job(jobId=null, jobName=医生, jobSal=null))

 相当与所有类的字段的合

emp的

private Integer empId;
private String empName;
private Integer empJobId;
private Integer empDeptId;
private Integer empSal;

+dept

private Integer deptId;
private  String deptName;
private String deptLoc;

+job

private Integer jobId;
private  String jobName;
private Integer jobSal;

如果单独想要四个字段可以通过  对象.get属性(类).get属性(get属性(类)的属性)

如emp.getDept().getDeptName()

关于表的映射

 

 

 

 

 

为什么empJobId=null, empDeptId=null呢

1.数据库字段emp_deptid与pojo类中的名字empDeptId相映射上,加上数据类型
2.如果数据库:emp_deptid  pojo类:emp_DeptId 可以通过大小写转换得到,那么可以不映射

 无非两种情况 

第一种字段名字长度一致

SELECT empid FROM emp
select empId FROM emp

他俩结果是一样的,因为数据库字段的查询不区分英文字母大小写

所有数据库第一个字段5个字母和class类的 empId 5个字母对上就可以,不用管大小写就能查到值。

第二种情况 字段名字长度不一致

那不好意思只能手动表明数据库上面字段映射Java类的上面属性

<result column="emp_deptid" property="empDeptId" jdbcType="INTEGER"/>
<result column="emp_jobid" property="empJobId" jdbcType="INTEGER"/>

column:数据库字段          property :class类属性         jdbcType:数据类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值