目录
3.编写MyBatis核心配置文件 -->替换连接信息 解决硬编码问题
4.编写SQL映射文件 -->同一管理sql语句,解决硬编码问题
一、Maven
Maven是专门用于管理和构建Java项目的开发工具,他的主要功能有:
->提供了一套标准化的项目结构
->提供了一套标准化的建构流程(编译、测试、打包、发布....)
->提供了一套依赖管理机制
依赖管理
->依赖管理其实就是管理你项目所依赖的第三方资源(jar包、插件....)
1.Maven使用标准的坐标配置来管理各种依赖
2.只需要简单的配置就可以完成依赖管理
1.Maven简介
->Apache Maven是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建,报告和文档
仓库分类
->本地仓库:自己计算机上的一个目录
->中央仓库:由Maven团队维护的全球唯一仓库 地址:https://repo1.maven.org/maven2/
->远程仓库(私服):一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖的jar包后,首先会查找本地仓库中是否有对应的jar包
如果有,则在项目中直接引用
如果没有,则去中央仓库下载对应的jar包到本地仓库
还可以搭建远程仓库,将来jar包的查找顺序则变为
本地仓库->远程仓库->中央仓库
2.Maven安装配置
1.解压apache-maven-3.6.1.rar即完成安装
2.配置环境变量MAVEN-HOME为安装路径的bin目录
cmd命令窗口输入:mvn -version 测试是否配置成功
3.配置本地仓库:修改conf/setting.xml中的<localRepository>为一个指定目录

4.配置阿里云私服:修改conf/setting.xml中的<mirrors>标签,为其添加如下子标签
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
3.Maven的基本使用
Maven常用命令
1.compile:编译
2.clean:清理
3.test:测试
4.package:打包
5.install:安装
Maven生命周期
Maven构建项目生命周期描述的是一次构架过程经历了多少个事件
Maven对项目构建的生命周期分为三套
->clean:清理工作
->default:核心工作,例如编译,测试,打包,安装等
->site:产生报告,发布站点等

4.IDEA配置Maven
IDEA配置Maven环境
1.选择IDEA中File--->Settings

2.搜索Maven

3.设置IDEA使用本地安装的Maven,并修改配置文件路径


Maven坐标详解
什么是坐标?
Maven中的坐标是资源的唯一标识
使用坐标来定义项目或引入项目中需要的依赖
Maven坐标主要组成
groupld:定义当前Maven项目隶属于组织名称(通常是域名反写,例如:com.ui)
artifactld:定义当前Maven项目名称(通常是模块名称,例如order-service)
version:定义当前项目版本号
IDEA创建Maven项目
1.创建模块,选择Maven,点击Next
2.填写模块名称,坐标信息,点击finish,创建完成
3.编写,运行
IDEA导入Maven项目
1.选择maven面板,点击+
2.选择对应项目的pom.xml文件,双击
3.如果没有Maven面板,选择View->Appearance->Tool Windows Bars
5.依赖管理
使用坐标导入jar包
1.在pom.xml中编写<dependencies>标签
2.在<dependencies>标签中使用<dependency>引入坐标
3.定义坐标的groupld,artifactld,version
4.点击刷新按钮,使坐标生效
<!--导入mysql驱动jar包-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>
使用坐标导入jar包 -快捷方式
1.在pom.xml中按alt+insert,选择Dependency
2.在弹出的面板中搜索对应选项,然后双击选中对应坐标
3.点击刷新按钮,使其生效
依赖范围
通过设置坐标的依赖范围(scope),可以设置对应jar包的作用范围:编译环境,测试环境,运行环境
<dependency>
<groupId>junit</groupId>
<artifactID>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>

<scope>默认值:compile
二、MyBatis
MyBatis入门学习:https://mybatis.net.cn/
什么是MyBatis?
->MyBatis是一款优秀的持久层框架,用于简化JDBC开发
->MyBatis本事Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Giuhub
->官网:https://mybatis.org/mybatis-3/zh/index.html
持久层
负责将数据到保存到数据库的那一层代码
JavaEE三层架构:表现层、业务层、持久层
框架
框架就是一个半成品软件,是一套可重用,通用的,软件基础代码模型
在框架的基础之上构建软件编写更加高效,规范,通用,可扩展
1.MyBatis快速入门
1.创建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', '男', '西安');
2.创建模块,导入坐标
<dependencies>
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<!-- junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- 添加slf4j日志api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.5</version>
</dependency>
<!-- 添加logback-classic依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
导入logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.itheima" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
3.编写MyBatis核心配置文件 -->替换连接信息 解决硬编码问题
新建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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql映射文件-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
4.编写SQL映射文件 -->同一管理sql语句,解决硬编码问题
新建UserMapper.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">
<!--
namespace:名称空间
-->
<mapper namespace="test">
<select id="selectAll" resultType="com.itheima.pojo.User">
select * from tb_user;
</select>
</mapper>
5.编码
1.定义POJO类
2.加载核心配置文件,获取SqlSessionFactory
3.获取SqlSession对象,执行sql语句
4.释放资源
package com.itheima;
import com.itheima.pojo.User;
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 MyBatisDemo {
/*
MyBatia快速入门
*/
public static void main(String[] args) throws IOException {
//1.加载MyBatis核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql语句
List<User> users = sqlSession.selectList("test.selectAll");
System.out.println(users);
//4.释放资源
sqlSession.close();
}
}
2.Mapper代理开发
目的:解决原生方式中的硬编码 简化后期执行SQL
使用Mapper代理方式完成入门案例
1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

