Maven

一 Maven

1.1 基本信息

  • Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目模型(POM)
  • POM:项目对象模型
  • im
  • 作用:
    • 项目构建
    • 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
    • 统一开发结构

1.2 下载与安装

  • 环境配置

    image-20220924110519385

    image-20220924110548574

  • cmd运行mvn显示

    image-20220924110619232

    表示成功

1.3 基础概念

二 Maven项目

2.1 创建项目

  • 目录结构

    <img src=(https://myl-mdimg.oss-cn-beijing.aliyuncs.com/TyporaImg/maven.assets/image-20220924115223250.png“ width=”200” height = “300” />

    • resources放配置文件,java放源代码
  • src同层目录下要创建一个pom.xml文件

  • maven项目构建命令

    • mvn compile:编译
    • mvn clean:清理
    • mvn test:测试
    • mvn package:打包
    • mvn install:安装到本地仓库
  • 插件创建工程

    • 创建工程

      1
      2
      3
      4
      5
      mvn archetype:generate
      -DgroupId={project-packaging}
      -DartifactId={project-name}
      -DarchetypeArtifactId=maven-archetype-quickstart
      -DinteractiveMode=false
    • 创建java工程

      1
      2
      3
      mvn archetype:generate -DgroupId=com.ithima -DartifactId=java-project -
      DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -
      DinteractiveMode=false
    • 创建web工程

      1
      2
      3
      mvn archetype:generate -DgroupId=com.ithima -DartifactId=web-project -
      DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -
      DinteractiveMode=false
  • IDEA

2.2 依赖管理

  • 依赖配置

    • 依赖指当前项目运行所需要的jar包,一个项目有多个依赖

    • ```java

      <!-- 设置具体的依赖 ——>
      <dependency>
        <!-- 依赖所属群组 ——>
        <groupId>junit</groupId>
        <!-- 依赖所属项目id ——>
        <artifactId>junit</artifactId>
        <!-- 依赖版本号 ——>
        <version>3.8.1</version>
      </dependency>
      

      </dependencies>

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18

      - 依赖传递:A依赖了B、B依赖了C,则A可以直接使用C(间接依赖)

      - 层级优先:当出现了冲突的时候,以层级确定优先级,层级浅的优先使用
      - 声明优先:先声明的优先

      - 可选依赖:对外隐藏当前所依赖的资源

      - 加一个 `<optional>true</optional>`

      - 排除依赖:不想使用依赖的包所依赖的东西

      - ```
      <exclusions>
      <exclusion>(添加所需要排除的坐标,不写版本,因为会排除所有的版本)</exclusion>
      <exclusion></exclusion>
      <exclusion></exclusion>
      </exclusions>
  • 依赖范围:标签

    • 作用范围:主程序、测试程序范围、是否参与打包
      • image-20220924171225097
    • 依赖范围的传递性:带有依赖范围的资源在进行传递的时候,作用范围将受到影响

三 生命周期与插件

3.1 项目构建生命周期

  • maven构建生命周期描述的是一次构建过程中经历了多少个事件

    • clean:清理工作
      • pre-clean
      • clean
      • post-clean
    • default:核心工作,例如编译、测试、打包、部署等
      • image-20220924172153881
    • site:产生报告,发布站点等

3.2 插件

  • 插件与声明周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
  • 默认maven在各个生命周期上绑定有预设的功能
  • 通过插件可以自定义其他功能

MyBatis

一 hello world

  • maven 3.6.3

  • jdk 1.8

  • mysql 5.1.3

  • junit 4.12

  • mybatis 3.5.7

  • log4j 1.2.17


    Maven xml配置文件如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>MyBatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
    <maven.compiler.source>18</maven.compiler.source>
    <maven.compiler.target>18</maven.compiler.target>
    </properties>

    <dependencies>
    <!-- Mybatis核心 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
    </dependency>

    <!-- junit测试 -->
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
    </dependency>

    <!-- MySQL驱动 -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.3</version>
    </dependency>
    </dependencies>

    </project>

1.2 创建Mybatis核心配置文件

  • 习惯上命名mybatis-config.xml,整合Spring后这个配置文件可以省略

  • 用于配置连接数据库的环境以及MyBatis的全局配置信息

  • 核心配置文件存放的位置是:src/main/resources目录下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "https://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    <!-- 配置连接数据库的环境-->
    <environments default="development">
    <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> 使用本地mysql中名为mybatis的数据库
    <property name="username" value="root"/> 用户名
    <property name="password" value="mysql"/> 密码
    </dataSource>
    </environment>
    </environments>
    <!-- 引入映射文件-->
    <mappers>
    <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
    </configuration>

1.3 创建mapper接口

  • MyBatis中的mapper接口相当于以前的dao,但是区别在于mapper只是接口,不需要提供实现类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package mybatis.mapper;

/**
* User: ManYile
* Date: 2022/10/27
* Description: user类的mapper接口
*/

public interface UserMapper {
/**
* 添加用户信息
*/
int insertUser();
}

1.4 创建MyBatis的映射文件

  • 相关概念:ORM(Object Relationship Mapping)对象关系映射

    • 对象:java的实体类对象
    • 关系:关系型数据库
    • 映射:二者之间的对应关系
  • Mapper文件命名规则:表所对应的实体类的类名+Mapper.xml

    image-20221027165834716

  • 两个一致:

    • 映射文件的namespace要和mapper接口的全类名保持一致;
    • 映射文件中SQL语句的id要和mapper接口中的方法一致
    1
    2
    3
    4
    5
    6
    7
    <mapper namespace="mybatis.mapper.UserMapper"> <!--第一个一致-->
    <!--insertUser()-->
    <insert id="insertUser"><!--第二个一致-->
    insert into t_user values(null, 'admin', '123456', '23', '男', '[email protected]')
    </insert>

    </mapper>

1.5 测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MybatisTest {
@Test
public void testMybatis() throws IOException {
// 加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 获取SqlsessionFactoryBuilder
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build((is));
// 获取SqlSession:代表java程序和数据库之间的会话
SqlSession sqlSession = sqlSessionFactory.openSession(true);//true表示自动commit
// 获取Mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);// 返回了UserMapper的实现类
//测试功能
int result = mapper.insertUser();
// 提交事务
//sqlSession.commit();
System.out.println("result:" + result);
}
}

1.6 加入log4j日志功能

  • pom.xml加入依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>
  • 加入log4j的配置文件

    • 名称是log4j.xml,存放在src/main/resources目录下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
    <param name="Encodind" value="UTF-8"/>
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="[%p][%d{yy-MM-dd}][%c]%m%n "/>
    </layout>
    </appender>
    <logger name="java.sql">
    <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis">
    <level value="info" />
    </logger>
    <root>
    <level value="debug"/>
    <appender-ref ref="STDOUT"/>
    </root>

    </log4j:configuration>

1.7 删改查类似

  • 查询功能必须设置resultType="mybatis.User"或者resultMap

二 核心配置文件标签

  • environment:

    image-20221028104947356

    image-20221028105058724

  • properties

    image-20221028105741318

    image-20221028105802283

  • typeAliases(给类取别名)——不区分大小写

    image-20221028105922894

    image-20221028110038515

    image-20221028111118622

  • mappers

    image-20221028111924668

三 MyBatis获取参数值的方式

  • idea中设置核心配置文件模板

  • idea中设置映射文件模板

    image-20221028150338764

  • 获取参数值的两种方式:(在映射文件中获取Mapper接口中的方法的输入参数,以此来拼接sql语句)

    • ${}:字符串拼接

      • 可能有sql注入
    • #{}:占位符赋值(推荐)(名称任意)

      image-20221028153709643

    • MyBatis获取参数值的各种情况

      • mapper接口方法中的参数为单个的自变量类型:两种方法都可以,但是要注意${}的单引号问题

      • 参数有多个(通过mybatis自动设置的map集合的键值访问)

        image-20221028154229102

        (param1和param2也可以)

        同样的${}需要加单引号

      • 参数为map集合

        image-20221028154622626

        image-20221028154715640

        image-20221028154757938

        image-20221028154806995

        这样就可以用自己设置的键了

      • mapper接口中的方法的参数是一个实体类image-20221028155045586

      • 使用@param注解命名参数(常用)

        image-20221028155814928

        • 此时将参数放在一个map集合中

          image-20221028155745013

四 Mybatis各种查询功能

  • 查询多个结果应用集合存储

  • 获取自增主键

    • useGeneratedKeys=true:设置当前标签中的sql使用了自增的id

    • keyProperty='id':将自增的id

      image-20221029112441026

  • 字段名和属性名不一致

    • 方法1:为字段起别名,保持和属性名的一致

      image-20221029135321071

      (表中字段为emp_name,类中对应empName,通过对字段起别名来保持和属性名一致)

    • 方法2:设置mybatis-config.xml中的settings标签,将_映射为驼峰

    • 方法3:resultMap(resultType只能解决字段名和属性名相同的情况)

      image-20221029140032396

      image-20221029140101945

      注:

      • 主标签中的id是唯一标识,不能重复,type是设置映射关系中的实体类类型

      • 子标签中的id设置主键映射,result设置普通字段的映射,所有的字段都需要设置,即使他们和属性中的名称一致

      • 子标签中的property是实体类中属性,column是表中的字段
  • 处理多对一映射关系

    • 方法1:级联属性赋值

      image-20221029141529020

    • 方法2:通过association:专门处理多对一的映射

      image-20221029141817073

      注:

      • 主标签中的property是需要处理多对的映射关系属性名,javaType是该属性的类型
      • 子标签中的其他的类似
    • 方法3:分步查询(用的多)

      • 可以实现延迟加载

        image-20221029142822041

五 自定义映射resultMap

  • 用于处理类中属性名和表中字段名不一致的情况