【Java企业级开发】(六)Java框架技术-Maven和MyBatis

发布于:2025-07-24 ⋅ 阅读:(23) ⋅ 点赞:(0)

  一、Maven

1.1 非Maven项目的缺点

问题一:

        项目中的jar包资源需要我们自己从网上下载后,手动导入到项目中使用,不好管理

问题二:

        jar包版本控制麻烦

1.2 Maven介绍

        Maven是使用Java语言编写的基于项目对象模型(POM)项目管理工具软件。开发者可以通过一小段描述信息来管理项目构建、报告和文档。使用Maven可以更好的帮助我们完成项目的管理。

1.3 Maven仓库

        中央仓库(Central Repository):Maven官方服务器。里面存放了绝大多数市面上流行的jar。允许用户政策后,上传自己的项目到官方服务器。网址在国外,经常访问不了。

https://mvnrepository.com/https://mvnrepository.com/        镜像仓库(Mirror Repository):对于国内来说,访问国外的Maven仓库会特别慢。镜像仓库就是另一台备份/复制了中央仓库的服务器。平时使用时国内开发者多使用阿里云镜像或华为云镜像,这样可以大大提升从中央仓库下载资源的速度。但它的角色仍然是一个远程库。

        本地仓库(Local Repository):本机的文件夹作为本地仓库,本地仓库指本机的一份拷贝,用来缓存远程下载,包含你尚未发布的临时构件。

1.4 Maven的资源坐标

<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.3.0</version>
</dependency>

GroupId:一般是逆向公司域名com.xxx。同一个公司的GroupId都是相同的。

ArtifactId:一般是项目(jar)名,如:mysql-connector-java。

Version:版本号8.0.28。

1.5 Maven的下载和安装

        从maven官网下载Maven,官网地址:

Welcome to Apache Maven – Mavenhttps://maven.apache.org/

1.6 Maven常用配置

(1)配置本地仓库

        随便选择一个目录作为本地仓库

        在配置文件中指定本地仓库的位置

配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是刚刚1.5中下载的Maven包的路径中)

(2) 配置镜像仓库

配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是刚刚1.5中下载的Maven包的路径中)

<mirror>
  <id>alimaven</id>
  <mirrorOf>central</mirrorOf>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

(3)配置JDK

        在使用Maven之后,项目由Maven来完成编译和打包运行,需要指定使用的JDK版本。

配置文件位置:F:\Java-IDEA\apache-maven-3.9.11\conf\settings.xml(就是刚刚1.5中下载的Maven包的路径中)

<profile>
  <id>jdk-17</id>

  <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>17</jdk>
  </activation>

  <properties>
    <maven.compiler.source>17</maven.compiler.source>
	<maven.compiler.target>17</maven.compiler.target>
	<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
   </properties>
</profile>

1.7 创建Maven项目

(1)降版本操作

        目前我们下载的Maven版本是3.9.11,JDK的版本是17,由于市面上对于这个版本的配置并不兼容,会出现一系列的问题,所以,我们要将Maven和JDK的版本降低到一个稳定兼容的版本:

manen:切换版本为3.6.3

https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.ziphttps://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zipJDK:切换版本为8

        这个链接中有所有的JDK下载地址
Index of java-local/jdkhttps://repo.huaweicloud.com/java/jdk/

 (2)创建Maven项目
创建空项目

IDEA集成Maven操作

(3)Maven项目目录结构

 (4)测试Maven中MySql数据库链接
package com.study.test01;

import java.sql.*;

public class Test {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        // 加载驱动:
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 获取连接
        String url = "jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
        /*
          =====url中参数含义=====
          useSSL:是否使用SSL认证机制-不使用 false
          useUnicode:是否使用unicode字符集-使用
          characterEncoding=UTF-8:使用unicode的utf-8策略
          serverTimezone:时区参数-东八区
          allowPublicKeyRetrieval:允许客户端从服务器获取公钥
         */
        String username = "root";
        String password = "root";
        Connection conn = DriverManager.getConnection(url, username, password);
        // 创建会话
        Statement stmt = conn.createStatement();
        // 发送SQL(更新操作)
        ResultSet resultSet = stmt.executeQuery("select * from t_book");
        // 处理结果
        while (resultSet.next()) { // 判断是否有记录存在
            System.out.println(resultSet.getString("id") + "----" + resultSet.getString("name") + "----" + resultSet.getString("author") + "----" + resultSet.getDouble("price"));
        }
        // 关闭资源
        stmt.close();
        conn.close();
    }
}

二、框架

2.1 框架出现的意义

        重复/基础代码封装,同时添加额外功能

        释放程序员写代码精力,更关注业务层面

        框架是半成品

