本笔记是基于黑马程序员的课件以及视频资料所做。所涉及的资料可在下面的度盘链接找到:
链接:https://pan.baidu.com/s/1g9vV_zmS9l-f0NYw8xevAQ
提取码:3ze7
复制这段内容后打开百度网盘手机App,操作更方便哦
- 能够使用Maven进行项目的管理
- 能够完成Mybatis代理方式查询数据
- 能够理解Mybatis核心配置文件的配置
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
提供了一套标准化的项目结构
项目结构我们都知道,每一个开发工具(IDE)都有自己不同的项目结构,它们互相之间不通用。而Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样,所以IDE创建的Maven项目可以通用。
提供了一套标准化的构建流程(编译,测试,打包,发布……)
如上图所示我们开发了一套系统,代码需要进行编译、测试、打包、发布,这些操作如果需要反复进行就显得特别麻烦,而Maven提供了一套简单的命令来完成项目构建。
提供了一套依赖管理机制
依赖管理其实就是管理项目所依赖的第三方资源(jar包、插件)。如之前我们项目中需要使用JDBC和Druid的话,就需要去网上下载对应的依赖包,复制到项目中,还要将jar包加入工作环境这一系列的操作。
而Maven使用标准的坐标配置来管理各种依赖,只需要简单的配置就可以完成依赖管理。
如上图右边所示就是mysql驱动包的坐标,在项目中只需要写这段配置,其他都不需要我们担心,Maven都帮我们进行操作了。
Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。
官网 :http://maven.apache.org/
通过上面的描述大家只需要知道Maven是一个工具即可。Apache 是一个开源组织,将来我们会学习很多Apache提供的项目。
如上图所示就是Maven的模型,而我们先看紫色框框起来的部分,他就是用来完成 标准化构建流程
。如我们需要编译,Maven提供了一个编译插件供我们使用,我们需要打包,Maven就提供了一个打包插件提供我们使用等。
上图中紫色框起来的部分,项目对象模型就是将我们自己抽象成一个对象模型,有自己专属的坐标,如下图所示是一个Maven项目:
依赖管理模型则是使用坐标来描述当前项目依赖哪儿些第三方jar包,如下图所示
大家想想这样的场景,我们创建Maven项目,在项目中使用坐标来指定项目的依赖,那么依赖的jar包到底存储在什么地方呢?其实依赖jar包是存储在我们的本地仓库中。而项目运行时从本地仓库中拿需要的依赖jar包。
仓库分类:
本地仓库:自己计算机上的一个目录
中央仓库:由Maven团队维护的全球唯一的仓库
远程仓库(私服):一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:
如果还可以搭建远程仓库,jar包的查找顺序则变为:
本地仓库 --> 远程仓库--> 中央仓库
这部分可参考视频
bin
目录 : 存放的是可执行命令。mvn 命令重点关注。conf
目录 :存放Maven的配置文件。settings.xml
配置文件后期需要修改。lib
目录 :存放Maven依赖的jar包。Maven也是使用java开发的,所以它也依赖其他的jar包。除了要配置环境变量外,还需要配置本地仓库和配置阿里云私服。
配置阿里云私服
中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。
修改 conf/settings.xml 中的 标签,为其添加如下子标签:
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
compile :编译
clean:清理
test:测试
package:打包
install:安装
在 资料\代码\maven-project
提供了一个使用Maven构建的项目,项目结构如下:
进入到项目的 pom.xml
目录下,打开命令提示符/终端:
编译命令:
mvn compile
执行上述命令可以看到:
清理命令:
mvn clean
执行上述命令可以看到
打包命令:
mvn package
执行上述命令可以看到:
测试命令:
mvn test
安装命令:
mvn install
Maven 构建项目生命周期描述的是一次构建过程经历经历了多少个事件
Maven 对项目构建的生命周期划分为3套:
clean
:清理工作。default
:核心工作,例如编译,测试,打包,安装等。site
: 产生报告,发布站点等。这套声明周期一般不会使用。同一套生命周期内,执行后边的命令,前面的所有命令会自动执行。例如默认(default)生命周期如下:
当我们执行 install
(安装)命令时,它会先执行 compile
命令,再执行 test
命令,再执行 package
命令,最后执行 install
命令。
当我们执行 package
(打包)命令时,它会先执行 compile
命令,再执行 test
命令,最后执行 package
命令。
默认的生命周期也有对应的很多命令,其他的一般都不会使用,我们只关注常用的:
本小节可参考视频
什么是坐标?
Maven 坐标主要组成
如下图就是使用坐标表示一个项目:
注意:
如果没有Maven面板,选择
View --> Appearance --> Tool Window Bars
可以通过maven面板如下图所示进行命令的操作:
除此之外,也还可以再安装 Maven-Helper 插件,这里不再赘述。
使用坐标引入jar包的步骤:
注意:
- 具体的坐标我们可以到如下网站进行搜索
- https://mvnrepository.com/
快捷方式导入jar包的坐标:
每次需要引入jar包,都去对应的网站进行搜索是比较麻烦的,接下来给大家介绍一种快捷引入坐标的方式
自动导入设置:
上面每次操作都需要点击刷新按钮,让引入的坐标生效。当然我们也可以通过设置让其自动完成
通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境。
如下图所示给 junit
依赖通过 scope
标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。
servlet-api
,在使用它时,必须将 scope
设置为该值,不然运行时就会报错scope
设置为该值,当然不设置也没有任何问题注意:
- 如果引入坐标不指定
scope
标签时,默认就是 compile 值。以后大部分jar包都是使用默认值。
MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github
官网:https://mybatis.org/mybatis-3/zh/index.html
持久层:
负责将数据到保存到数据库的那一层代码。
以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。
JavaEE三层架构:表现层、业务层、持久层
三层架构在后期会给大家进行讲解,今天先简单的了解下即可。
框架:
硬编码
注册驱动、获取连接
上图标1的代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。
SQL语句
上图标2的代码。如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。
操作繁琐
手动设置参数
手动封装结果集
上图标4的代码是对查询到的数据进行封装,而这部分代码是没有什么技术含量,而且特别耗费时间的。
需求:查询user表中所有的数据
创建user表,添加数据
create database mybatis;
use mybatis;
drop table if exists tb_user;
create table tb_user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
gender char(1),
addr varchar(30)
);
INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');
创建模块,导入坐标
在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.5.5version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.32version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.5.6version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>1.2.3version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-coreartifactId>
<version>1.2.3version>
dependency>
dependencies>
注意:需要在项目的 resources 目录下创建logback的配置文件。logback.xml文件如下:
<configuration>
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %cyan([%thread]) %boldGreen(%logger{15}) - %msg %npattern>
encoder>
appender>
<logger name="com.itheima" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
logger>
<root level="DEBUG">
<appender-ref ref="Console"/>
root>
configuration>
编写 MyBatis 核心配置文件 – > 替换连接信息 解决硬编码问题
在模块下的 resources
目录下创建mybatis
的配置文件 mybatis-config.xml
,内容如下:
<configuration>
<typeAliases>
<package name="pers.chh3213.pojo"/>
typeAliases>
<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:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="5213"/>
dataSource>
environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="5213"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="UserMapper.xml"/>
mappers>
configuration>
注意修改里面的相关信息。
编写 SQL 映射文件 --> 统一管理sql语句,解决硬编码问题
在模块的 resources
目录下创建映射配置文件 UserMapper.xml
,内容如下:
<mapper namespace="test">
<select id="selectAll" resultType="pers.chh3213.pojo.User">
select * from tb_user;
select>
mapper>
编码
在 pers.chh3213.pojo
包下创建 User类
package pers.chh3213.pojo;
public class User {
private int id;
private String username;
private String password;
private String gender ;
private String addr;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
编写 MybatisDemo 测试类
package pers.chh3213;
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 pers.chh3213.pojo.User;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisDemo {
public static void main(String[] args) throws Exception {
//1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取SqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3. 执行sql
List<User> users = sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的namespace.id
System.out.println(users);
//4. 释放资源
sqlSession.close();
}
}
运行测试类后如果报如下错误:
mybatis错误——java.io.IOException: Could not find resource com/xxx/xxxMapper.xml
可参考此篇博客
解决SQL映射文件的警告提示:
Database
,在展开的界面点击 +
选择 Data Source
,再选择 MySQL
,填写基本信息后连接即可。具体可百度。之前我们写的代码是基本使用方式,它也存在硬编码的问题,如下:
这里调用 selectList()
方法传递的参数是映射配置文件中的 namespace.id
值。这样写也不便于后期的维护。如果使用 Mapper 代理方式(如下图)则不存在硬编码问题。
通过上面的描述可以看出 Mapper 代理方式的目的:
在 对应的包下创建 UserMapper接口(例如我这边是在pers.chh3213.mapper
包下),代码如下:
public interface UserMapper {
List<User> selectAll();
}
在 resources
下创建 pers/chh3213/mapper
目录,并在该目录下创建 UserMapper.xml 映射配置文件:
<!--
namespace:名称空间。必须是对应接口的全限定名
-->
<mapper namespace="pers.chh3213.mapper.UseMapper">
<select id="selectAll" resultType="pers.chh3213.pojo.User">
select *
from tb_user;
</select>
</mapper>
在 pers.chh3213
包下创建 MybatisDemo2 测试类,代码如下:
package pers.chh3213;
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 pers.chh3213.mapper.UseMapper;
import pers.chh3213.pojo.User;
import java.io.InputStream;
import java.util.List;
public class MybatisDemo2 {
public static void main(String[] args) throws Exception {
//1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2. 获取SqlSession对象,用它来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3. 执行sql
UseMapper useMapper = sqlSession.getMapper(UseMapper.class);
List<User> users = useMapper.selectAll();
System.out.println(users);
//4. 释放资源
sqlSession.close();
}
}
注意:
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就是将核心配置文件(mybatis-config.xml)的加载映射配置文件的配置修改为
<mappers>
<package name="pers.chh3213.mapper"/>
mappers>
以上完整程序可参考gitee仓库
核心配置文件中现有的配置之前已经给大家进行了解释,而核心配置文件中还可以配置很多内容。我们可以通过查询官网看可以配置的内容
在核心配置文件的 environments
标签中其实是可以配置多个 environment
,使用 id
给每段环境起名,在 environments
中使用 default='环境id'
来指定使用哪儿段配置。我们一般就配置一个 environment
即可。
<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:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="5213"/>
dataSource>
environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="5213"/>
dataSource>
environment>
environments>
在映射配置文件中的 resultType
属性需要配置数据封装的类型(类的全限定名)。而每次这样写是特别麻烦的,Mybatis 提供了 类型别名
(typeAliases) 可以简化这部分的书写。
首先需要现在核心配置文件中配置类型别名,也就意味着给pojo包下所有的类起了别名(别名就是类名),不区分大小写。内容如下:
<typeAliases>
<package name="pers.chh3213.pojo"/>
typeAliases>
通过上述的配置,我们就可以简化映射配置文件中 resultType
属性值的编写
<mapper namespace="pers.chh3213.mapper.UserMapper">
<select id="selectAll" resultType="user">
select * from tb_user;
select>
mapper>