Mybatis简介

MyBatis历史

  • MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github

  • iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)

MyBatis特性

  1. MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架

  2. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集

  3. MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录

  4. MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架

1、在Maven项目中使用Mybatis

  先创建一个普通的Maven项目,然后在pom.xml文件中引入Mybatis的依赖,因为要连接数据库,所以还需要引入数据库连接的依赖

 1 <dependencies>
2 <dependency>
3 <groupId>org.mybatis</groupId>
4 <artifactId>mybatis</artifactId>
5 <version>3.5.10</version>
6 </dependency>
7 <dependency>
8 <groupId>mysql</groupId>
9 <artifactId>mysql-connector-java</artifactId>
10 <version>8.0.33</version>
11 </dependency>
12 </dependencies>

  要使用Mybatis需要配置Mybatis的核心配置,在resources资源文件夹下创建一个mybatis配置文件(名字随意),并写入配置,配置参考Mybatis官方文档mybatis – MyBatis 3 | 入门

 

 在数据源<dataSource>的配置中,配置好driver,url,username,password

 1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4 "https://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6 <environments default="development">
7 <environment id="development">
8 <transactionManager type="JDBC"/>
9 <dataSource type="POOLED">
10 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
11 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/>
12 <property name="username" value="root"/>
13 <property name="password" value="root"/>
14 </dataSource>
15 </environment>
16 </environments>
17 <!--<mappers>
18 <mapper resource="org/mybatis/example/BlogMapper.xml"/>
19 </mappers>-->
20 </configuration>

  习惯上命名为mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。 核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息 核心配置文件存放的位置是src/main/resources目录下

  现在需要一个数据库和表和一些数据用做连接测试

 1 CREATE DATABASE IF NOT EXISTS `mybatis` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2
