05.MyBatis自定义映射resultMap

[TOC]前言如果从数据库查询出来的数据无法直接映射到实体类对象,那么就可以通过自定义映射来解决这个问题。一、准备工作1.1 创建表创建两个员工表格t_emp和t_dept职员表(t_emp)CREATE TABLE `t_emp` ( `eid` int(11) NOT NULL AUTO_INCREMENT, `emp_name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `sex` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT N...

Java 2022-12-08 AM 9℃ 0条

04.MyBatis特殊SQL执行

[TOC]一、模糊查询1.1 概述模糊查询使用通配符%(可以匹配任意个数字符)或通配符_(匹配一个任意字符)将查询信息进行模糊匹配,使用like关键字进行匹配查询,通过通配符前置、后置或前后置可以查询与部分信息匹配的数据。示例+----+--------+ | id | name | +----+--------+ | 1 | JONES | | 2 | SCOTT | | 3 | FORD | +----+--------+ -- 示例一:找出名字中含有O的? select name from emp where name like '%O%'; -- 示例二:找...

Java 2022-12-07 PM 11℃ 0条

03.MyBatis各种查询功能

[TOC]前言使用Mybatis进行查询的时候,查询出来的数据可能有一条数据,也可能是多条,我们就得根据返回数据的条数来指定返回类型,如果记录是多条,那么返回值类型就不能是实体类。如果查询出的数据只有一条,可以通过:实体类对象接收List集合接收Map集合接收,结果{password=123456, sex=男, id=1, age=23, username=admin}如果查询出的数据有多条,一定不能用实体类对象接收,会抛异常TooManyResultsException,可以通过:实体类类型的List集合接收Map类型的List集合接收在mapper接口的方法上添加@MapKey注解...

Java 2022-12-06 PM 14℃ 0条

02.MyBatis获取参数值的两种方式

[TOC]一、获取参数值的方式MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。二、单个字面量类型的参数若mapper接口中的方法参数为单个的字面量类型(只有一个参数值),此时可以使用${}和#{}以任意的名称(最好见名识意)获取参数的值注意${}需要手动加单引号#{}方式<!--User getUserByUsername(Str...

Java 2022-12-05 PM 12℃ 0条

01.MyBatis核心配置文件详解

[TOC]前言Mybatis配置文件两大类:Mybatis 主配置文件:提供 Mybatis 全局设置的。包含的内容、日志、数据源、mapper 文件位置等信息。Mybatis 的 mapper 文件:用来写SQL语句。一个表/Mapper接口一个 mapper 文件。一、概述MyBatis的核心配置文件配置了MyBatis的一些全局信息,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和影响MyBatis行为的一些属性。这些信息通常在一个项目中只会在一个配置文件中编写,并且编写后也不会轻易更改。虽然在实际项目中需要开发人员编写或者修改的配置文件不多,但是熟悉配置文件中各...

Java 2022-12-04 PM 16℃ 0条

58.CyclicBarrier介绍

[TOC]一、概述CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。这个屏障之所以用循环修饰,是因为在所有的线程释放彼此之后,这个屏障是可以重新使用的(reset()方法重置屏障点),这一点与CountDownLatch不同。特点CyclicBarrier是一种同步机制允许一组线程相互等待,等到所有线程都到达一个屏障点才退出await方法,它没有直接实现AQS而是借助ReentrantLock来实现的同步机...

Java 2022-12-03 PM 21℃ 0条

57.CountdownLatch介绍

[TOC]一、概述CountDownLatch(倒计时锁) 能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。它相当于是一个计数器,这个计数器的初始值就是线程的数量,每当一个任务完成后,计数器的值就会减一,当计数器的值为 0 时,表示所有的线程都已经任务了,然后在 CountDownLatch 上等待的线程就可以恢复执行接下来的任务。应用场景典型的应用场景就是当一个服务启动时,同时会加载很多组件和服务,这时候主线程会等待组件和服务的加载。当所有的组件和服务都加载完毕后,主线程和其他线程在一起完成某个任务。二、常用方法方法说明CountDownLatch(int count)c...

Java 2022-12-01 PM 26℃ 0条

56.Semaphore介绍

[TOC]一、概述Semaphore是向外分发资源的许可证,可以允许一个或多个任务同时访问资源。Semaphore通过构造参数来指定许可证的数量;acquire方法阻塞式获取许可证;release方法释放许可证。可以将其比喻为地铁的安检,每当人流量高峰的时候,安检会先让几个人进去,然后拦住后面的人,待前面几人通过安检门后,会对后面的人用相同的方式放行。特点Semaphore(信号量)是一种计数器,用来保护一个或者多个共享资源的访问。如果线程要访问一个资源就必须先获得信号量。如果信号量内部计数器大于0,信号量减1,然后允许共享这个资源;否则,如果信号量的计数器等于0,信号量将会把线程置入休...

Java 2022-11-29 PM 27℃ 0条

55.StampedLock介绍

[TOC]前言ReadWriteLock适用于读多写少的场景,允许多个线程同时读取共享变量。但在读多写少的场景中,还有更快的技术方案。在jdk8以后,java提供了一个性能更优越的读写锁并发类StampedLock,该类的设计初衷是作为一个内部工具类,用于辅助开发其它线程安全组件,用得好,该类可以提升系统性能,用不好,容易产生死锁和其它莫名其妙的问题。本文主要和大家一起学习下StampedLock的功能和使用。一、StampedLock概述StampedLock 是读写锁的实现,对比 ReentrantReadWriteLock 主要不同是该锁不允许重入,多了乐观读的功能,使用上会更加复...

Java 2022-11-28 PM 29℃ 0条

54.ReentrantReadWriteLock实现原理详解

[TOC]一、ReentrantReadWriteLock简单流程1.1 独占获取锁简单流程独占获取锁流程独占锁获取(writeLock写锁),首先判断是否有线程获取了锁,是否有线程获取了锁的判断通过读写锁中通过32位int类型state可以获取,其中低16位表示读锁,高16表示写锁。有读锁:直接排队阻塞。有写锁:还需要判断写锁线程是否是自己,如果是自己就是锁重入了,如果不是自己说明已经有其他的线程获取锁正在执行,那么当前线程需要排队阻塞。无锁:直接获取锁,其他抢占的独占锁线程需要排队阻塞,当前线程执行完毕后释放锁通知下一个排队线程获取锁。1.2 共享获取锁简单流程共享锁获取锁流程独占锁...

Java 2022-11-28 PM 37℃ 0条