💗wei_shuo的个人主页
💫wei_shuo的学习社区
🌐Hello World !
Lombok
Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一个
注解
,你的类就有一个功能齐全的构建器、自动记录变量……
使用步骤:
- IDEA中安装Lombok插件
- 项目中导入Lombok的jar包
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency> </dependencies>
- 实体类中添加注解
import lombok.*;@Data @AllArgsConstructor @NoArgsConstructor public class User {private int id;private String name;private String password;}
- @Data:无参构造、get/set方法、toString、hashCode、equals
- @AllArgsConstructor:带参构造方法
- @NoArgsConstructor:无参构造方法
- @ToString:toString方法
- @EqualsAndHashCode:equals和hashCode方法
- @Getter:get方法
- @Setter:set方法
复杂查询环境搭建
- 导入lombok
<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency> </dependencies>
- 新建实体类Teacher、Student
Teacher类
package com.wei.pojo;import lombok.Data;@Data public class Teacher {private int id;private String name;//学生关联一个老师private Teacher teacher; }
Student类
package com.wei.pojo;import lombok.Data;//多对一 @Data public class Student {private int id;private String name;//学生需要关联一个老师private Teacher teacher; }
- 建立Mapper接口
TeacherMapper接口
package com.wei.dao;import com.wei.pojo.Teacher; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select;public interface TeacherMapper {@Select("select * from mybatis_03.teacher where id = #{tid}")Teacher getTeacher(@Param("tid") int id); }
StudentMapper接口
package com.wei.dao;public interface StudentMapper {}
- 建立Mapper.xml文件
TeacherMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace=绑定一个对应的Dao/Mapper接口--> <mapper namespace="com.wei.dao.TeacherMapper"></mapper>
StudentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--namespace=绑定一个对应的Dao/Mapper接口--> <mapper namespace="com.wei.dao.StudentMapper"></mapper>
- 核心配置文件mybatis-config.xml绑定注册接口
<!--绑定接口--> <mappers><mapper resource="com/wei/dao/StudentMapper.xml"/><mapper resource="com/wei/dao/TeacherMapper.xml"/> </mappers>
- 测试
public class MyTest {@Testpublic void test(){//取SqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();//获得TeacherMapper接口类TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher(1);System.out.println(teacher);//关闭SqlSession,避免造成内存出现问题sqlSession.close();} }
多对一处理
环境搭建
- Student实体类
package com.wei.pojo;import lombok.Data;//多对一 @Data public class Student {private int id;private String name;//学生需要关联一个老师private Teacher teacher; }
- Teacher实体类
package com.wei.pojo;import lombok.Data;@Data public class Teacher {private int id;private String name;//学生关联一个老师private Teacher teacher; }
查询嵌套处理
- Mapper.xml映射文件
<!--namespace=绑定一个对应的Dao/Mapper接口--> <mapper namespace="com.wei.dao.StudentMapper"> <!-- - resultType:Sql语句执行的返回值--> <!-- - parameterMap:参数类型--><!--子查询思路:1.查询所有的学生信息2.根据查询出来的学生的tid,寻找对应的老师--><select id="getStudent" resultMap="StudentTeacher">select * from mybatis_03.student;</select><resultMap id="StudentTeacher" type="Student"><result property="id" column="id"/><result property="name" column="name"/><!--复杂的属性,我们需要单独处理对象:association集合:collectioncolumn:数据库中的字段property:实体类中的属性javaType:设置对象类型--><association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/></resultMap><select id="getTeacher" resultType="Teacher">select * from mybatis_03.teacher where id=#{tid};</select> </mapper>
- Test测试类
@Testpublic void testStudent() {//取SqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();//获得StudentMapper接口类StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);//获取getStudent学生信息List<Student> studentList = mapper.getStudent();for (Student student : studentList) {System.out.println(student);}//关闭SqlSession,避免造成内存出现问题sqlSession.close();} }
结果嵌套查询
- Mapper.xml映射文件
<!--按照结果嵌套处理--> <select id="getStudent2" resultMap="StudentTeacher2">select s.id sid, s.name sname,t.name tname from mybatis_03.student s , mybatis_03.teacher t where t.id=s.tid; </select><resultMap id="StudentTeacher2" type="Student"><result property="id" column="sid"/><result property="name" column="sname"/><association property="teacher" javaType="Teacher"><result property="name" column="tname"/></association> </resultMap>
- Test测试类
@Test public void testStudent2() {//取SqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();//获得StudentMapper接口类StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);//获取getStudent学生信息List<Student> studentList = mapper.getStudent2();for (Student student : studentList) {System.out.println(student);}//关闭SqlSession,避免造成内存出现问题sqlSession.close(); }
一对多处理
环境搭建
- Student实体类
package com.wei.pojo;import lombok.Data;//多对一 @Data public class Student {private int id;private String name;private int tid; }
- Teacher实体类
package com.wei.pojo;import lombok.Data;import java.util.List;@Data public class Teacher {private int id;private String name;//一个老师拥有多个学生private List<Student> students; }
查询嵌套处理
- StudentMapper类
package com.wei.dao;import com.wei.pojo.Student;import java.util.List;public interface StudentMapper {//查询所有的学生信息,以及对应的老师的信息public List<Student> getStudent2(); }
- TeacherMapper.xml映射文件
<select id="getTeacher2" resultMap="TeacherStudent2">select * from mybatis_03.teacher where id=#{tid}; </select> <!--resultMap结果映射--> <resultMap id="TeacherStudent2" type="Teacher"><result property="id" column="tid"/><result property="name" column="tname"/><!--复杂的属性,我们需要单独处理对象:association集合:collectionjavaType:指定的属性类型集合中的泛型信息,使用ofType获取--><collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/> </resultMap><select id="getStudentByTeacherId" resultType="Student">select * from mybatis_03.student where tid=#{tid}; </select>
- 测试
@Test public void test2() {//获取sqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();//获取TeacherMapper接口类TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher2(1);System.out.println(teacher);//关闭SqlSession,避免造成内存出现问题sqlSession.close(); }
结果嵌套查询
- StudentMapper类
package com.wei.dao;import com.wei.pojo.Student;import java.util.List;public interface StudentMapper {//查询所有的学生信息,以及对应的老师的信息public List<Student> getStudent(); }
- TeacherMapper.xml映射文件
<!--按照结果嵌套查询--> <select id="getTeacher" resultMap="TeacherStudent">select s.id sid, s.name sname, t.name tname, t.id tid from mybatis_03.student s,mybatis_03.teacher t where t.id = s.tid and t.id=#{tid}; </select> <!--resultMap结果映射--> <!-- column:数据库中的字段 property:实体类中的属性 --> <resultMap id="TeacherStudent" type="Teacher"><result property="id" column="tid"/><result property="name" column="tname"/><!--复杂的属性,我们需要单独处理对象:association集合:collectionjavaType:指定的属性类型集合中的泛型信息,使用ofType获取--><collection property="students" ofType="Student"><result property="id" column="sid"/><result property="name" column="sname"/><result property="tid" column="tid"/></collection> </resultMap>
- 测试
public class MyTest {@Testpublic void test() {//获取sqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();//获取TeacherMapper接口类TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacher(1);System.out.println(teacher);//关闭SqlSession,避免造成内存出现问题sqlSession.close();}
总结:
collection & association区别:
- 关联 - association [多对一]
- 集合 - collection [一对多]
javatype & oftype区别:
- javatype:指定实体类中属性的类型
- oftype:指定映射到List或者集合的pojo类型,泛型中的约束类型
🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——
点赞
👍收藏
⭐️评论
📝冲冲冲
🤞