3 CREATE TABLE USER(
4 `id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
5 `name` VARCHAR(100) COMMENT '姓名',
6 `age` TINYINT UNSIGNED COMMENT '年龄',
7 `gender` TINYINT UNSIGNED COMMENT '性别, 1:男, 2:女',
8 `phone` VARCHAR(11) COMMENT '手机号'
9 ) COMMENT '用户表';
10
11 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'白眉鹰王',55,'1','18800000000');
12 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'金毛狮王',45,'1','18800000001');
13 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'青翼蝠王',38,'1','18800000002');
14 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'紫衫龙王',42,'2','18800000003');
15 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'光明左使',37,'1','18800000004');
16 INSERT INTO USER(id, NAME, age, gender, phone) VALUES (NULL,'光明右使',48,'1','18800000005');

  构建整体项目结构controller、service、mapper三层架构,创建一个实体类对应数据库的表结构,创建MyBatis的映射文件xxxMapper.xml

  • 映射文件的命名规则

  • 表所对应的实体类的类名+Mapper.xml

    • 例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml

    • 因此一个映射文件对应一个实体类,对应一张表的操作

    • MyBatis映射文件用于编写SQL,访问以及操作表中的数据

    • MyBatis映射文件存放的位置是src/main/resources/mappers目录下

在resources文件目录下创建mapper的时候需要和main文件目录下的mapper同包名,在创建directory的时候,目录结构不能使用点,而是用/代替

User实体类中的属性需要和表中的字段名相对应,这里也可以用Lombok注解

  mapper接口的全类名和映射文件的命名空间(namespace)保持一致、mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

  然后在mapper中写我们需要的语句,查询语句用<select>、增加语句用<insert>、删除语句用<delete>、修改语句用<update>标签,返回类型resultType要和实体类中的实体类名称对应

 1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6 <mapper namespace="mapper.UserMapper">
7
8 <select id="selectAll" resultType="pojo.User">
9 SELECT id, name, age, gender, phone FROM user
10 </select>
11 </mapper>

  写好了之后回到mybatis-config.xml中配置一下mapper映射

  在UserMapper中将UserMapper.xml中配置好的方法声明一下,方法名要和上面的id对应上

  在service层写好业务逻辑代码,在接口中声明方法,在实现类中实现方法

 1 public class UserServiceImpl implements UserService {
2
3 @Override
4 public List<User> selectAll() throws IOException {
5 //读取MyBatis的核心配置文件
6 InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
7 //获取SqlSessionFactoryBuilder对象
8 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
9 //通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
10 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
11 //获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务
12 SqlSession sqlSession = sqlSessionFactory.openSession();
13 //通过代理模式创建UserMapper接口的代理实现类对象
14 UserMapper mapper = sqlSession.getMapper(UserMapper.class);
15 //调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句
16 List<User> users = mapper.selectAll();
17 return users;
18 }
19 }

  在controller层中写好处理结果代码

1 public class UserController {
2 private UserService userService = new UserServiceImpl();
3
4 public void selectAll() throws IOException {
5 List<User> users = userService.selectAll();
6 users.forEach(System.out::println);
7 }
8 }

  创建一个Test类去测试mybatis数据库连接,因为没有引入单元测试依赖,所以这里用主函数去测试

  发现结果成功输出打印

  

  如果SQL语句比较简单,可以使用mybatis中的注解,查询语句用@Select、增加语句用@Insert、删除语句用@Delete、修改语句用@Update注解

在里面写上sql语句,再运行发现,也可以查询成功。

  当然,复杂一点的sql语句和动态SQL建议还是使用Mapper配置,只是简单的sql语句写在注解里面可以简化,复杂的sql只会增加代码的复杂度

总结

  在Maven项目中,使用mybatis需要先导入mybatis依赖和连接数据库的依赖,然后创建mybatis配置文件,在配置文件中配置数据源细信息,随后创建MyBatis的映射文件Mapper,在mapper文件中写好对应的语句,然后在业务层进行SqlSession连接,调用mapper中的方法,再在controller层处理返回方法。

2、用Spring框架整合Mybatis

  同样的先创建一个Maven项目,然后在pom.xml文件中引入Spring的依赖,Mybatis的依赖,数据库连接依赖,druid连接池依赖,spring-mybatis依赖,spring-jdbc依赖。

 1 <dependencies>
2 <dependency>
3 <groupId>org.mybatis</groupId>
4 <artifactId>mybatis</artifactId>
5 <version>3.5.10</version>
6 </dependency>
7 <dependency>
8 <groupId>mysql</groupId>
9 <artifactId>mysql-connector-java</artifactId>
10 <version>8.0.33</version>
11 </dependency>
12 <dependency>
13 <groupId>org.springframework</groupId>
14 <artifactId>spring-context</artifactId>
15 <version>5.3.30</version>
16 </dependency>
17 <dependency>
18 <groupId>com.alibaba</groupId>
19 <artifactId>druid</artifactId>
20 <version>1.2.20</version>
21 </dependency>
22 <dependency>
23 <groupId>org.mybatis</groupId>
24 <artifactId>mybatis-spring</artifactId>
25 <version>1.3.2</version>
26 </dependency>
27 <dependency>
28 <groupId>org.springframework</groupId>
29 <artifactId>spring-jdbc</artifactId>
30 <version>5.3.2</version>
31 </dependency>
32 </dependencies>

  构建整体项目结构

2.1、基于XML整合Mybatis

  • 导入Mybatis整合Spring的相关坐标
  • 编写Mapper和Mapper.xml
  • 配置SqlSessionFactoryBean和MapperScannerConfigurer
  • 编写测试代码

  

  和上面步骤相同,编写Mapper和Mapper.xml,一定要放在相同路径下

  

  在UserMapper.xml中写我们需要的语句,并在UserMapper接口中写对应id的方法声明;

 1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
5
6 <mapper namespace="mapper.UserMapper">
7
8 <select id="selectAll" resultType="pojo.User">
9 SELECT id, name, age, gender, phone FROM user
10 </select>
11 </mapper>
public interface UserMapper {

    List<User> selectAll();
}

  同样的,简单的SQL语句也可以用@Select注解编写,不需要UserMapper.xml配置   

  在Spring配置文件中配置SqlSessionFactoryBean

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6 <!--配置SqlSessionFactoryBean,作用将SqlSessionFactory存储到spring容器-->
7 <bean class="org.mybatis.spring.SqlSessionFactoryBean">
8 <property name="dataSource" ref="dataSource"></property>
9 </bean>
10
11 <!--配置数据源信息-->
12 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
13 <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
14 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"></property>
15 <property name="username" value="root"></property>
16 <property name="password" value="root"></property>
17 </bean>
18 </beans>

  对应的是之前配置文件中的

1  <dataSource type="POOLED">
2 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
3 <property name="url" value="jdbc:mysql://localhost:3307/mybatis"/>
4 <property name="username" value="root"/>
5 <property name="password" value="root"/>
6 </dataSource>

  在Spring配置文件中配置MapperScannerConfigurer

1 <!--MapperScannerConfigurer,作用扫描指定的包,产生Mapper对象存储到Spring容器-->
2 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
3 <property name="basePackage" value="mapper"></property>
4 </bean>

  对应的是

1 <mappers>
2 <package name="com.tedu.mapper"/>
3 </mappers>

  在Spring配置文件中配置好之后,在使用的时候就不用手动创建了,直接注入即可。

  在UserServiceImpl属性中添加UserMapper,并为其添加setter方法用于注入。

 1 public class UserServiceImpl implements UserService {
2 private UserMapper userMapper;
3
4 public void setUserMapper(UserMapper userMapper) {
5 this.userMapper = userMapper;
6 }
7
8 @Override
9 public List<User> selectAll() {
10 return userMapper.selectAll();
11 }
12 }

  同样,在UserController属性中添加UserService,并为其添加setter方法用于注入。在selectAll方法中处理返回的结果。

 1 public class UserController {
2 private UserService userService;
3
4 public void setUserService(UserService userService) {
5 this.userService = userService;
6 }
7
8 public void selectAll(){
9 List<User> users = userService.selectAll();
10 users.forEach(System.out::println);
11 }
12 }

  在Spring配置文件中配置上述UserService和UserController用于注入

1 <bean id="userServiceImpl" class="service.impl.UserServiceImpl">
2 <property name="userMapper" ref="userMapper"></property>
3 </bean>
4
5 <bean id="userContorller" class="controller.UserController">
6 <property name="userService" ref="userServiceImpl"></property>
7 </bean>

  最后创建一个测试类进行数据库连接测试

1 public class TestSelectAll {
2 public static void main(String[] args) {
3 ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
4 UserController userController = context.getBean(UserController.class);
5 userController.selectAll();
6 }
7 }

  可以在控制台看到打印的结果

总结

  基于XML方式整合Mybatis首先需要创建Spring的配置文件,在XML配置文件中去配置bean,将bean对象交由Spring容器管理,其余的mapper和普通方法一样。需要配置数据源DataSource,配置SqlSessionFactoryBean、配置MapperScannerConfigurer,再配置UserMapper、UserService和UserController。在测试类中用ClassPathXmlApplicationContext和getBean获取到UserContorller对象再调用其方法即可。这种方式不用编写mybatis-config.xml配置文件,在Spring配置文件中全部配置了,虽然简化了部分操作,但是还是较为繁琐,下面讲一种用注解方式整合mybatis。

2.2、基于注解整合Mybatis

  导入和上述基于XML整合mybatis方法相同的依赖

  再构建同样的项目结构

  还需要在resources资源目录下面添加一个配置文件用于存放数据源配置信息

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3307/mybatis

  除了像上面方法构建的项目结构之外,还需要一个配置类进行配置

 1 @Configuration
2 @ComponentScan("cn.test")
3 @PropertySource("classpath:jdbc.properties")
4 @MapperScan("cn.test.mapper")
5 public class MybatisConfig {
6
7 @Bean
8 public DataSource dataSource(
9 @Value("${jdbc.driver}") String driver,
10 @Value("${jdbc.username}") String username,
11 @Value("${jdbc.password}") String passwrod,
12 @Value("${jdbc.url}") String url
13 ){
14 DruidDataSource dataSource = new DruidDataSource();
15 dataSource.setDriverClassName(driver);
16 dataSource.setUsername(username);
17 dataSource.setPassword(passwrod);
18 dataSource.setUrl(url);
19 return dataSource;
20 }
21
22 @Bean
23 public SqlSessionFactoryBean sqlSessionFactoryBean(@Autowired DataSource dataSource){
24 SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
25 sqlSessionFactoryBean.setDataSource(dataSource);
26 return sqlSessionFactoryBean;
27 }
28 }

  @Configuration注解是声明该类是一个配置类

  @ComponentScan注解是包扫描,扫描该包和该包的子孙包中的类带有@Component注解的类,交由Spring容器管理

  @PropertySource注解是设置资源文件目录,classpath后是properties文件的路径,加载后可以用${}占位符获取properties文件中的属性

  @MapperScan注解是设置Mapper文件扫描,相当于mybatis配置文件中<mapper>标签

  配置文件中用@Bean注解配置非自定义Bean的配置,在dataSource方法中传入连接数据库四要素并且用@Value注解去注入值,其中用${}占位符获取properties文件中的属性,最后方法返回dataSource,同样的用sqlSessionFactoryBean方法sqlSessionFactoryBean,在参数中用@AutoWried注入dataSource参数,其中@AuroWired注解可省略,最后方法返回sqlSessionFactoryBean。

  这样,在Config配置文件中就完成了SqlSessionFactoryBean和MapperScannerConfigurer的配置

  接下来就是编写UserMapper和UserMapper.xml文件,这里就不在用XML配置文件进行演示,如需要,上面的其他方法都有演示,这里就用注解的方式编写SQL语句。

  随后,编写三层架构的代码,在UserController中,用@AuroWired注解自动注入UserService,并且在类上加上@Controller注解,表示该类是Contriller层类并交由Spring容器管理

 1 @Controller
2 public class UserController {
3 @Autowired
4 private UserService userService;
5
6 public void findAll() {
7 List<User> all = userService.findAll();
8 all.forEach(System.out::println);
9 }
10 }

  在UserServiceImpl中用,@AuroWired注解自动注入UserMapper,并且在类上加上@Service注解,表示该类是Service层类并交由Spring容器管理

 1 @Service
2 public class UserServiceImpl implements UserService {
3
4 @Autowired
5 private UserMapper userMapper;
6 @Override
7 public List<User> findAll() {
8 return userMapper.findAll();
9 }
10 }

  在UserMapper中,编写SQL方法,用@Select注解编写SQL语句,因为在配置文件中加了@MapperScan("cn.test.mapper")注解,所以在此类上不需要加任何Component注解

1 public interface UserMapper {
2 @Select("SELECT id, name, age, gender, phone FROM user")
3 List<User> findAll();
4 }

  最后,编写测试方法进行数据库连接测试

1 public class TestAnnoMyBatis {
2 public static void main(String[] args) {
3 ApplicationContext context = new AnnotationConfigApplicationContext(MybatisConfig.class);
4 UserController userController = context.getBean(UserController.class);
5 userController.findAll();
6 }
7 }

  在测试方法中用AnnotationConfigApplicationContext方法加载MybatisConfig配置文件,同样在控制台中可以看到成功输出结果

总结

  基于注解整合Mybatis方法中,我们不需要配置任何XML文件,其他操作基本相同,只需要新增一个配置文件,在配置文件中用一些注解和方法去完成配置。同时,在管理Bean时,也是用注解去自动装配,交由Spring容器去管理。大大简化了配置。

3、SpringBoot整合Mybatis

  用SpringBoot框架整合Mybatis相对就较为简单了

  首先创建于一个SpringBoot项目

  

  在勾选依赖的时候,需要勾选MyBatisFarmework依赖和MySql依赖进行数据的连接和Mybatis的使用

  创建完成之后在application.properties配置文件中配置数据源

spring.datasource.url=jdbc:mysql://localhost:3307/mybatis?serverTimezone=Asia/Shanghai&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

  然后在UserMapper中开始写SQL语句

1 @Mapper
2 public interface UserMapper {
3
4 @Select("SELECT id, name, age, gender, phone FROM user")
5 List<User> userList();
6 }

  一定要在UserMapper类上加上@Mapper注解,@Mapper注解是识别他为mybatis的mapper接口,会自动的把 加@Mapper 注解的接口生成动态代理类。

  同样的,在UserService中用@AutoWired对UserMapper进行注入,并在该类上加上@Service注解

1 @Service
2 public class UserServiceImpl implements UserService {
3 @Autowired
4 private UserMapper userMapper;
5
6 public List<User> userList(){
7 return userMapper.userList();
8 }
9 }

  在UserController中用@AutoWired对UserService进行注入并处理返回的结果,并在该类上加上@Controiller注解

 1 @Controller
2 public class UserController {
3 @Autowired
4 private UserService userService;
5
6 public void userList(){
7 List<User> users = userService.userList();
8 users.forEach(System.out::println);
9 }
10 }

  最后在SpringBoot的测试类中写一个测试方法进行数据库连接的测试

 1 @SpringBootTest
2 class SpringBootMybatisApplicationTests {
3
4 @Autowired
5 private UserController userController;
6 @Test
7 public void test(){
8 userController.userList();
9 }
10
11 }

  可以看到控制台成功输出结果

总结

  使用SpringBoot框架整合Mybatis更为简单,只需要在application.properties配置文件中配置数据源四要素就行,随后就可以直接在Mapper中写SQL语句,最后可以在SpringBootTest类中直接进行测试。

Mybatis和其他主流框架的整合使用的更多相关文章

  1. SSM,即Spring+SpringMVC+MyBatis三个开源框架的整合框架集。

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻 ...

  2. myBatis,Spring,SpringMVC三大框架ssm整合模板

    整合步骤 创建web工程 导入整合所需的所有jar包 编写各层需要的配置文件 1) mybatis的全局配置文件 <configuration>    <!-- 批量别名的设置 -- ...

  3. JAVA主流框架---SSM整合

      1.通过监听器的形式引入spring 2.SpringMVC容器和Spring容器间的关系 3.汇通的主旨 让大家熟练掌握SSM调用过程.并且将后台调用彻底掌握. 4.传统项目的搭建的弊端 1.传 ...

  4. 【转】SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    原文地址:http://blog.csdn.net/zhshulin/article/details/37956105 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了, ...

  5. [置顶] Java Web学习总结(24)——SSM(Spring+SpringMVC+MyBatis)框架快速整合入门教程

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One  ...

  6. SSM框架——具体整合教程(Spring+SpringMVC+MyBatis)

    使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了.项目在技术上已经没有什么难点了,基于现有的技术就能够实现想要的功能.当然肯定有非常多能够改进的地方.之前没有记录SSM整 ...

  7. SSM(spring,springMVC,Mybatis)框架的整合

    这几天想做一个小项目,所以搭建了一个SSM框架. 1.基本概念 1.1.Spring   Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Joh ...

  8. java 一款可以与ssm框架完美整合的web报表控件

    硕正套件运行于客户端(浏览器),与应用服务器(Application Server)技术无关,所以能完全用于J2EE. ASP.Net.php等技术开发的Web应用产品中. 硕正套件部署于服务器,支持 ...

  9. Mybatis六(SSM框架)

    SSM三大框架整合详细教程(SPRING+SPRINGMVC+MYBATIS) 使用 SSM ( Spring . SpringMVC 和 Mybatis )已经有三个多月了,项目在技术上已经没有什么 ...

  10. SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)

    1.前言 使用框架都是较新的版本: Spring 4.0.2 RELEASE Spring MVC 4.0.2 RELEASE MyBatis 3.2.6 2.Maven引入需要的JAR包 2.1设置 ...

随机推荐

  1. KVM 虚拟机 热插拔硬盘

    新建硬盘 lvm 命令 lvcreate -L 200G -n lv02 ssd01 qemu-img 命令 qemu-img create -f raw test1G.raw 1G dd 命令 dd ...

  2. js闭包的一些笔记

    闭包 闭包是一个可以访问外部作用域的内部函数,即使这个外部作用域已经执行结束 作用域 作用域决定这个变量的生命周期及其可见性.当我们创建一个函数,就会生成一个新的作用域. 通过var创建的变量只有函数 ...

  3. 【技术实战】Vue技术实战【三】

    需求实战一 效果展示 代码展示 <template> <div style="display: flex;"> <div style="di ...

  4. opencv-python中 boundingRect(cnt)以及cv2.rectangle用法

    矩形边框(Bounding Rectangle)是说,用一个最小的矩形,把找到的形状包起来.还有一个带旋转的矩形,面积会更小,效果见下图 首先介绍下cv2.boundingRect(img)这个函数 ...

  5. NOI2023 题解

    打的太 shaber 了,于是补补题. D1T1 扫描线. 首先我们可以容斥一下,答案为被一种操作覆盖到的减去被两种操作覆盖到的加上被三种操作覆盖到的. 首先考虑只被一种操作覆盖到的,这很简单,直接上 ...

  6. JDK中「SPI」原理分析

    目录 一.SPI简介 1.概念 2.入门案例 2.1 定义接口 2.2 两个实现类 2.3 配置文件 2.4 测试代码 二.原理分析 1.ServiceLoader结构 2.iterator迭代方法 ...

  7. 【腾讯云 Cloud Studio 实战训练营】提升开发效率与协作:探索腾讯云 Cloud Studio 的强大功能与优势

    一.前言 前几天发生了一个故事,发生了这样一个情景:一位新加入的同事刚刚入职不久,领取了一台崭新的电脑.随后,他投身于一个新项目,但却遇到了一个困扰:由于这台电脑没有管理员权限,他无法在上面安装所需的 ...

  8. Nep2023的wp

    0x00 闲言碎语 2023.8.14 记录11-13的紧张刺激.46名结赛. 非常高兴能够参加NepCTF2023,以一个初出茅庐的新人的身份参加.ctf的乐趣在于学习和探索,同时我也有想证明自己的 ...

  9. JNDI注入的本地搭建和分析

    JNDI注入的本地搭建和分析   JNDI概述 JNDI(The java Naming and Directory Interface,java命名和目录接口)是一组在Java应用中访问命名和目录服 ...

  10. 几种常用到的 Hybrid App 技术框架

    移动操作系统在经历了诸神混战之后,BlackBerry OS.Symbian OS.Windows Phone 等早期的移动操作系统逐渐因失去竞争力而退出.目前,市场上主要只剩下安卓和 iOS 两大阵 ...