2.设置SQL映射文件的namespace属性为Mapper接口全限定名
修改UserMapper.xml中的namespace
<mapper namespace="com.itheima.Mapper.UserMapper">
3.在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
package com.itheima.Mapper;
import com.itheima.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> selectAll();
}
修改mybatis-config.xml中加载sql映射文件的路径
<mappers>
<!--加载sql映射文件-->
<mapper resource="com/itheima/Mapper/UserMapper.xml"/>
</mappers>
4.编码
1.通过SqlSession的getMapper方法获取Mapper接口代理对象
2.调用对应方法完成sql执行
细节:如果Mapper接口名称和SQL映射文件名称相同,并且在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
<mappers>
<package name = "com.itheima.Mapper"/>
</mappers>
package com.itheima;
import com.itheima.Mapper.UserMapper;
import com.itheima.pojo.User;
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 MyBatisDemo2 {
/*
MyBatia代理开发
*/
public static void main(String[] args) throws IOException {
//1.加载MyBatis核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3.执行sql语句
//List<User> users = sqlSession.selectList("test.selectAll");
//3.1获取UserMapper接口代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();
System.out.println(users);
//4.释放资源
sqlSession.close();
}
}
3.MyBatis核心配置文件
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
- configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- databaseIdProvider(数据库厂商标识)
- mappers(映射器)
类型别名
<typeAliases>
<package name = "com.itheima.pojo"/>
</typeAliases>
细节:配置各个标签时,需要遵守前后顺序
4.查询结果映射
<!--resultMap -->
<!--1.定义<resultMap>标签-->
<!--2.使用resultMap属性替换resultType属性 -->
<!--
id:唯一标识
type:映射的类型,支持别名
-->
<!--
id:完成主键字段的映射
column:表的列名
property:实体类的属性名
result:完成一般字段的映射
-->
<resultMap id="brandResultMap" type="brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<select id="selectAll" resultMap="brandResultMap">
select
*
from tb_brand;
</select>
5.参数占位符
1.#{}:会将其替换为?,为了防止sql注入
2.${}:拼sql,会存在sql注入问题
3.使用时机:
*参数传递时:#{}
*表名或列名不固定的情况下:${}会存在sql注入问题
参数类型:parameterType 可省略
*特殊字符处理
1.转义字符
2.CDATA区
例如小于号:<
<select id="selectById" resultMap="brandResultMap">
select *
from tb_brand where id <![CDATA[
<
]]> #{id};
</select>
<select id="selectById" resultMap="brandResultMap">
select *
from tb_brand where id < #{id}
</select>
6.SQL语句设置多个参数的几种方式
1.散装参数
需要使用@Param("SQL中的参数占位符名称")
2.实体类封装参数
只需要保证SQL中的参数名和实体类属性名对应即可
3.map集合
只需要保证SQL中的参数名和map集合的键的名称对应即可
7.动态SQL
https://mybatis.net.cn/dynamic-sql.html
SQL语句会随着用户的输入或外部条件的变化而变化,我们称为动态SQL
MyBatis对动态SQL有很强大的支撑
->if
->choose(when,otherwise)
->trim(where,set)
->foreach
1.多条件动态查询
if:用于判断参数是否有值,使用set属性进行条件判断
存在的问题:第一个条件不需要逻辑运算符
解决方案:
1)使用恒等式让所有条件格式都一样 1=1
2)<where>标签替换where关键字
2.单条件动态查询
从多个条件中选择一个
choose(when,otherwise)选择,类似于Java中的Switch语句
<selectid="selectByConditionSingle" resultMap="brandResultMap">
select *
from tb_brand
<where>
<choose><!--类似于switch-->
<when test="status != null"> <!--类似于case-->
status = #{status}</when>
<when test="companyName != null and companyName !="">
company_name like #{companyName}</when>
<when test="brandName != null and brandName !=" ">
brand name like #{brandName}</when>
<otherwise> <!--类似于default-->
1= 1
</otherwise>
</choose>
<where>
</select>
3.返回添加数据的主键
<insert uesGeneratedKeys="true" keyProperty="id">
8.MyBatis参数传递
MyBatis接口方法中可以接受各种各样的参数,MyBatis底层对于这些参数进行不同的封装处理方式
单个参数
1.POJO类型:直接使用,实体类属性名和参数占位符名称一致
2.Map集合:直接使用,键名和参数占位符一致
3.Collection:封装为Map集合
map.put("collection",collection集合);
map.put("arg0",collection集合);
4.List:封装为Map集合
map.put("collection",list集合);
map.put("list",list集合);
map.put("arg0",list集合);
5.Array:封装为Map集合
map.put("array",数组);
map.put("arg0",数组);
6.其他类型:直接使用
多个参数
封装为Map集合
map.put("arg0",参数值1);
map.put("parm1",参数值1);
map.put("arg1",参数值2);
map.put("parm2",参数值2);
建议:将来都使用@Param注解来修改Map集合中默认的键名,并使用修改后的名称来获取值,这样可读性更高
9.注解开发
使用注解开发会比配置文件开发更加方便
@Select("select * from tb_user where id = #{id}")
public User selectById(int id);
查询:@Select
添加:@Insert
修改:@Update
删除:@Update
提示:
->注解完成简单功能
->配置文件完成复杂功能
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。 换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和 XML 的语句映射方式间自由移植和切换。
mybatis-demo源码:https://download.csdn.net/download/m0_71119554/87356135


被折叠的 条评论
为什么被折叠?



