文章目录
前提
针对IDEA2023以上,以及jdk17,maven3.9.6
什么是maven?
Apache Maven 是一个 Java 项目的构建管理和理解工具
。Maven 提供了一套标准的构建生命周期,项目对象模型(POM),依赖管理,项目信息和用于项目构建、报告和文档的一系列插件。
Maven 的主要特点包括:
- 依赖管理:Maven 能够自动处理项目依赖关系,这意味着当你添加一个依赖到你的项目中时,Maven 可以自动下载所需的库,并且解决这些库之间的依赖关系。
- 项目构建:Maven 使用一个中央配置文件
pom.xml
来定义项目的构建过程,这使得构建过程更加规范和易于理解。 - 生命周期和插件:Maven 定义了一系列的构建阶段,如 clean, compile, test, package, install 和 deploy 等等。每个阶段都可以由 Maven 插件来执行特定的任务。
- 多模块项目支持:Maven 支持多模块项目,可以方便地管理大型项目中的多个子项目。
- 集成开发环境 (IDE) 集成:大多数现代的 Java IDE 都提供了对 Maven 的支持,这使得在 IDE 中使用 Maven 成为了可能。
- 仓库管理:Maven 使用本地或远程仓库来存储 JAR 文件和其他类型的构建产物。远程仓库可以是公共的,例如 Maven Central Repository,也可以是私有的,企业通常会部署自己的私有仓库。
通过使用 Maven,开发者可以更加专注于应用程序的逻辑而不是构建系统的细节。这使得项目更容易维护,同时也简化了团队之间的协作。
为什么使用maven?
使用 Maven 有几个重要的原因:
- 标准化构建流程:Maven 强制实施了一种约定优于配置的方法,提供了一个标准的项目布局和构建生命周期。这样,任何熟悉 Maven 的开发人员都可以很容易地理解项目的结构并知道如何构建它,而无需深入研究详细的构建脚本。
- 依赖管理:Maven 能够帮助管理项目的依赖项,包括自动解析依赖树,避免版本冲突,并从远程仓库(如 Maven Central)下载必要的库。这大大减少了手动管理依赖项的工作量,降低了因依赖项问题导致的错误风险。
- 简化构建过程:Maven 使用一个中心化的配置文件
pom.xml
来控制整个构建过程。这使得构建过程更加简洁明了,也便于维护。 - 多模块项目支持:对于大型项目或者需要拆分成多个模块进行开发的项目来说,Maven 提供了很好的支持。它可以轻松地处理多模块项目之间的依赖关系,并且能够有效地构建和测试整个项目。
- 插件生态系统:Maven 拥有大量的插件,可以用来执行各种任务,如生成项目文档、运行测试、打包应用程序等。这使得扩展 Maven 的功能变得非常简单。
- 持续集成与部署:Maven 的标准化构建流程非常适合与持续集成(CI)工具结合使用。许多 CI 工具都直接支持 Maven,使得自动化构建、测试和部署变得更加容易。
- 项目信息和报告:Maven 还能够自动生成项目的文档和报告,如依赖关系图、项目信息页面等,有助于提高项目的透明度。
- 社区支持:由于 Maven 是一个广泛使用的工具,因此拥有庞大的用户群和活跃的社区支持。这意味着遇到问题时,很容易找到解决方案或求助。
综上所述,Maven 为 Java 开发者提供了一个强大且灵活的构建工具,可以帮助他们更高效地管理项目依赖、构建和部署应用。
怎么使用maven?
IDEA中集成maven
配置maven环境(全局)
创建maven项目
方法1
方法2
使用quickstart的话,src/main下面只有java文件夹,没有resource文件夹作为配置文件存放地
。那就自己自己新建目录。
配置maven
导入依赖
<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>com.wake</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mybatis</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
新建数据库和表
CREATE TABLE `t_customer` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`jobs` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
`phone` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
定义实体类和工具类
MyBatisUtils
src/main/java/com/wake/utils/MyBatisUtils.java
package com.wake.utils;
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;
/**
* @Author LiuBin
* @Date 2024/9/13 下午1:48
* @Version 1.0
* @Description <p>备注:</p>
*/
public class MyBatisUtils {
public static SqlSession getSqlSession(){
SqlSession sqlSession;
try {
//创建配置信息输入流
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(is);
//实例化SqlSession对象
sqlSession=sqlSessionFactory.openSession();
} catch (IOException e) {
throw new RuntimeException(e);
}
return sqlSession;
}
public static void closeSqlSessionAndCommit(SqlSession sqlSession){
sqlSession.commit();
sqlSession.close();
}
}
Customer
src/main/java/com/wake/entity/Customer.java
package com.wake.entity;
import lombok.*;
/**
* @Author LiuBin
* @Date 2024/9/13 下午12:58
* @Version 1.0
* @Description <p>备注:</p>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Builder
public class Customer {
/**
* id
*/
private Integer id;
/**
* 用户名
*/
private String username;
/**
* 职位
*/
private String jobs;
/**
* 电话
*/
private String phone;
}
定义CustomerMapper接口
src/main/java/com/wake/mapper/CustomerMapper.java
package com.wake.mapper;
import com.wake.entity.Customer;
import java.util.List;
/**
* @Author LiuBin
* @Date 2024/9/13 下午1:07
* @Version 1.0
* @Description <p>备注:</p>
*/
public interface CustomerMapper {
List<Customer> findAllCustomer();
}
定义CustomerMapper.xml文件
注意:注意这里建包规则和上面不同这里要写成com/wake/mapper。而上面的要写成com.wake.xxx 这种形式。
<?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.wake.mapper.CustomerMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.wake.entity.Customer">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="jobs" property="jobs" />
<result column="phone" property="phone" />
</resultMap>
<select id="findAllCustomer" resultMap="BaseResultMap" resultType="com.wake.entity.Customer">
select * from t_customer
</select>
</mapper>
定义db.properties配置文件
src/main/resources/db.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
定义mybatis-config配置文件
src/main/resources/mybatis-config.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>
<properties resource="db.properties"/>
<!-- 设置别名 -->
<typeAliases>
<typeAlias alias="Customer" type="com.wake.entity.Customer"/>
</typeAliases>
<!-- 配置环境 -->
<environments default="development">
<environment id="development">
<!-- 事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 数据源 -->
<dataSource type="POOLED">
<!--MySQL驱动类名-->
<property name="driver" value="${jdbc.driver}"/>
<!--数据库连接URL-->
<property name="url" value="${jdbc.url}"/>
<!--数据库用户名-->
<property name="username" value="${jdbc.username}"/>
<!--数据库密码-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件位置 -->
<mappers>
<mapper resource="com/wake/mapper/CustomerMapper.xml"/>
</mappers>
</configuration>
注意:由于配置了
<typeAlias alias="Customer" type="com.wake.entity.Customer"/>
。CustomerMapper.xml
文件的com.wake.entity.Customer
可以单独写类名Customer
<?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.wake.mapper.CustomerMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="Customer">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="jobs" property="jobs" />
<result column="phone" property="phone" />
</resultMap>
<select id="findAllCustomer" resultMap="BaseResultMap" resultType="Customer">
select * from t_customer
</select>
</mapper>
新建MybatisTest测试类
package com.wake;
import com.wake.entity.Customer;
import com.wake.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @Author LiuBin
* @Date 2024/9/13 下午1:28
* @Version 1.0
* @Description <p>备注:</p>
*/
public class MyBatisTest {
@Test
public void findAllCustomer() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
List<Customer> customers = sqlSession.selectList("com.wake.mapper.CustomerMapper.findAllCustomer");
customers.forEach(System.out::println);
MyBatisUtils.closeSqlSessionAndCommit(sqlSession);
}
}
运行结果
补充
CustomerMapper.java
package com.wake.mapper;
import com.wake.entity.Customer;
import java.util.List;
/**
* @Author LiuBin
* @Date 2024/9/13 下午1:07
* @Version 1.0
* @Description <p>备注:</p>
*/
public interface CustomerMapper {
List<Customer> findAllCustomer();
int addCustomer(Customer customer);
int deleteCustomer(Integer id);
int updateCustomer(Customer customer);
}
CustomerMapper.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.wake.mapper.CustomerMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="Customer">
<id column="id" property="id" />
<result column="username" property="username" />
<result column="jobs" property="jobs" />
<result column="phone" property="phone" />
</resultMap>
<select id="findAllCustomer" resultMap="BaseResultMap" resultType="Customer">
select * from t_customer
</select>
<insert id="addCustomer" parameterType="Customer">
insert into t_customer(username,jobs,phone) values(#{username},#{jobs},#{phone})
</insert>
<delete id="deleteCustomer" parameterType="Integer">
delete from t_customer where id = #{id}
</delete>
<update id="updateCustomer" parameterType="Customer">
update t_customer set username = #{username},jobs = #{jobs},phone = #{phone} where id = #{id}
</update>
</mapper>
MyBatisTest.java
package com.wake;
import com.wake.entity.Customer;
import com.wake.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* @Author LiuBin
* @Date 2024/9/13 下午1:28
* @Version 1.0
* @Description <p>备注:</p>
*/
public class MyBatisTest {
@Test
public void findAllCustomer() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
List<Customer> customers = sqlSession.selectList("com.wake.mapper.CustomerMapper.findAllCustomer");
customers.forEach(System.out::println);
MyBatisUtils.closeSqlSessionAndCommit(sqlSession);
}
@Test
public void addCustomer() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
Customer customer = Customer.builder().username("wake").jobs("java").phone("123456789").build();
int result = sqlSession.insert("com.wake.mapper.CustomerMapper.addCustomer", customer);
if (result > 0) {
System.out.println("添加成功");
MyBatisUtils.closeSqlSessionAndCommit(sqlSession);
return;
}
System.out.println("添加失败");
}
@Test
public void deleteCustomerById() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
int result = sqlSession.delete("com.wake.mapper.CustomerMapper.deleteCustomer", 4);
if (result > 0) {
System.out.println("删除成功");
MyBatisUtils.closeSqlSessionAndCommit(sqlSession);
return;
}
System.out.println("删除失败");
}
@Test
public void updateCustomer() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
Customer customer = Customer.builder().id(4).username("wake1").jobs("java1").phone("123456789").build();
int result = sqlSession.update("com.wake.mapper.CustomerMapper.updateCustomer", customer);
if (result > 0) {
System.out.println("修改成功");
MyBatisUtils.closeSqlSessionAndCommit(sqlSession);
return;
}
System.out.println("修改失败");
}
}
结语
细节决定成败,一步错,步步错。