2.2 框架的优缺点

    优点

        更好用

        更强大

        开发周期短

    缺点

        更多的学习成本

        初学者容易出错

        对于初学者,出了错误更难解决

2.3 常见框架

常见Java框架分类:

(1)持久层框架:MyBatis、Hibernate、Spring Data、iBatis

(2)MVC框架:Spring MVC、Struts1、Struts2

(3)项目管理框架:Spring Framework、Spring Boot

(4)微服务框架:Spring Cloud

(5)权限管理框架:Spring Security、Shiro

三、MyBatis使用

3.1 MyBatis是持久层框架

        持久层是分层开发中专门负责访问数据源的一层,Java项目中每一层都由自己的作用,持久层的作用就是访问数据源,把访问数据源的代码和业务逻辑代码分离开,有利于后期维护和团队分工开发。同时也增加了数据访问代码的复用性。

3.2 MyBatis是ORM框架

        ORM(Object/Relation Mapping),中文名称:对象/关系映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。

3.3 搭建第一个MyBatis框架

(1)创建数据库表
(2)创建Maven项目
(3)添加依赖

添加MySql依赖(在pom.xml文件中)

 (4)创建MyBatis全局配置文件

参考官网:入门_MyBatis中文网https://mybatis.net.cn/getting-started.html

配置JDBC连接
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--连接数据库-->
    <environments default="mysql">
        <environment id="mysql">
            <!--事务配置-->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据源-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/study?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai&amp;allowPublicKeyRetrieval=true"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
 (5)创建实体类

        实体类的参数要跟数据库中的列名保持一致

(6)创建映射文件

创建映射文件

在核心配置文件中进行扫描 

(7)编写测试类,启动项目 
package com.study.test;

import com.study.pojo.Book;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test {
    public static void main(String[] args) throws IOException {
        // 指定核心配置文件的路径
        String resource = "mybatis.xml";
        // 获取加载配置文件的输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 加载配置文件:创建工厂类
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过工厂类获取一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行查询
        List<Object> list = sqlSession.selectList("a.b.sellectAllBooks");
        // 遍历
        for (int i = 0; i < list.size(); i++) {
            Book book = (Book) list.get(i);
            System.out.println(book.getName() + "---" + book.getAuthor() + "---" + book.getPrice());
        }
        //关闭资源
        sqlSession.close();
    }
}

四、MyBatis配置

4.1 别名设置

        MyBatis提供了别名机制可以对某个类起别名或给某个包下所有类起别名,简化resultType取值的写法。

        在核心配置文件中(mybatis.xml),通过<typeAlias>标签明确设置类型的别名。

  • type:类型全限定路径
  • alias:别名名称
<typeAliases>
   <typeAlias type="com.study.pojo.Book" alias="book"></typeAlias>
</typeAliases>

        当类个数比较多时,明确指定别名工作量较大,可以通过<package>标签指定包下全部类的别名。指定后所有类的别名就是类名。(也不区分大小写)

<typeAliases>
    <!--单独设置别名-->
    <typeAlias type="com.study.pojo.Book" alias="book"></typeAlias>
    <!--统一设置别名-->
    <package name="com.study.pojo"/>
</typeAliases>

ps:明确指定别名和指定包的方式可以同时存在

4.2 内置别名

        MyBatis框架中内置了一些常见类型的别名。这些别名不需要配置 

别名 映射的类型 别名 映射的类型 别名 映射的类型
_byte byte string String date Date
_long long byte Byte decimal Decimal
_short short long Long bigdecimal BigDecimal
_int int short Short object Object
_inerger int int Integer map Map
_double double integer Integer hashmap HashMap
_float float double Double list List
_boolean boolean float Float arraylist ArrayList
boolean Boolean collection Collection
iterator Iterator

4.3 属性文件配置

        MyBatis支持加载属性文件(.properties文件),可以通过在属性文件中配置数据库里娜姬属性然后加载。这种方式要比直接写稍微麻烦一点点,但是却可以把所有的数据库连接写道了统一的文件中,以后查看或修改时更加方便。

在src/main/resources目录中创建db.properties文件:

url=jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
driver=com.mysql.cj.jdbc.Driver
username=root
password=root

修改mybatis.xml文件,设置加载属性。通过${key}获取属性文件中配置的值:

<!--    加载properties配置文件-->
<properties resource="db.properties">

 <!--数据源 示例:-->
<dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</dataSource>

4.4 MyBatis启动日志功能

        MyBatis框架内置日志工厂。日志工厂负责自动加载项目中的配置的日志。MyBatis支持以下日志:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j(deprecated since 3.5.9)
  • JDK logging

(1)在pom.xml文件中配置

<!--Log4j的依赖-->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

(2)在resources中新建log4j.properties配置文件。名称必须叫这个名字,扩展名必须是.properties

