一、集合1.1 Set接口Set接口是Collection的子接口Set接口以散列的形式存储数据所以元素是无序的可以存储一组无序且唯一的对象。1.2 Set接口的实现类HashSet存储一组无序且唯一的元素这里的无序是指元素的存储顺序和遍历顺序不一致。import java.util.HashSet; import java.util.Iterator; public class Test6 { public static void main(String[] args) { HashSet hashSet new HashSet(); hashSet.add(Hello); hashSet.add(World); hashSet.add(Java); hashSet.add(World); System.out.println(hashSet.size());//因为Set的元素唯一所以存的元素只有3个只有1个World //无序需要使用迭代进行遍历 Iterator iterator hashSet.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } hashSet.remove(Hello); Iterator iterator1 hashSet.iterator(); while(iterator1.hasNext()){ System.out.println(iterator1.next()); } } }LinkedHashSet是Set的另外一个子接口可以存储一组有序且唯一的元素这里的有序是指元素的存储顺序和遍历顺序是一致的。import java.util.LinkedHashSet; public class Test6 { public static void main(String[] args) { LinkedHashSet set new LinkedHashSet(); set.add(Hello); set.add(World); set.add(Hello); set.add(Java); System.out.println(set.size()); System.out.println(set); set.remove(World); Iterator iterator set.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } }TreeSet存储一组有序且唯一的元素TreeSet的有序和LinkedHashSet的有序不一样。TreeSet的有序是指集合内部会自动给所有元素按照升序进行排列。import java.util.TreeSet; public class Test6 { public static void main(String[] args) { TreeSet treeSet new TreeSet(); treeSet.add(5); treeSet.add(8); treeSet.add(1); treeSet.add(3); treeSet.add(6); treeSet.add(2); treeSet.add(3); System.out.println(treeSet.size());//结果为6因为元素是唯一的。 System.out.println(treeSet); } }如果需要比较对象需要comparable接口import java.util.Iterator; import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { TreeSet treeSet new TreeSet(); treeSet.add(new A(1)); treeSet.add(new A(5)); treeSet.add(new A(8)); treeSet.add(new A(2)); treeSet.add(new A(4)); treeSet.add(new A(7)); treeSet.add(new A(3)); treeSet.add(new A(1)); // System.out.println(treeSet); Iterator iterator treeSet.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } } class A implements Comparable{ private int num; public A(int num){ this.num num; } /** * A.compareTo(B) * 1表示A大于B * 0表示A等于B * -1表示A小于B * param o the object to be compared. * return */ Override public int compareTo(Object o) { A a (A)o; if (this.num a.num){ return 1; } if (this.num a.num){ return -1; } return 0; } Override public String toString() { return A{ num num }; } }1.3 Map接口Map接口是与Collection接口完全独立的另一个体系。区别在于 Set、List 、Collection只能操作单个元素Map可以操作一对元素。Map中的元素都是以key-value进行存储的。方法描述int size()获取集合长度boolean isEmpty()判断集合是否为空boolean containsKey(Object key)判断集合中是否存在keyboolean containsValue(Object value)判断集合中是否存在valueV get(Object key)通过key取出对应的valueV put(Object key,Object value)向集合中添加一组key-valueV remove(Object key)通过key删除集合元素void clear()清空集合Set keySet()取出所有的key返回setCollection values()取出所有的value返回CollectionSet entrySet()将Map转换为Set对象key-value都取出int hashCode()获取集合的散列码boolean equals(Object o)比较两个集合是否相等1.4 Map接口的实现类HashMap:存储一组无序、key不可重复value可重复的元素Hashtable:存储一组无序、key不可重复value可重复的元素TreeMap:存储一组有序、key不可重复value可以重复的元素可以按照key来排序HashMap的常用方法import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class HashMapTest { public static void main(String[] args) { HashMap hashMap new HashMap(); hashMap.put(h,Hello); hashMap.put(w,World); hashMap.put(j,Java); hashMap.put(d,Duan); hashMap.put(y,Ye); hashMap.put(z,Zi); hashMap.put(z,Zhang);//key值重复只显示Zhang hashMap.put(d,De); //这里与Duan的key值重复只能显示一个 De hashMap.put(f,Fu); System.out.println(hashMap); System.out.println(hashMap.size()); //集合长度 System.out.println(hashMap.containsKey(a));//集合中是否存在key值a System.out.println(hashMap.containsValue(Fu));//集合中是否存在value值fu System.out.println(hashMap.get(h));//通过keyh取出对应的valueHello System.out.println(hashMap.entrySet());//取出集合中所有的key-value Set set hashMap.keySet(); //取出集合中所有key并通过集合输出 Iterator iterator set.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } Collection value hashMap.values(); //集合中所有value值 Iterator iterator1 value.iterator(); //遍历输出 while(iterator1.hasNext()){ System.out.println(iterator1.next()); } } }Hashtable常用方法,用法同HashMap。区别是Hashtable是线程安全的HashMap线程不安全。二、MyBatis2.1 补充删改查方法update方法Update({update sys_news set title #{title},content #{content},createtime #{createtime},opername #{opername} where id #{id}}) public int update(News news);InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 //改 update NewsMapper mapper sqlSession.getMapper(NewsMapper.class); News news new News(); news.setTitle(测试2); news.setCreatetime(new Date()); news.setOpername(admin2); news.setContent(测试2测试2测试1); news.setId(1); int update mapper.update(news); System.out.println(update); sqlSession.commit();//提交到数据库删除Delete({delete from sys_news where id#{id}}) public int delete(Integer id);InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 //删除 Delete NewsMapper mapper sqlSession.getMapper(NewsMapper.class); int delete mapper.delete(2); System.out.println(delete); sqlSession.commit();查询Select({Select * from sys_news where id #{id}}) public News getById(Integer id);InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 //查询 NewsMapper mapper sqlSession.getMapper(NewsMapper.class); News news mapper.getById(1); System.out.println(news);Select({select * from sys_news}) public ListNews list();//查询 NewsMapper mapper sqlSession.getMapper(NewsMapper.class); ListNews list mapper.list(); for(News news : list){ System.out.println(news); }多表联查原始数据identity opername业务逻辑创建customer对象将identity opername的值分别赋值给customer对象rent.identity→customer.identity关联字段值相同rent.opername→customer.custnamepackage com.myspring.entity; import lombok.Data; import java.util.Date; Data public class Rent { private String rentid; private Integer price; private Date begindate; private Date returndate; // private String identity; private String carnumber; // private String opername; private Date createtime; private Customer customer; }package com.myspring.entity; import lombok.Data; Data public class Customer { private String identity; private String custname; private String address; private String phone; private String career; }package com.myspring.mapper; import com.myspring.entity.Rent; public interface RentMapper { public Rent getById(String rentid); }?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.RentMapper resultMap idrentMap typecom.myspring.entity.Rent id columnrentid propertyrentid/id result columnprice propertyprice/result result columnbegindate propertybegindate/result result columnreturndate propertyreturndate/result result columncarnumber propertycarnumber/result result columncreatetime propertycreatetime/result association propertycustomer javaTypecom.myspring.entity.Customer result columnidentity propertyidentity/result result columnopername propertycustname/result result columnaddress propertyaddress/result result columnphone propertyphone/result result columncareer propertycareer/result /association /resultMap !-- select idgetById resultTypecom.myspring.entity.Rent-- select idgetById resultMaprentMap select * from rent,customer where rent.identity customer.identity and rentid#{rentid} /select /mapperpackage com.myspring; import com.myspring.entity.News; import com.myspring.entity.Rent; import com.myspring.mapper.RentMapper; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class Test1 { public static void main(String[] args) { InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 RentMapper mapper sqlSession.getMapper(RentMapper.class); SimpleDateFormat simpleDateFormat new SimpleDateFormat(yyyy-MM-dd);//MM大写否则会默认输出是00 Rent rent mapper.getById(R2024001); System.out.println(simpleDateFormat.format(rent.getCreatetime())); System.out.println(rent); System.out.println(rent.getCustomer()); } }三、MyBatis延迟加载延迟加载又叫惰性加载懒加载、按需加载提升程序运行效率的方式。持久层访问数据库原则Java程序和数据库交互频率越低越好MyBatis通过延迟加载来减少Java和数据库交互次数。Class和Student查询Student会将对应的Class数据一并查出。延迟加载的思路如果只是需要Student中的name不调用Class中的那么就只执行一条SQL语句如果需要知道Class相关字段就需要执行两条SQL语句。select * from student where id 1; select * from class where id 2;根据具体的需求动态选择执行SQL的条数。MySQL 关系型数据库ORM框架Object Relationship Mapping)关联关系型数据库和面向对象编程语言3.1 创建实体类package com.myspring.entity; import lombok.Data; import java.util.List; Data public class Class { private Integer id; private String name; private ListStudent students;//一个班级有多个学生 }package com.myspring.entity; import lombok.Data; Data public class Student { private Integer id; private String name; private Class clazz; //关联Class表一个学生只能属于一个班级 }3.2 创建Mapper接口及mapper.xmlpackage com.myspring.mapper; import com.myspring.entity.Class; public interface ClassMapper { public Class getById(Integer id); }?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.ClassMapper select idgetById parameterTypejava.lang.Integer resultTypecom.myspring.entity.Class select * from class where id #{id}; /select /mapperpackage com.myspring.mapper; import com.myspring.entity.Student; public interface StudentMapper { public Student getById(Integer id); }?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.StudentMapper select idgetById parameterTypejava.lang.Integer resultTypecom.myspring.entity.Student select * from student where id #{id}; /select /mapper此时我希望在查询Student字段时cid对应class的值也能被查出来不是2而是对应的“二班”修改StudentMapper.xml文件?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.StudentMapper !-- select idgetById parameterTypejava.lang.Integer resultTypecom.myspring.entity.Student-- !-- select * from student where id #{id};-- !-- /select-- resultMap idstudentMap typecom.myspring.entity.Student id columnid propertyid/id result columnname propertyname/result association propertyclazz javaTypecom.myspring.entity.Class columncid selectcom.myspring.mapper.ClassMapper.getById /association /resultMap select idgetById parameterTypejava.lang.Integer resultMapstudentMap select * from student where id #{id} /select /mapper3.3 config.xml文件!--注意是/不是. 写错了会报错找不到;文件名后缀也要带上-- mapper resourcecom/myspring/mapper/StudentMapper.xml/mapper mapper resourcecom/myspring/mapper/ClassMapper.xml/mapper注意修改成对应的数据库名。3.4 测试package com.myspring; import com.myspring.entity.News; import com.myspring.entity.Rent; import com.myspring.entity.Student; import com.myspring.mapper.RentMapper; import com.myspring.mapper.StudentMapper; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class Test1 { public static void main(String[] args) { InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build( resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 StudentMapper mapper sqlSession.getMapper(StudentMapper.class); Student student mapper.getById(1); System.out.println(student); } }3.5 结果此时我们只想获取student表的信息name不调用class表的。System.out.println(student.getName());仍然会调用两条SQL语句浪费。使用懒加载可以解决该问题。3.6 config.xml中开启懒加载!--懒加载-- setting namelazyLoadingEnabled valuetrue/再次运行看结果只执行了一条SQL语句
【Java框架】知识点汇总Day2:MyBatis(含集合基础)(持续更新)
发布时间:2026/6/3 10:50:00
一、集合1.1 Set接口Set接口是Collection的子接口Set接口以散列的形式存储数据所以元素是无序的可以存储一组无序且唯一的对象。1.2 Set接口的实现类HashSet存储一组无序且唯一的元素这里的无序是指元素的存储顺序和遍历顺序不一致。import java.util.HashSet; import java.util.Iterator; public class Test6 { public static void main(String[] args) { HashSet hashSet new HashSet(); hashSet.add(Hello); hashSet.add(World); hashSet.add(Java); hashSet.add(World); System.out.println(hashSet.size());//因为Set的元素唯一所以存的元素只有3个只有1个World //无序需要使用迭代进行遍历 Iterator iterator hashSet.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } hashSet.remove(Hello); Iterator iterator1 hashSet.iterator(); while(iterator1.hasNext()){ System.out.println(iterator1.next()); } } }LinkedHashSet是Set的另外一个子接口可以存储一组有序且唯一的元素这里的有序是指元素的存储顺序和遍历顺序是一致的。import java.util.LinkedHashSet; public class Test6 { public static void main(String[] args) { LinkedHashSet set new LinkedHashSet(); set.add(Hello); set.add(World); set.add(Hello); set.add(Java); System.out.println(set.size()); System.out.println(set); set.remove(World); Iterator iterator set.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } }TreeSet存储一组有序且唯一的元素TreeSet的有序和LinkedHashSet的有序不一样。TreeSet的有序是指集合内部会自动给所有元素按照升序进行排列。import java.util.TreeSet; public class Test6 { public static void main(String[] args) { TreeSet treeSet new TreeSet(); treeSet.add(5); treeSet.add(8); treeSet.add(1); treeSet.add(3); treeSet.add(6); treeSet.add(2); treeSet.add(3); System.out.println(treeSet.size());//结果为6因为元素是唯一的。 System.out.println(treeSet); } }如果需要比较对象需要comparable接口import java.util.Iterator; import java.util.TreeSet; public class TreeSetDemo { public static void main(String[] args) { TreeSet treeSet new TreeSet(); treeSet.add(new A(1)); treeSet.add(new A(5)); treeSet.add(new A(8)); treeSet.add(new A(2)); treeSet.add(new A(4)); treeSet.add(new A(7)); treeSet.add(new A(3)); treeSet.add(new A(1)); // System.out.println(treeSet); Iterator iterator treeSet.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } } class A implements Comparable{ private int num; public A(int num){ this.num num; } /** * A.compareTo(B) * 1表示A大于B * 0表示A等于B * -1表示A小于B * param o the object to be compared. * return */ Override public int compareTo(Object o) { A a (A)o; if (this.num a.num){ return 1; } if (this.num a.num){ return -1; } return 0; } Override public String toString() { return A{ num num }; } }1.3 Map接口Map接口是与Collection接口完全独立的另一个体系。区别在于 Set、List 、Collection只能操作单个元素Map可以操作一对元素。Map中的元素都是以key-value进行存储的。方法描述int size()获取集合长度boolean isEmpty()判断集合是否为空boolean containsKey(Object key)判断集合中是否存在keyboolean containsValue(Object value)判断集合中是否存在valueV get(Object key)通过key取出对应的valueV put(Object key,Object value)向集合中添加一组key-valueV remove(Object key)通过key删除集合元素void clear()清空集合Set keySet()取出所有的key返回setCollection values()取出所有的value返回CollectionSet entrySet()将Map转换为Set对象key-value都取出int hashCode()获取集合的散列码boolean equals(Object o)比较两个集合是否相等1.4 Map接口的实现类HashMap:存储一组无序、key不可重复value可重复的元素Hashtable:存储一组无序、key不可重复value可重复的元素TreeMap:存储一组有序、key不可重复value可以重复的元素可以按照key来排序HashMap的常用方法import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class HashMapTest { public static void main(String[] args) { HashMap hashMap new HashMap(); hashMap.put(h,Hello); hashMap.put(w,World); hashMap.put(j,Java); hashMap.put(d,Duan); hashMap.put(y,Ye); hashMap.put(z,Zi); hashMap.put(z,Zhang);//key值重复只显示Zhang hashMap.put(d,De); //这里与Duan的key值重复只能显示一个 De hashMap.put(f,Fu); System.out.println(hashMap); System.out.println(hashMap.size()); //集合长度 System.out.println(hashMap.containsKey(a));//集合中是否存在key值a System.out.println(hashMap.containsValue(Fu));//集合中是否存在value值fu System.out.println(hashMap.get(h));//通过keyh取出对应的valueHello System.out.println(hashMap.entrySet());//取出集合中所有的key-value Set set hashMap.keySet(); //取出集合中所有key并通过集合输出 Iterator iterator set.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } Collection value hashMap.values(); //集合中所有value值 Iterator iterator1 value.iterator(); //遍历输出 while(iterator1.hasNext()){ System.out.println(iterator1.next()); } } }Hashtable常用方法,用法同HashMap。区别是Hashtable是线程安全的HashMap线程不安全。二、MyBatis2.1 补充删改查方法update方法Update({update sys_news set title #{title},content #{content},createtime #{createtime},opername #{opername} where id #{id}}) public int update(News news);InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 //改 update NewsMapper mapper sqlSession.getMapper(NewsMapper.class); News news new News(); news.setTitle(测试2); news.setCreatetime(new Date()); news.setOpername(admin2); news.setContent(测试2测试2测试1); news.setId(1); int update mapper.update(news); System.out.println(update); sqlSession.commit();//提交到数据库删除Delete({delete from sys_news where id#{id}}) public int delete(Integer id);InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 //删除 Delete NewsMapper mapper sqlSession.getMapper(NewsMapper.class); int delete mapper.delete(2); System.out.println(delete); sqlSession.commit();查询Select({Select * from sys_news where id #{id}}) public News getById(Integer id);InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 //查询 NewsMapper mapper sqlSession.getMapper(NewsMapper.class); News news mapper.getById(1); System.out.println(news);Select({select * from sys_news}) public ListNews list();//查询 NewsMapper mapper sqlSession.getMapper(NewsMapper.class); ListNews list mapper.list(); for(News news : list){ System.out.println(news); }多表联查原始数据identity opername业务逻辑创建customer对象将identity opername的值分别赋值给customer对象rent.identity→customer.identity关联字段值相同rent.opername→customer.custnamepackage com.myspring.entity; import lombok.Data; import java.util.Date; Data public class Rent { private String rentid; private Integer price; private Date begindate; private Date returndate; // private String identity; private String carnumber; // private String opername; private Date createtime; private Customer customer; }package com.myspring.entity; import lombok.Data; Data public class Customer { private String identity; private String custname; private String address; private String phone; private String career; }package com.myspring.mapper; import com.myspring.entity.Rent; public interface RentMapper { public Rent getById(String rentid); }?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.RentMapper resultMap idrentMap typecom.myspring.entity.Rent id columnrentid propertyrentid/id result columnprice propertyprice/result result columnbegindate propertybegindate/result result columnreturndate propertyreturndate/result result columncarnumber propertycarnumber/result result columncreatetime propertycreatetime/result association propertycustomer javaTypecom.myspring.entity.Customer result columnidentity propertyidentity/result result columnopername propertycustname/result result columnaddress propertyaddress/result result columnphone propertyphone/result result columncareer propertycareer/result /association /resultMap !-- select idgetById resultTypecom.myspring.entity.Rent-- select idgetById resultMaprentMap select * from rent,customer where rent.identity customer.identity and rentid#{rentid} /select /mapperpackage com.myspring; import com.myspring.entity.News; import com.myspring.entity.Rent; import com.myspring.mapper.RentMapper; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class Test1 { public static void main(String[] args) { InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build(resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 RentMapper mapper sqlSession.getMapper(RentMapper.class); SimpleDateFormat simpleDateFormat new SimpleDateFormat(yyyy-MM-dd);//MM大写否则会默认输出是00 Rent rent mapper.getById(R2024001); System.out.println(simpleDateFormat.format(rent.getCreatetime())); System.out.println(rent); System.out.println(rent.getCustomer()); } }三、MyBatis延迟加载延迟加载又叫惰性加载懒加载、按需加载提升程序运行效率的方式。持久层访问数据库原则Java程序和数据库交互频率越低越好MyBatis通过延迟加载来减少Java和数据库交互次数。Class和Student查询Student会将对应的Class数据一并查出。延迟加载的思路如果只是需要Student中的name不调用Class中的那么就只执行一条SQL语句如果需要知道Class相关字段就需要执行两条SQL语句。select * from student where id 1; select * from class where id 2;根据具体的需求动态选择执行SQL的条数。MySQL 关系型数据库ORM框架Object Relationship Mapping)关联关系型数据库和面向对象编程语言3.1 创建实体类package com.myspring.entity; import lombok.Data; import java.util.List; Data public class Class { private Integer id; private String name; private ListStudent students;//一个班级有多个学生 }package com.myspring.entity; import lombok.Data; Data public class Student { private Integer id; private String name; private Class clazz; //关联Class表一个学生只能属于一个班级 }3.2 创建Mapper接口及mapper.xmlpackage com.myspring.mapper; import com.myspring.entity.Class; public interface ClassMapper { public Class getById(Integer id); }?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.ClassMapper select idgetById parameterTypejava.lang.Integer resultTypecom.myspring.entity.Class select * from class where id #{id}; /select /mapperpackage com.myspring.mapper; import com.myspring.entity.Student; public interface StudentMapper { public Student getById(Integer id); }?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.StudentMapper select idgetById parameterTypejava.lang.Integer resultTypecom.myspring.entity.Student select * from student where id #{id}; /select /mapper此时我希望在查询Student字段时cid对应class的值也能被查出来不是2而是对应的“二班”修改StudentMapper.xml文件?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.myspring.mapper.StudentMapper !-- select idgetById parameterTypejava.lang.Integer resultTypecom.myspring.entity.Student-- !-- select * from student where id #{id};-- !-- /select-- resultMap idstudentMap typecom.myspring.entity.Student id columnid propertyid/id result columnname propertyname/result association propertyclazz javaTypecom.myspring.entity.Class columncid selectcom.myspring.mapper.ClassMapper.getById /association /resultMap select idgetById parameterTypejava.lang.Integer resultMapstudentMap select * from student where id #{id} /select /mapper3.3 config.xml文件!--注意是/不是. 写错了会报错找不到;文件名后缀也要带上-- mapper resourcecom/myspring/mapper/StudentMapper.xml/mapper mapper resourcecom/myspring/mapper/ClassMapper.xml/mapper注意修改成对应的数据库名。3.4 测试package com.myspring; import com.myspring.entity.News; import com.myspring.entity.Rent; import com.myspring.entity.Student; import com.myspring.mapper.RentMapper; import com.myspring.mapper.StudentMapper; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; public class Test1 { public static void main(String[] args) { InputStream resourceAsStream Test1.class.getClassLoader().getResourceAsStream(config.xml); SqlSessionFactoryBuilder builder new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory builder.build( resourceAsStream); SqlSession sqlSession sqlSessionFactory.openSession(); //获取Mapper的代理对象 StudentMapper mapper sqlSession.getMapper(StudentMapper.class); Student student mapper.getById(1); System.out.println(student); } }3.5 结果此时我们只想获取student表的信息name不调用class表的。System.out.println(student.getName());仍然会调用两条SQL语句浪费。使用懒加载可以解决该问题。3.6 config.xml中开启懒加载!--懒加载-- setting namelazyLoadingEnabled valuetrue/再次运行看结果只执行了一条SQL语句