05day
05day
Maven
问题一:
项目中的jar包资源需要我们自己从网上下载后,手动导入到项目中使用,不好管理。
问题二:
jar包版本控制麻烦。
Maven是使用Java语言编写的基于项目对象模型(POM)项目管理工具软件。
开发者可以通过
一小段描述信息来管理项目构建、报告和文档。使用Maven可以更好的帮助我们完成项目的管理。
Maven的仓库
中央仓库(Central Repository):Maven官方服务器。
里面存放了绝大多数市面上流行的jar。允许用户注
册后,上传自己的项目到官方服务器。网址在国外,经常访问不了。https://mvnrepository.com/
本地仓库(Local Repository): 本机的文件夹作为本地仓库,本地仓库指本机的一份拷贝,用来缓存远程
下载,包含你尚未发布的临时构件,
本地仓库(Local Repository): 本机的文件夹作为本地仓库,本地仓库指本机的一份拷贝,用来缓存远程
下载,包含你尚未发布的临时构件。
镜像仓库(Mirror Repository):对于国内来说,访问国外的Maven仓库会特别慢。镜像仓库就是另一台备份/复制了中央仓库的服务器。平时使用时国内开发者多使用阿里云镜像或华为云镜像,这样可以大大提升从中央仓库下载资源的速度,,但它的角色仍然是一个远程库
与DNS类似
Maven的资源坐标
资源坐标也就是从仓库中找到相应的jar包的地址信息。
Groupld: 一般是逆向公司域名 com.msb。同一个公司的Groupld都是相同的。
Artifactld: 一般是项目(jar)名 mysarconnector-java.
Version:版本号 8.0.28,
pom.xml文件
pom.xml
是 Maven 项目的核心配置文件,POM 代表 "Project Object Model"。它用于定义项目构建过程中的各种配置,包括项目的基本信息、依赖管理、构建插件和其他构建相关的信息。以下是 pom.xml
文件中包含的主要内容:
主要元素
-
基本项目信息
<groupId>
: 定义项目的组标识符,通常为组织名称的反向域名形式,例如com.example
。<artifactId>
: 项目的唯一标识符,通常是项目名称,例如my-app
。<version>
: 项目版本号,比如1.0-SNAPSHOT
。开发阶段常用SNAPSHOT
后缀。
-
项目属性
<name>
: 项目的名称。<description>
: 项目的简要描述。<url>
: 项目的主页或仓库地址。
-
依赖管理
-
<dependencies>
: 列出项目所需的所有依赖项。每个依赖项由
<dependency>
元素定义,包括
groupId
artifactId
和
version
等。
xml复制代码<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> </dependencies>
-
-
构建插件
-
<build>
: 定义构建过程中使用的插件及其配置。 -
<plugins>
: 包含一个或多个
<plugin>
元素,用来指定构建时需要加载的插件。
xml复制代码<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>17</source> <target>17</target> </configuration> </plugin> </plugins> </build>
-
-
仓库配置
<repositories>
: 配置从哪里获取依赖包,一般情况下使用 Maven Central,也可以配置公司内部私有仓库。<distributionManagement>
: 用于部署构件到远程存储库(如发布软件)。
-
模块化项目
<modules>
: 当你在处理多模块项目时,定义子模块的位置。
-
属性与资源过滤
-
<properties>
: 定义可在整个 POM 中复用的变量。例如:
xml复制代码<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
-
功能和用途
-
依赖管理: 自动下载和管理项目所需的依赖库,确保版本一致性。
-
构建管理: 使用插件来自动化构建过程,包括编译、测试、打包、部署等步骤。
-
生命周期支持: Maven 的生命周期涵盖了清理、编译、测试、安装和部署各个阶段。
maven文件结构
其中src中有两个文件夹一个是main(所有的业务文件都放在这),所有的源码都放在java下。资源配置文件放在resource下面,test文件时测试用的文件
pom.xml代码示例:
<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>Testone</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Testone</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--导入jar包-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
</project>
框架
框架出现的意义
重复/基础代码封装,同时添加额外功能。
释放程序员写代码精力,更关注业务层面。
框架是半成品。
优点
更好用
更强大
开发周期更短
缺点
更多的学习成本
初学者更容易出错
对于初学者,出了错误更难解决
常见Java框架分类:
- 持久层框架。MyBatis、Hibernate、Spring Data、iBatis.(连接数据库的)
- MVC框架。Spring MVc、Struts1、Struts2.
- 项目管理框架。Spring Framework、Spring Boot.
- 微服务框架。Spring Cloud。
- 权限管理框架。Spring Security、Shiro。
Mybatis
Mybatis是一个持久性框架
注:分层思想:分层是在后端代码进行分层(可以理解为对数据流的处理进行了更加细化的分解)。
持久层(连接数据库那一层)是分层开发中专门负责访问数据源的一层,Java项目中每一层都有自己的作
用,持久层的作用就是访问数据源,把访问数据源的代码和业务逻辑代码分离开,有
利于后期维护和团队分工开发。同时也增加了数据访问代码的复用性。
MyBatis是ORM框架
ORM(Object/Relation Mapping),中文名称:对象/关系 映射。是一种解决数据库发展和面向对象编程语言发展不匹配问题而出现的技术。
pwnda:ORM可以理解为用框架自动将数据库与app之间流通的数据进行了对象封装,并且数据库与app中具体数据的映射关系也完成了相关的映射。
映射文件
映射文件也是一个文本文件,其中存储的是对数据库进行操作的信息
简单sql查询在框架下的实现:
全局(核心)配置文件:Mybatis.xml
<?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>
<!--default是默认选择那个配置源-->
<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/book?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
<environment id="">
<transactionManager type=""></transactionManager>
<dataSource type=""></dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/BookNapper.xml"></mapper>
</mappers>
</configuration>
查询映射文件.mapperBook.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--约束(命名)-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="a.b">
<select id="selectAllBooks" resultType="com.day02.pojo.Book">
SELECT * FROM books;
</select>
</mapper>
Book类:
package com.day02.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;
}
public Book() {
}
}
Test类
package com.day02.test1;
import com.day02.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 {
// 指定核心配置文件的路径(该路径默认是从resource下面开始进行加载的)
String resource = "mybatis.xml";
// 获取加载配置文件的输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 加载配置文件,创建了一个工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂类获取一个会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
List list = sqlSession.selectList("a.b.selectAllBooks");
// 遍历
for(int i=0;i<list.size();i++){
Book b = (Book)list.get(i);
System.out.println(b.getName() + "----" + b.getAuthor());
}
// 关闭资源:
sqlSession.close();
}
}
别名设置
MyBatis提供了别名机制可以对某个类起别名或给某个包下所有类起别名,简化
resultType取值的写法。
在核心配置文件中,通过
type:类型全限定路径
alias:别名名称
<typeAliases>
<typeAlias
type="com.day02.pojo.Book" alias="b"></typeAlias>
</typeAliases>
当类个数较多时,明确指定别名工作量较大,可以通过
<!--这种方式指定的别名就是类的名字-->
<package name="com.day02.pojo"/>
PS:明确指定别名和指定包的方式可以同时存在
内置别名
MyBatis框架中内置了一些常见类型的别名。这些别名不需要配置
db.properties:该文件是在核心配置文件的基础上在提取出数据库的配置文件
接口与框架实现问题
框架:在映射文件xml,本质是给框架传递其所需的参数甚至包括函数的名字
接口时定义类的名字和方法名字
用框架的底层实现接口中的函数和方法。
示例接口:
package com.day02.mapper;
import java.util.List;
public interface BookMapper {
public abstract List selectAllBooks();
}
映射文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<!--约束(命名)-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.day02.mapper.BookMapper">
<select id="selectAllBooks" resultType="Book">
SELECT * FROM t_book;
</select>
</mapper>
注:其中空间名字和id的名字要与接口一一对应
获取数据方式-使用内置名称进行调用
使用符号: #{}进行获取
{}中名字使用规则
arg0、arg1、argM(M为从0开始的数字,和方法参数顺序对应)
或
param1、param2、paramN(N为从1开始的数字,和方法参数顺序对应)
一个参数且参数为对象,获取参数如何处理呢?
使用符号: #{}进行获取
直接利用属性名即可
多个参数且参数有对象,获取参数如何处理呢?
使用符号: #{}进行获取
argM.属性名
或者
paramN.属性名
PS:argM.或者 paramN.不可以省略不写
示例代码测试类:
package com.day02.test1;
import com.day02.mapper.BookMapper;
import com.day02.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 {
// 指定核心配置文件的路径(该路径默认是从resource下面开始进行加载的)
String resource = "mybatis.xml";
// 获取加载配置文件的输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 加载配置文件,创建了一个工厂类
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 通过工厂类获取一个会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询
// 动态代理模式
BookMapper mapper = sqlSession.getMapper(BookMapper.class);
Book book = mapper.selectOneBook("觅长生","胡杜洋");
System.out.println(book.getName());
// 关闭资源:
Book book2 = new Book();
book2.setAuthor("余华");
book2.setName("觅长生");
// Book b2 = mapper.selectOneBook2(book2);
// System.out.println(b2.getName() );
Book b1 = mapper.selectOneBook3("活着", book2);
System.out.println(b1.getName());
sqlSession.close();
}
}
映射文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--约束(命名)-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.day02.mapper.BookMapper">
<select id="selectAllBooks" resultType="Book">
SELECT * FROM t_book;
</select>
<!-- 不用指定参数类型他会制动匹配,直接指定返回值类型即可-->
<select id="selectOneBook" resultType="Book">
select * from t_book where name = #{arg0} and author = #{arg1}
</select>
<select id="selectOneBook2" resultType="Book">
select * from t_book where name = #{name} and author = #{author}
</select>
<select id="selectOneBook3" resultType="Book">
select * from t_book where name = #{arg0} and author = #{arg1.author}
</select>
</mapper>
接口:
package com.day02.mapper;
import com.day02.pojo.Book;
import java.util.List;
public interface BookMapper {
public abstract List selectAllBooks();
public abstract Book selectOneBook(String name,String author);
public abstract Book selectOneBook2(Book book);
public abstract Book selectOneBook3(String name, Book book);
}