Maven :是一款软件;
作用:
1.提供了一个标准化的项目目录结构
2.管理jar包;(管理依赖);
3.完成项目的编译,打包,发布;
仓库:
是:专门供maven这个软件保存下载的jar包或插件的位置;
分类:
1.中央仓库(由开发maven这款软件的开发人员维护的网络中的统一仓库)
2.远程仓库(私服)由公司内部团队搭建的一个访问路径,目的是为了 提升jar包 的下载速度,
以及存储一些自己专用的jar包;
3.本地仓库(你自己电脑上的一个专门存放maven下载的内容的文件夹)
maven的安装:这是一款解压就可以使用的软件,无需单独安装;
1.下载:准备maven安装包,解压到一个目录中
解压后目录结构如右图 :
bin目录 : 存放的是可执行命令。mvn 命令重点关注。
conf目录 :存放Maven的配置文件。
settings.xml
配置文件后期需要修改。lib目录 :存放Maven依赖的jar包。
Maven也是使用java开发的,所以它也依赖其他的jar包。
2.环境变量配置:
此电脑
右键 -->高级系统设置
-->高级
-->环境变量
在系统变量处新建一个变量
MAVEN_HOME
:
在
Path
中进行配置:
打开命令提示符进行验证,出现如图所示表示安装成功 mvn -version
3.配置本地仓库: 修改 conf/settings.xml 中的 <localRepository>
为一个指定目录作为本地仓库,用来存储jar包。
4.配置阿里云私服:中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,
里面基本也都有开源项目的jar包。
修改 :conf/settings.xml 中的 <mirrors>标签,为其添加如下子标签:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>以上是对maven的安装以及配置完成
IDEA使用Maven配置:
1.选择 IDEA中 File --> Settings
![]()
2.搜索 maven:设置 IDEA 使用本地安装的 Maven,并修改配置文件路径
Maven坐标详解:
Maven 中的坐标是:资源的唯一标识
使用坐标来定义:项目或引入项目中需要的依赖
Maven坐标主要组成:
groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima) artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
version:定义当前项目版本号
如右图就是使用坐标表示一个项目:
注意:上面所说的资源可以是插件、依赖、当前项目。
我们的项目如果被其他的项目依赖时,也是需要坐标来引入的。
IDEA创建Maven项目:
1. 创建模块,选择Maven,点击Next
2.填写模块名称,坐标信息,点击finish,创建完成
3.创建好的项目目录结构如下:
4.创建配置文件:
![]()
IDEA导入Maven项目:
1.选择右侧Maven面板,点击 + 号
![]()
2.选中对应项目的pom.xml文件,双击即可
3.如果没有Maven面板,选择:View --> Appearance --> Tool Window Bars
4.可以通过下图所示进行命令的操作:
![]()
插件配置:
效果:
mybatis插件:
效果:
Lombok插件:
效果:
快捷方式导入jar包坐标:
1. 在pom.xml 中 按 alt + insert,选择 Dependency
2.在弹出的面板中搜索对应坐标,然后双击选中对应坐标
3.点击刷新按钮,使坐标生效
自动导入设置:
1.选择 IDEA中 File --> Settings
2.在弹出的面板中找到 Build Tools
MyBatis:
是:一款优秀的持久层框架,可以帮助我们把JDBC的操作进行封装和简化
JDBC缺点:
作用:1.可以通过修改配置文件,达到修改连接的数据库以及sql的目的;
2.可以简化JDBC获取数据的过程;
入门使用:1.从网上搜索mybatis的坐标复制到pom.xml文件即可;
2.复制数据库驱动的jar包坐标
3.导入mybatis的核心配置文件;
1.告诉mybatis我们自定义的与数据库中的表对应的模型类在哪里;
2.告诉mybatis连接数据库的相关信息;
3.告诉mybatis我们的sql语句写在哪个文件中;
4.导入一个专门存放sql语句的文件;(mapper映射文件)
5.在代码中获取mybatis的核心类对象,并通过对象,获取sql语句并执行即可;
3.导入配置文件:mybatis-config.xml
![]()
Mapper:DeptMapper.xml
4.导入存放sql文件语句:
![]()
5.写代码:
模板:
没有创建mapper接口之前:
/* 练习mybatis入门 */ public class MyTest { @Test public void hello() throws IOException { //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<Dept> objects = sqlSession.selectList("a.b.chaAll"); System.out.println(objects); // 4: 释放资源 sqlSession.close(); } }
常见BUG:
![]()
![]()
入门:
以上完成mybatis代码的入门 加以强练
Mybatis操作DML语句:
Mybatis配置文件实现CRUD:
增删改查操作:
查询:
查询所有数据
查询详情
条件查询
添加:
修改
修改全部字段
修改动态字段
删除:
删除一个
批量删除
一、环境准备:
1.数据库表(tb_brand)及数据准备
2.实体类 Brand:在
com...pojo
包下创建 Brand 实体类。
3.编写测试用例 :测试代码需要在
test/java
目录下创建包及测试用例4.安装 MyBatisX 插件 :MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生
主要功能:XML映射配置文件 和 接口方法 间相互跳转
根据接口方法生成 statement
安装方式:
效果:
·
接口代理:
是:程序员只需要按照mybatis的要求,写接口和接口对应的映射文件即可,
无需写接口对应的实现类,将来可以直接通过mybatis的核心对象获取接口的实现类
对象,再通过实现类对象调用方法即可。
二、查询所有数据:
1.编写接口方法:Mapper接口
参数:无
查询所有数据功能是不需要根据任何条件进行查询的,所以此方法不需要参数。
![]()
结果:List<Brand>
我们会将查询出来的每一条数据封装成一个
Brand
对象,而多条数据封装多个
Brand
对象,需要将这些对象封装到List集合中返回。
执行方法、测试
1.编写接口方法:
在
com...mapper
包写创建名为BrandMapper
的接口。并在该接口中定义
List<Brand> selectAll()
方法。
2.编写SQL语句:
在
reources
下创建com/.../mapper
目录结构,并在该目录下创建名为
BrandMapper.xml
的映射配置文件
3.编写测试方法:在
MybatisTest
类中编写测试查询所有的方法
4.执行测试方法结果如下:
问题:
![]()
有些数据封装成功了,而有些数据并没有封装成功
5.1起别名解决:
我们可以在写sql语句时给这两个字段起别名,将别名定义成和属性名一致即可。
5.2使用resultMap解决:在映射配置文件中使用resultMap定义字段和属性的映射关系
resultMap和resultType的区别:
resultType是:自动封装
resultMap是:手动指定表中哪个字段,封装到JavaBean的哪个成员变量中
所以相当于手动封装 。
只有在多表 查询的时候才会使用resultMap,单表查询不需要使用它
如果数据库结果集中的列名和要封装实体的属性名完全一样的话用:resultType
如果数据库结果集中的列名和要封装实体的属性名有不一致的情况用:resultMap 通过 resultMap手动建立对象关系映射,要配置一下表和类的一一对应关系,
所以说就算你的字段名和你的实体类的属性名 不一样 也没有关系,
都会给你映射出来 。
小结:实体类属性名和数据库表列名不一致,不能自动封装数据
1. 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样
2.可以定义: <sql>片段,提升复用性
3.resultMap:定义<resultMap> 完成不一致的属性名和列名的映射
4.而我们最终选择使用: resultMap的方式。
三、查询详情 :
1.创建接口:
2.自动生成xml映射,编写SQL语句:
ParameterType
:来指定参数类型。只不过该属性都可以省略3.编写测试方法:
mybatis提供了两种参数占位符:
#{} :执行SQL时,会将 #{} 占位符替换为?,
将来自动设置参数值。从上述例子可以看出使用#{}
底层使用的是
PreparedStatement
${} :拼接SQL。底层使用的是
Statement
,会存在SQL注入问题。
如下图:将映射配置文件中的 #{} 替换成 ${} 来看效果
转义字符:<
<
的转义字符<![CDATA[内容]]>
![]()
![]()
多条件查询:
1.创建接口 :
2.自动生成xml映射,编写SQL语句:
3.编写测试方法:
动态SQL:
2.自动生成xml映射,编写SQL语句:
3.编写测试方法:针对上述的需要,Mybatis对动态SQL有很强大的支撑:
1.if
2.choose (when, otherwise)
3.trim (where, set)
4.foreach
if 标签:条件判断
test 属性:逻辑表达式
如上的这种SQL语句就会根据传递的参数值进行动态的拼接
如果此时status和companyName有值那么就会值拼接这两个条件。
执行结果如右:
但是它也存在问题,如果此时给的参数值是:
拼接的SQL语句就变成了:
select * from tb_brand where and company_name like ? and brand_name like ?
而上面的语句中 where 关键后直接跟 and 关键字,这就是一条错误的SQL语句。
这个就可以使用 where 标签解决
where 标签 :
作用:
1.替换where关键字
2.会动态的去掉第一个条件前的 and
3.如果所有的参数没有值则不加where关键字
注意:需要给每个条件前都加上 and 关键字
单个条件动态SQL):
如上图所示,在查询时只能选择
品牌名称
、当前状态
、企业名称
这三个条件中的一个,但是用户到底选择哪儿一个,我们并不能确定。这种就属于单个条件的动态SQL语句。
这种需求需要使用到 :
choose(when,otherwise)标签
实现而
choose
标签类似于Java 中的switch语句1.创建接口:
2.自动生成xml映射,编写SQL语句:
3.编写测试方法:
![]()
![]()
四、添加数据 :
![]()
如上图是我们平时在添加数据时展示的页面,而我们在该页面输入想要的数据后添加
提交
按钮,就会将这些数据添加到数据库中。接下来我们就来实现添加数据的操作。
1.创建接口:
![]()
2.自动生成xml映射,编写SQL语句:
3.编写测试方法:
![]()
4.添加-主键返回:
在数据添加成功后,有时候需要获取插入数据库数据的主键(主键是自增长)。
比如:添加订单和订单项,如下图就是京东上的订单
![]()
订单数据存储在订单表中,订单项存储在订单项表中。
在 insert 标签上添加如下属性:
useGeneratedKeys:是够获取自动增长的主键值。true表示获取
keyProperty :指定将获取到的主键值封装到哪儿个属性里
五、修改 :
![]()
如图所示是修改页面,用户在该页面书写需要修改的数据,点击
提交
按钮,就会将数据库中对应的 数据进行修改。注意一点,如果哪儿个输入框没有输入内容,我们是将表中数据对应字段值替换为空白还是保留字段
之前的值?答案肯定是保留之前的数据。
1.创建接口:
![]()
2.自动生成xml映射,编写SQL语句:
set 标签可以用于动态包含需要更新的列,忽略其它不更新的列。
3.编写测试方法:
从结果中SQL语句可以看出,只修改了
status
字段值,因为我们给的数据中只给Brand实体对象的
status
属性设置值了。这就是
set
标签的作用。 五、删除 :
如上图所示,每行数据后面都有一个
删除
按钮,当用户点击了该按钮,就会将改行数据删除掉。那我们就需要思考,这种删除是根据什么进行删除呢?是通过主键id删除,
因为id是表中数据的唯一标识。
1.创建接口:
2.自动生成xml映射,编写SQL语句:
3.编写测试方法:
批量删除:
![]()
如上图所示,用户可以选择多条数据,然后点击上面的
删除
按钮,就会删除数据库中对应的多行数据。
1.创建接口:
2.自动生成xml映射,编写SQL语句:
foreach标签:用来迭代任何可迭代的对象(如数组,集合)
collection 属性: mybatis会将数组参数,封装为一个Map集合
默认:array = 数组
使用@Param注解改变map集合的默认key的名称
item 属性:本次迭代获取到的元素。
separator 属性:集合项迭代之间的分隔符。
foreach
标签不会错误地添加多余的分隔符。 也就是最后一次迭代不会加分隔符。
open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次
3.编写测试方法:
Mybatis参数传递:
1.多个参数
2.单个参数:单个参数又可以是如下类型
POJO 类型
Map 集合类型
Collection 集合类型
List 集合类型
Array 类型
其他类型
1.多个参数:就是接收两个参数,而接收多个参数需要使用
@Param
注解
我们在接口方法中定义多个参数,Mybatis 会将这些参数封装成 Map 集合对象,
值就是参数值,而键在没有使用
@Param
注解时有以下命名规则:以 arg 开头 :第一个参数就叫 arg0,第二个参数就叫 arg1,以此类推
map.put("arg0",参数值1);
map.put("arg1",参数值2);
以 param 开头 : 第一个参数就叫 param1,第二个参数就叫 param2,依次类推
map.put("param1",参数值1);
map.put("param2",参数值2);
验证:
运行结果:
在映射配合文件的SQL语句中使用用
arg
开头的和param
书写,代码的可读性会变的特别差,此时可以使用
@Param
注解。在接口方法参数上:使用
@Param
注解,Mybatis 会将arg
开头的键名替换为对应注解的属性值。验证:在
UserMapper
接口中定义如下方法,在username
参数前加上@Param
注解
![]()
结论:以后接口参数是多个时,在每个参数上都使用
@Param
注解。这样代码的可读性更高2.单个参数:
POJO 类型:直接使用。要求
属性名
和参数占位符名称
一致Map 集合类型:直接使用。要求
map集合的键名
和参数占位符名称
一致Collection 集合类型:Mybatis 会将集合封装到 map 集合中,如下:
可以使用
@Param
注解替换map集合中默认的 arg 键名
可以使用
@Param
注解替换map集合中默认的 arg 键名
![]()
可以使用
@Param
注解替换map集合中默认的 arg 键名
![]()
![]()
Mybatis注解开发:
优势:代码简单,可以不用写xml文件;直接把sql语句使用mybatis提供的注解写在接口的方法上面即可
缺点:当需要使用动态sql拼接的时候,不方便;
建议:xml和注解混合使用,如果是简单的CRUD建议使用注解,如果需要动态拼接sql建议使用xml;
代码步骤:
导入mybatis相关坐标;
编写核心配置文件
驼峰命名
JavaBean别名
数据库连接信息
扫描接口所在的包
直接写接口,并在接口的方法上面写注解,注解里面写sql即可;