执行一些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有,两种方法都可
第一种方式使用useGeneratedKeys
和keyProperty
属性
第二种方式使用<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:数据类型