# log4j中定义的级别:fatal(致命错误)>error(错误)>warn(警告)>info(普通信息)>debug(调试信息)>trace(跟踪信息)
log4j.rootLogger = trace,console

### console ### 控制台
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%p] [%-d{yyy--MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n

        如果说你是想看sql执行过程,那么可以整体调高,局部降低:将整个日志的级别调为ERROR,然后mapper.xml涉及的内容级别降低为TRACE。这样整体的多余信息不会输出,然后mapper.xml中的涉及内容会详细打印,log4j.properties加入:

#log4j.looger是固定的,a.b是命名空间的名字
log4j.logger.a.b = trace

五、接口

(1)类是类,接口是接口。

(2)接口:定义规则。实现类:实现接口,实现规则。

(3)接口:用interface来表示。

(4)在JDK1.8之前,接口中的内容:常量、抽象方法。

(5)实现类实现接口,利用implements关键字

(6)实现类实现接口后,重写接口中当以的抽象方法

(7)接口不能创建对象,需要用接口指向实现类的形式创建对象(多态形式)

六、依据接口绑定方案创建项目

6.1 创建新的Maven项目

6.2 配置pom.xml,引入依赖

<?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>TestMyBatis02</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--MySql驱动的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <!--MyBatis的依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <!--Log4j的依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

</project>

6.3 配置全局配置文件MyBatis.xml

 6.4 引入数据库配置和日志配置

db.properties

url=jdbc:mysql://127.0.0.1:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
driver=com.mysql.cj.jdbc.Driver
username=root
password=root

log4j.properties

log4j.rootLogger = error,console

log4j.logger.a.b = trace

log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%p] [%-d{yyy--MM-dd HH\:mm\:ss}] %C.%M(%L) | %m%n

6.5 创建数据库的实体类

package com.study.pojo;

public class Book {
    private int id;
    private String name;
    private String author;
    private double price;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    // 构造器

    public Book(int id, String name, String author, double price) {
        this.id = id;
        this.name = name;
        this.author = author;
        this.price = price;
    }
}

6.6 创建接口

6.7 创建映射文件

要求:namespace取值必须是接口的全限定路径、标签中的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.study.mapper.BookMapper">
    <select id="selectAllBooks" resultType="Book">
        select * from t_book
    </select>
</mapper>

6.8 编写测试类(通过动态代理模式)

package com.study.test;

import com.study.mapper.BookMapper;
import com.study.pojo.Book;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test {
    public static void main(String[] args) throws IOException {
        // 指定核心配置文件的路径
        String resource = "mybatis.xml";
        // 获取加载配置文件的输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 加载配置文件:创建工厂类
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过工厂类获取一个会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行查询
        // 动态代理模式 = BookMapper mapper = BookMapper (接口 = 实现类)
        BookMapper mapper = sqlSession.getMapper(BookMapper.class); // 参数:接口
        List list = mapper.selectAllBooks();

        // 遍历操作
        for (int i = 0; i < list.size(); i++) {
            Book book = (Book) list.get(i);
            System.out.println(book.getName());
        }
        //关闭资源
        sqlSession.close();
    }
}

七、MyBatis的参数传递问题

7.1 如何进行参数传递

使用接口绑定方案之前:

        (1)如果是一个参数,直接传递

        (2)如果是多个参数,封装成对象/集合

使用接口绑定方案之后:

        可以直接调用方法传递参数即可。 

7.2 获取数据方式

(1)使用内置名称进行调用

使用符号:#{}进行获取

{}中名字的使用规则

arg0、arg1、argM(M为从0开始的数字,和方法参数顺序对应)

param1、param2、paramN(N为从1开始的数字,和方法参数顺序对应)

<select id="selectOneBook" resultType="Book">
   select * from t_book where name = #{param1} and author = #{param2}
</select>

(2)使用对象类型传递参数

使用符号:#{}进行获取

直接利用属性名即可

<select id="selectOneBook2" resultType="Book">
  select * from t_book where name = #{name} and author = #{author}
</select>

(3)传递多个不同类型的参数

使用符号:#{}进行获取

argM.属性名

paramN.属性名

PS:argM.或者paramN.不可以省略不写

<select id="selectOneBook3" resultType="Book">
  select * from t_book where name = #{param1} and author = #{param2.author}
</select>

7.3 数据库修改数据

增加操作

        映射文件

insert(增加)、delete(删除)、update(修改)

<insert id="insertBook">
    insert into t_book(id,name,author,price) values (#{id},#{name},#{author},#{price})
</insert>

注意:修改数据库时有一个事务相关的操作

// 这里会涉及一个跟事务相关的操作:提交(commit)
sqlSession.commit();