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

一、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的资源坐标

java 复制代码
<!-- 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包的路径中)

html 复制代码
<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包的路径中)

html 复制代码
<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数据库链接
java 复制代码
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 复制代码
<?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)编写测试类,启动项目
java 复制代码
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:别名名称
XML 复制代码
<typeAliases>
   <typeAlias type="com.study.pojo.Book" alias="book"></typeAlias>
</typeAliases>

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

XML 复制代码
<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文件:

java 复制代码
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}获取属性文件**中配置的值:

java 复制代码
<!--    加载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文件中配置

XML 复制代码
<!--Log4j的依赖-->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

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

java 复制代码
# 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加入:

java 复制代码
#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 复制代码
<?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

java 复制代码
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

java 复制代码
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 创建数据库的实体类

java 复制代码
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 复制代码
<?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 编写测试类(通过动态代理模式)

java 复制代码
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开始的数字,和方法参数顺序对应)

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

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

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

直接利用属性名即可

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

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

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

argM.属性名

paramN.属性名

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

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

7.3 数据库修改数据

增加操作

映射文件

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

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

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

java 复制代码
// 这里会涉及一个跟事务相关的操作:提交(commit)
sqlSession.commit();
相关推荐
LZQqqqqo2 分钟前
C# 类 封装 属性 练习题
java·前端·c#
用户44726719331018 分钟前
Redis + Caffeine 实现高效的两级缓存架构
java
Java水解30 分钟前
美团Java面试题、笔试题(含答案)
java·后端·面试
苇柠32 分钟前
Java常用API(1)
java·开发语言
雪碧聊技术35 分钟前
HashMap和Hashtable的区别
java·hashmap·hashtable
意疏42 分钟前
浙江大学PTA程序设计C语言基础编程练习题1-5
c语言·开发语言
code bean43 分钟前
【C#】C# 事件 两次 -= 会怎么样?
开发语言·c#
惜.己1 小时前
使用python中的pymysql库,并且转化为数组元组数据
开发语言·python
一只叫煤球的猫1 小时前
这些 Spring Boot 默认配置不改,迟早踩坑
java·spring boot·后端
Ashlee_code1 小时前
稳定币技术全解:从货币锚定机制到区块链金融基础设施
java·人工智能·游戏·金融·架构·自动化·区块链