目录
1.软件框架技术概述:
1.1为什么会出现软件框架技术?
随着业务发展,软件系统变得越来越复杂,如果所有的软件都从0功能一点点开发,那就会是一个漫长又繁琐的事情,此外,团队开发协作时,由于没有统一的调用规范,系统会出现大部分重复的代码。框架的出现,它实现了很多基础功能,开发人员不需要关注底层实现和构建,只需要关注所需要的业务逻辑即可。
注:当前市场java主流框架 Spring SpringMVC MyBatis 还有springbook(因为简单,用的比较多)
1.2框架概述
软件框架是一种通用的,可复用的软件环境,他提供特定的功能,助力软件的开发工作。
软件框架可以形象的比喻成人们在盖楼时,用梁+柱子+成栋墙搭建起来的钢筋混凝土结构的建筑框架,他是整个建筑的骨架,而软件实现的功能,也就像是在这个建筑框架所要实现的不同类型,功能的房子,比如健身房,酒店,饭店。。。
1.3框架的优势
1.3.1早期开发javaEE应用开发中,企业开发人员用的是 JSP + Servlet 技术进行软件应用的开发,但使用 JSP + Servlet 开发代码有以下弊端:
1.软件可维护性差
使用 jsp + Servlet 开发 ,分层不够清晰,业务逻辑无法实现单独分离出来,后期维护困难。
2.代码重用性低
如果不使用框架,每次开发系统就会投入人力,物力来进行底层搭建,企业开发效率低。
1.3.2现在使用框架的好处。
1.提高开发效率
如果使用成熟,稳健的框架,那么有一些通用的基础工作,比如事务处理,安全性,数据流控制等,就可以交给框架来管理,程序员只需要集中精力完成系统业务逻辑设计即可,从而降低了开发难度。
2.提高代码规范和可维护性
成熟的框架定义了一些规范,当多人开发的时候,规范就相当重要。
3.提高软件性能
使用软件框架技术开发,可以减少代码重复赘余,并且避免了类与类之间的耦合性,所需对象讲给Spring管理,就可以实现解耦。MyBatis框架提供了XML形式开发,支持动态sql,避免了程序员在类中编写sql语句。
在学习框架之前,我们来学习什么是maven。也可以通过它进行了解史上最全安装Maven教程_小Du猿的博客-CSDN博客_安装maven
Maven的安装与配置_DanielMaster的博客-CSDN博客_maven安装与配置
超级详细的Maven使用教程_进修的CODER的博客-CSDN博客_maven
这三个可以说是maven安装配置比较详细的了,可以细看看,我在这里就 带大家了解一下
2.Maven
2.1.maven是什么
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
-
提供了一套标准化的项目结构
-
提供了一套标准化的构建流程(编译,测试,打包,发布……)
-
提供了一套依赖管理机制
-
标准化的项目结构:
项目结构我们都知道,每一个开发工具(IDE)都有自己不同的项目结构,它们互相之间不通用。我再eclipse中创建的目录,无法在idea中进行使用,这就造成了很大的不方便,如下图:前两个是以后开发经常使用的开发工具
-
而Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样,所以IDE创建的Maven项目可以通用。如下图右边就是Maven构建的项目结构。
通过上面的描述大家只需要知道Maven是一个工具即可。Apache 是一个开源组织,将来我们会学习很多Apache提供的项目。
2.2maven依赖管理
所谓依赖,就是管理项目所依赖的的第三方资源(就是所谓的jar包),
以前的做法:
而Maven使用标准的 ==坐标== 配置来管理各种依赖,只需要简单的配置就可以完成依赖管理。(如图所示)
如上图右边所示就是mysql驱动包的坐标,在项目中只需要写这段配置,其他都不需要我们担心,Maven都帮我们进行操作了。
2.3仓库
大家想想这样的场景,我们创建Maven项目,在项目中使用坐标来指定项目的依赖,那么依赖的jar包到底存储在什么地方呢?其实依赖jar包是存储在我们的本地仓库中。而项目运行时从本地仓库中拿需要的依赖jar包。
仓库分类:
-
本地仓库:自己计算机上的一个目录
-
中央仓库:由Maven团队维护的全球唯一的仓库
-
远程仓库(私服):一般由公司团队搭建的私有仓库
今天我们只学习远程仓库的使用,并不会搭建。
当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:
-
如果有,则在项目直接引用;
-
如果没有,则去中央仓库中下载对应的jar包到本地仓库。
-
如果还可以搭建远程仓库,将来jar包的查找顺序则变为:
-
2.4maven的安装与配置(必须配置好)
这个就可以根据上边发的路径进行安装配置。还有idea 集成maven(idea配置maven)
2.5 依赖范围(了解)
通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境。
如下图所示给 junit
依赖通过 scope
标签指定依赖的作用范围。 那么这个依赖就只能作用在测试环境,其他环境下不能使用。
那么 scope
都可以有哪些取值呢?
依赖范围 | 编译classpath | 测试classpath | 运行classpath | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | logback |
test | - | Y | - | Junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
system | Y | Y | - | 存储在本地的jar包 |
-
compile :作用于编译环境、测试环境、运行环境。
-
test : 作用于测试环境。典型的就是Junit坐标,以后使用Junit时,都会将scope指定为该值
-
provided :作用于编译环境、测试环境。我们后面会学习
servlet-api
,在使用它时,必须将scope
设置为该值,不然运行时就会报错 -
runtime : 作用于测试环境、运行环境。jdbc驱动一般将
scope
设置为该值,当然不设置也没有任何问题
注意:如果引入坐标不指定
scope
标签时,默认就是 compile 值。以后大部分jar包都是使用默认值。
maven是什么? 一句话,就是自动化构建工具,用来构建java的项目,和依赖管理。
2.6 依赖传递与冲突解决
2.6.1 什么是依赖?
在maven的pom文件中添加第三方库坐标,引入第三方依赖。
2.6.2 什么是依赖传递?
项目依赖了a a又依赖了b 此时会把b传递给项目。
2.6.3 什么是依赖冲突?
项目A和B ,
A依赖了C-1.1,D-1.1
B依赖了C-1.2, D-1.2,E-1.2
此时CD库存存在版本冲突。
2.6.4 解决冲突
1.maven 自带调优原则。
2.两条原则:
1.第一声明者优先原则:先导入的优先级更高
2.路径近者优先。
3.MyBatis
3.1mybatis概述:
java程序依靠java数据库连接(jdbc)实现对数据库的操作,大型项目中,与数据库连接比较频繁,数据量读写量较大,仅仅依靠传统jdbc无法满足,因此就出现 Mybatis 来实现操作。
-
MyBatis 是一款优秀的==持久层框架==,用于简化 JDBC 开发
-
MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github
持久层:
负责将数据到保存到数据库的那一层代码。
以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。
JavaEE三层架构:表现层、业务层、持久层
三层架构在后期会给大家进行讲解,今天先简单的了解下即可。
传统JDBC缺点:
-
硬编码
-
注册驱动、获取连接
上图标1的代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。
-
SQL语句
上图标2的代码。如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。
-
-
操作繁琐
-
手动设置参数
-
手动封装结果集
上图标4的代码是对查询到的数据进行封装,而这部分代码是没有什么技术含量,而且特别耗费时间的。
-
MyBatis优化:
-
硬编码可以配置到==配置文件==
-
操作繁琐的地方mybatis都==自动完成==
3.2MyBatis快速开发
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.创建maven模块
3.导入坐标
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--
mybatis
需要导入哪些依赖
lombok
mysql
junit
mybatis
导入日志包 复制粘贴 就是可以看到 底层数据库运行的状态
-->
<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>5.1.46</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>1.7.20</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>
<!-- 添加lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
4.创建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 + '\'' +
'}';
}
}
5.接下来就是我们的重点(配置文件)
写在这里
5.1:编写 MyBatis 核心配置文件 -- > 替换连接信息 解决硬编码问题
mybatis-config是Mybatis核心配置文件。。。
<?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> <!--给pojo包起别名--> <!--<typeAliases>--> <!--<package name="com.tjtc.pojo"/>--> <!--</typeAliases>--> <!-- environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的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="root"/> </dataSource> </environment> </environments> <mappers> <!--加载sql映射文件 我们sql语句 是不是写到文件中了 xml的文件中了 你得告诉核心配置文件 你的sql在哪 --> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
解释入门案例中相对来说 重要的
mybatis-config.xml 核心配置文件
配置了数据库的四大属性信息.
数据库驱动 ---代表我们连接哪个数据库
mysql 5.5以上版本 com.mysql.jdbc.Driver
mysql 8以上版本 com.mysql.cj.jdbc.Driver
数据库url
跟以前一致, jdbc:mysql:///你要连接的数据库?useSSL=false
数据库用户名
root 学习
企业 用分配给你的
数据库密码
自己定义的
企业 分配给你的
关联了 我们 sql语句 所在的xml文件
<mappers></mappers> 映射的意思
<mapper resources="XxxMapper.xml"></mapper>
每一个mapper就代表着每一个 sql语句文件.
咱们数据库中的表 是不是 已经准备 和 我们 java中的类 产生映射!!
设计 pojo类的时候,表中有什么字段叫什么名,你pojo类中就得有什么属性,叫什么名.
5.2 SQL 映射文件 XXXMaper.xml (这里是UserMapper)
通过XMl配置的话 会有好多映射文件 ,因为一个项目要操作好多表。
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace 这个定义 当前sql语句的xml的 名字 这个名字 具备唯一性 --> <mapper namespace="test"> <!--这是写sql语句的位置--> <!-- 帮我完成 查询所有功能 id 代表当前这个sql语句的唯一识别 resultType 把查询出来的每一条记录 封装成什么? resultType="com.tjtc.pojo.User" 把查询出来的每一条记录封装成 User对象 --> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> <!--<update id=""></update>--> <!--<insert id=""></insert>--> <!--<delete id=""></delete>--> </mapper>
XxxMapper.xml是 SQL映射文件---第一关注的 namespace属性 sql语句结构
就是把操作某张表的所有sql语句,进行统一管理.
比如管理操作user表的映射文件,叫 UserMapper.xml,管理brand表,BrandMapper.xml .
XxxMapper.xml里面放着是不是 操作 对应表的语句..... 映射关系 .
<mapper>标签中 它有个 namespase属性 名称空间 代表当前这个Mapper.xml 自己的名字.
每一个mapper的名字都是独一无二.
写查询sql <select></select>
<insert></insert> 增加 <update>修改 <delete>删除
<select id="来表示当前sql语句在当前mapper中的唯一性"> 写sql语句</select>
做查询是有返回内容的,
返回的内容 要封装成什么结果 可以采用
resultType属性 来确定
resultType="com.itheima.pojo.User"
把查询出来的每一条记录 中的数据 映射 称为 com.itheima.pojo包下的User类型对象
6.测试:
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
//测试查询所有
@Test
public void selectAllTest() throws IOException {
// 1:加载核心配置文件
String resource = "mybatis-config.xml";
// 下面操作 是官方给我们写好的 大家尽情的复制粘贴
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建一个工程队 完成 一个工厂的创建 (这个工厂里面是来造操作 sql语句的对象的)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//有了这个创建 sql语句对象 工厂
// 从厂子里要对象 这个对象是用来执行sql语句的
SqlSession sqlSession = sqlSessionFactory.openSession();
//上面四句话复制粘贴
// 你想让 sqlSession 执行哪个sql语句
// selectList() 查询多个
// 传递的参数u是 把你需要执行什么sql语句
// sql语句位置通过字符串形式告知 "namespace名字.id名字"
List<User> users = sqlSession.selectList("test.selectAll");
//输出 users
System.out.println(users);
//把 sqlSession归还连接池
sqlSession.close();
}
}
以上就是MyBatis入门案例 打不来没关系,接下来是比较重要的了,就是Mapper代理开发
3.3Mapper代理开发***(重要)
使用Mapper代理要求
使用Mapper代理方式,必须满足以下要求:
-
定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下图:
这个同一目录,是编译后class文件后的同一目录
设置SQL映射文件的namespace属性为Mapper接口全限定名
在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
namespace="" 跟接口的 包名+类名 一致
id值 跟 接口方法名一致 参数类型 跟接口方法参数类型一致 返回值 跟接口的方法的返回值一致(resultType)
Mapper代理开发:测试:
@Test
public void selectAllTest1() throws IOException {
// 1:加载核心配置文件
String resource = "mybatis-config.xml";
// 下面操作 是官方给我们写好的 大家尽情的复制粘贴
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建一个工程队 完成 一个工厂的创建 (这个工厂里面是来造操作 sql语句的对象的)
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//有了这个创建 sql语句对象 工厂
// 从厂子里要对象 这个对象是用来执行sql语句的
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.selectAll();
System.out.println(users);
}
结果:
Mapper代理开发 就好多练练
3.4mybatis开发注意细节
1.起别名:实体类属性名 和 数据库表列名 不一致,不能自动封装数据
2.
parameterType使用
对于有参数的mapper接口方法,我们在映射配置文件中应该配置 ParameterType
来指定参数类型。只不过该属性都可以省略。(如果是多表查询的时候可能要用)
3.特殊字段处理:
4.单个参数
-
POJO 类型
直接使用。要求
属性名
和参数占位符名称
一致 -
Map 集合类型
直接使用。要求
map集合的键名
和参数占位符名称
一致 -
Collection 集合类型
底层可以理解为Mybatis 会将集合封装到 map 集合中,如下:
map.put("arg0",collection集合);
map.put("collection",collection集合; 推荐
==可以使用
@Param
注解替换map集合中默认的 arg 键名。== -
List 集合类型
底层可以理解为Mybatis 会将集合封装到 map 集合中,如下:
map.put("arg0",list集合);
map.put("collection",list集合);
map.put("list",list集合); 推荐
==可以使用
@Param
注解替换map集合中默认的 arg 键名。== -
Array 类型
底层可以理解为Mybatis 会将集合封装到 map 集合中,如下:
map.put("arg0",数组);
map.put("array",数组); 推荐
==可以使用
@Param
注解替换map集合中默认的 arg 键名。== -
其他类型
比如int类型,
参数占位符名称
叫什么都可以。尽量做到见名知意
5.多个参数 @Param
代码验证:
-
如下面的代码,就是接收两个参数,而接收多个参数需要使用
@Param
注解,那么为什么要加该注解呢?这个问题要弄明白就必须来研究Mybatis 底层对于这些参数是如何处理的。user select(@Param("name") String name,@Param("password") String password);
<select id="select" resultType="user"> select * from tb_user where name=#{name} and password=#{password} </select>
我们在接口方法中定义多个参数,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);
-
在
UserMapper
接口中定义如下方法User select(String name,String password);
-
在
UserMapper.xml
映射配置文件中定义SQL<select id="select" resultType="user"> select * from tb_user where name=#{arg0} and password=#{arg1} </select>
或者
<select id="select" resultType="user"> select * from tb_user where name=#{param1} and password=#{param2} </select>
==结论:以后接口参数是多个时,在每个参数上都使用
@Param
注解。这样代码的可读性更高。==
6.注解实现CRUD
@Select(value = "select * from tb_user where id = #{id}")
public User selectById(int id);
==注意:==
注解是用来替换映射配置文件方式配置的,所以使用了注解,就不需要再映射配置文件中书写对应的
statement
Mybatis 针对 CURD 操作都提供了对应的注解,已经做到见名知意。如下:
查询 :@Select
添加 :@Insert
修改 :@Update
删除 :@Delete
4.mybatis综合案例
4.1,目录结构
4.2在pom.xml中导入坐标
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--<dependency>-->
<!--<groupId>junit</groupId>-->
<!--<artifactId>junit</artifactId>-->
<!--<version>4.12</version>-->
<!--<scope>test</scope>-->
<!--</dependency>-->
<!--
属性配置
maven.compiler.source maven编译源码环境 是jdk8
maven.compiler.target maven目标代码运行环境 jdk8
<project.build.sourceEncoding 当前模块中 源码的编码集 utf-8
-->
<!--
mybatis
需要导入哪些依赖
lombok
mysql
junit
mybatis
导入日志包 复制粘贴 就是可以看到 底层数据库运行的状态
-->
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<!--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>5.1.46</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>1.7.20</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>
4.3mybatis核心配置文件
<?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">
<!--
这个配置文件中什么需要我们填写
起别名 <typeAliases> 每次复制之后要进行检查
连接池 四个信息 dataSource 每次复制之后要进行检查
映射文件 <mappers> 关注包
-->
<configuration>
<!--给类型起别名-->
<typeAliases>
<package name="com.tjtc.pojo"/>
</typeAliases>
<!--
environments 环境们
default 选择哪一个环境
environment 环境 id代表不同的环境id
-->
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--
transactionManager 事务管理器
当前框架中的事务管理 谁来管理
type="JDBC" 使用JDBC中的事务管理操作(推荐)
MANAGED 自己管理事务
-->
<transactionManager type="JDBC"/>
<!--
mybatis 自带连接池
type="POOLED" 你用连接
type="UNPOOLED" 不用连接池
type="JNDI" 连接池是一个服务器 以客户端身份连接 已过时。
-->
<dataSource type="POOLED">
<!--
driver 驱动 连接那种数据库就写哪种数据库的驱动
url 连接哪个数据库
-->
<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="root"/>
</dataSource>
</environment>
</environments>
<!--
映射文件
咱们的sql在mybatis都是写在 XxxMapper.xml中的
mappers
里面的mapper就代表着 找到 咱们 的sql文件
-->
<mappers>
<package name="com.tjtc.mapper"/>
</mappers>
</configuration>
4.4 打印日志文件
<?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.tjtc" 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>
4.5数据库
use mybatis;
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
-- id 主键
id int primary key auto_increment,
-- 品牌名称
brandName varchar(20),
-- 企业名称
companyName varchar(20),
-- 排序字段
ordered int,
-- 描述信息
description varchar(100),
-- 状态:0:禁用 1:启用
status int
);
-- 添加数据
insert into tb_brand (brandName, companyName, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
('小米', '小米科技有限公司', 50, 'are you ok', 1);
4.6实体类
package com.tjtc.pojo;
public class Brand {
private Integer id;
private String brandName;
private String companyName;
private Integer ordered;
private String description;
private Integer status;
public Brand() {
}
public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {
this.id = id;
this.brandName = brandName;
this.companyName = companyName;
this.ordered = ordered;
this.description = description;
this.status = status;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBrandName() {
return brandName;
}
public void setBrandName(String brandName) {
this.brandName = brandName;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public Integer getOrdered() {
return ordered;
}
public void setOrdered(Integer ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "Brand{" +
"id=" + id +
", brandName='" + brandName + '\'' +
", companyName='" + companyName + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status +
'}';
}
}
4.7mapper接口
package com.tjtc.mapper;
import com.tjtc.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BrandMapper {
// 查询 所有 数据
List<Brand> selectAll();
// 根据id 进行 查询
Brand selectById(int id);
// 小于 id 取出
List<Brand> selectByIds(int id);
// 多条件 查询 (三种方法 @Param 对象 map集合)
List<Brand> selectByCondition(@Param("status") int status,
@Param("companyName") String companyName,
@Param("brandName") String brandName);
// mybatis 动态sql 来进行查询
List<Brand> selectByConditions(@Param("status") int status,
@Param("companyName") String companyName,
@Param("brandName") String brandName);
// 添加数据 添加 Brand
void addBrand(Brand brand);
// 添加数据 返回主键
void addBrandBackId(Brand brand);
// 修改
void updateBrand(Brand brand);
// 根据id 进行删除
void deleteBrandById(int id);
// 进行批量删除
void deleteBrandByIds(int[] ids);
}
4.8 映射 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">
<!--
映射 现在BrandMapper.xml是一个 关于 user表操作的 映射文件
-->
<!--
namespace="" 跟接口名 包名+类名 一致
复制之后需要关注 这个名字是不 接口的包名+类名
mapper标签里面子标签
根据的不同操作 选择不同的 标签
<select> <insert> <update> <delete>
id值 跟 接口方法名一致
参数类型 跟接口方法参数类型一致
返回值 跟接口的方法的返回值一致
-->
<mapper namespace="com.tjtc.mapper.BrandMapper">
<select id="selectAll" resultType="Brand">
select * from tb_brand;
</select>
<select id="selectById" resultType="Brand">
select * from tb_brand where id = #{id};
</select>
<!--穿一个id 将 比传入id 小的 取出-->
<!--考察点 mybatis 有几种特殊 情况 不能和 mysql语句相比-->
<select id="selectByIds" resultType="Brand">
select * from tb_brand where id < #{id};
</select>
<!--多条件 查询 模糊查询-->
<select id="selectByCondition" resultType="Brand">
select * from
tb_brand
where
status = #{status}
and
companyName like #{companyName}
and
brandName like #{brandName}
</select>
<!--上边这种 多个 查询方式 有些不好,如果 status为null (用户 不输出值) 那么用户永远也查不到-->
<!--多条件 查询 运用sql 模糊查询 mybatis 动态 sql-->
<select id="selectByConditions" resultType="Brand">
select * from
tb_brand
where
<if test="status != null">
status =#{status}
</if>
<if test="companyName != null and companyName != ''">
and companyName like #{companyName}
</if>
<if test="brandName != null and brandName != ''">
and brandName like #{brandName}
</if>
</select>
<!--添加数据 -->
<insert id="addBrand">
insert into
tb_brand(brandName,companyName,ordered,description,status)
values
(#{brandName},#{companyName},#{ordered},#{description},#{status})
</insert>
<!--添加 数据 返回主键-->
<insert id="addBrandBackId" useGeneratedKeys="true" keyProperty="id">
insert into
tb_brand(brandName,companyName,ordered,description,status)
values
(#{brandName},#{companyName},#{ordered},#{description},#{status})
</insert>
<!--修改-->
<update id="updateBrand">
update tb_brand set
brandName = #{brandName},
companyName = #{companyName},
ordered = #{ordered},
description = #{description},
status = #{status}
where id = #{id};
</update>
<delete id="deleteBrandById">
delete from tb_brand where id = #{id};
</delete>
<delete id="deleteBrandByIds">
delete from tb_brand where id in
<foreach collection="array" open="(" close=")" separator="," item="id">
#{id}
</foreach>
</delete>
</mapper>