当前位置: 首页 > news >正文

【Java框架】知识点汇总Day2:MyBatis(含集合基础)(持续更新)

一、集合

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)判断集合中是否存在key
boolean containsValue(Object value)判断集合中是否存在value
V get(Object key)通过key取出对应的value
V put(Object key,Object value)向集合中添加一组key-value
V remove(Object key)通过key删除集合元素
void clear()清空集合
Set keySet()取出所有的key,返回set
Collection values()取出所有的value,返回Collection
Set 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"));//通过key:h取出对应的value:Hello 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线程不安全。

二、MyBatis

2.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 List<News> list();
//查询 NewsMapper mapper = sqlSession.getMapper(NewsMapper.class); List<News> list = mapper.list(); for(News news : list){ System.out.println(news); }
  • 多表联查

原始数据:identity opername

业务逻辑:创建customer对象,将identity opername的值分别赋值给customer对象

  • rent.identitycustomer.identity(关联字段,值相同)

  • rent.opernamecustomer.custname

package 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 version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.myspring.mapper.RentMapper"> <resultMap id="rentMap" type="com.myspring.entity.Rent"> <id column="rentid" property="rentid"></id> <result column="price" property="price"></result> <result column="begindate" property="begindate"></result> <result column="returndate" property="returndate"></result> <result column="carnumber" property="carnumber"></result> <result column="createtime" property="createtime"></result> <association property="customer" javaType="com.myspring.entity.Customer"> <result column="identity" property="identity"></result> <result column="opername" property="custname"></result> <result column="address" property="address"></result> <result column="phone" property="phone"></result> <result column="career" property="career"></result> </association> </resultMap> <!-- <select id="getById" resultType="com.myspring.entity.Rent">--> <select id="getById" resultMap="rentMap"> select * from rent,customer where rent.identity = customer.identity and rentid=#{rentid} </select> </mapper>
package 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 List<Student> 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.xml

package com.myspring.mapper; import com.myspring.entity.Class; public interface ClassMapper { public Class getById(Integer id); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.myspring.mapper.ClassMapper"> <select id="getById" parameterType="java.lang.Integer" resultType="com.myspring.entity.Class"> select * from class where id = #{id}; </select> </mapper>
package com.myspring.mapper; import com.myspring.entity.Student; public interface StudentMapper { public Student getById(Integer id); }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.myspring.mapper.StudentMapper"> <select id="getById" parameterType="java.lang.Integer" resultType="com.myspring.entity.Student"> select * from student where id = #{id}; </select> </mapper>

此时我希望,在查询Student字段时,cid对应class的值也能被查出来(不是2,而是对应的“二班”),修改StudentMapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.myspring.mapper.StudentMapper"> <!-- <select id="getById" parameterType="java.lang.Integer" resultType="com.myspring.entity.Student">--> <!-- select * from student where id = #{id};--> <!-- </select>--> <resultMap id="studentMap" type="com.myspring.entity.Student"> <id column="id" property="id"></id> <result column="name" property="name"></result> <association property="clazz" javaType="com.myspring.entity.Class" column="cid" select="com.myspring.mapper.ClassMapper.getById"> </association> </resultMap> <select id="getById" parameterType="java.lang.Integer" resultMap="studentMap"> select * from student where id = #{id} </select> </mapper>

3.3 config.xml文件

<!--注意:是/不是. 写错了会报错:找不到;文件名后缀也要带上--> <mapper resource="com/myspring/mapper/StudentMapper.xml"></mapper> <mapper resource="com/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 name="lazyLoadingEnabled" value="true"/>

再次运行看结果:只执行了一条SQL语句

http://www.jsqmd.com/news/941799/

相关文章:

  • 3PEAK思瑞浦 TP1564AL1-TR TSSOP14 运算放大器
  • 深圳翡翠回收:2026年实地走访,行家甄选,六大机构各有专长 - 薛定谔的梨花猫
  • 抖音下载神器:免费批量下载视频、直播回放与图集的终极指南
  • Git 分支merge合并常用步骤与命令操作
  • 5分钟搭建Python股票数据分析系统:MOOTDX让你轻松玩转通达信数据
  • 匠选:变压器吊装公司推荐榜 - 品牌推广大师
  • 题解:P10121 『STA - R4』保险丝
  • 泰和县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • 免费Windows虚拟显示器终极指南:如何轻松扩展多屏工作空间
  • 2026玻璃钢储罐厂家实测盘点 多场景化工环保罐体选型参考指南 - GrowthUME
  • Meta AI 助力黑客攻击,多知名 Instagram 账号被盗,开启 MFA 可防范
  • 铜鼓县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • 手把手实战:用PyTorch复现MIMO-UNet图像去模糊(从数据准备到模型训练全流程)
  • NBTExplorer:从数据黑盒到可视化操控,解密《我的世界》游戏数据的终极方案
  • AI Agent 面试题 900:数据分析Agent的异常检测和根因分析能力
  • 从论文到生产:Tianjin_Ascend/Roberta-base-emotion模型训练全流程解析
  • 2026来宾房屋漏水不用愁!一修修缮免费上门检测,本地专业防水公司常年TOP1!卫生间免砸砖防水,快速解决您的烦恼。权威!靠谱!稳定!售后无忧!!! - 一修哥咨询
  • 如何用Scarab模组管理器一键解锁空洞骑士无限可能:完整指南
  • 微信不记名投票怎么发起的?火星投票3分钟搞定|2026零广告防刷实测 - 微信投票小程序
  • Linux系统篇(一):从零入门操作系统:冯诺依曼体系到进程的完整理解
  • 虚拟环境的配置
  • 万安县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • 2026江浙沪企业团建攻略!天目湖涵田全系度假村优势详解 - 资讯速览
  • 动态自编码器TRAESOLO解析
  • 别再只跑鲁大师了!新电脑验货,看懂设备管理器和任务管理器里的“门道”
  • UE5项目上线前必做:如何安全清理GEngine调试消息,避免性能泄露与信息暴露
  • Java 程序员第 41 阶段03:企业智能问答机器人落地,搭建内部智能客服系统,多轮对话与意图识别实现
  • 扬州本地家电维修师傅电话推荐|本地维修家电|欧米到家统一报修 - 欧米到家
  • 从黑盒到白盒:严谨软件工程的三大支柱与实践指南
  • 万年县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化