1、简介

1.Mybatis是一个优秀的持久层框架

2.持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(JDBC),IO文件持久化
  • 生活:冷藏

​ 因为内存的断电即失与内存的造价,就一些对象不能丢掉

3.持久层

Dao层、Service层、controller层…..

  • 完成持久化工作的代码块
  • 层界限十分明显

4.为什么需要Mybatis

  • 方便

  • 帮助程序员将数据存到数据库中

  • 传统的JDBC代码太复杂了。简化,框架,自动化

2、第一个Mybatis程序

思路:搭建环境->导入Mybatis->编写代码->测试

1、搭建环境

image-20220908160157308

UserMapper接口

1
2
3
4
5
6
7
8
9
10
package com.zhang.mapper;

import com.zhang.pojo.User;

import java.util.List;

public interface UserMapper {
List<User> selectUserList();

}

User实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.zhang.pojo;

import lombok.Data;

@Data
public class User {
private int id;
private String name;
private String pwd;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}
}

UserMapper配置文件

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhang.mapper.UserMapper">
<select id="selectUserList" resultType="com.zhang.pojo.User">
select * from user.user;
</select>
</mapper>

Mybatis的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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>

<typeAliases>
<package name="com.zhang.pojo.User"/>
</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://localhost:3306/user?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.zhang.mapper.UserMapper"/>
</mappers>
</configuration>

3、CRUD

1、namespace

namespace中的包名要和Dao/mapper接口的包名一致

2.select

选择查询语句:

  • id:就是对应的namespace中的方法名
  • resultType:Sql语句执行的返回值类型!
  • parameterType:Sql语句参数类型

1.编写接口

1
2
3
4
5
6
7
public interface UserMapper {
List<User> selectUserList();
User getUserByID(int id);
int addUser(User user);
int updateUser(User user);
int deleteUser(int i);
}

2.编写对应mapper中的sql语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<insert id="addUser" parameterType="com.zhang.pojo.User">
<!--user中的属性可以随便去除-->
insert into user.user(id, name, pwd) values (#{id},#{name},#{pwd});
</insert>
<update id="updateUser" parameterType="com.zhang.pojo.User" >
update user.user set name=#{name} , pwd=#{pwd} where id=#{id};
</update>
<delete id="deleteUser" parameterType="int">
delete from user.user where id = #{id};
</delete>
<select id="selectUserList" resultType="com.zhang.pojo.User">
select * from user.user;
</select>
<select id="getUserByID" resultType="com.zhang.pojo.User" parameterType="int">
select * from user.user where id=#{id};
</select>

3.测试

4.侧重点:增删改查提交事务

4、配置优化

  • 类型别名是为Java类型设置一个短的名字

  • 存在的意义仅是用来减少类完全限定名的冗余

  • ```xml

    1
    2
    3
    4
    5
    6
    7
    8
    9

    也可以指定一个包名,MyBatis会在包名下面搜索需要的Java Bean比如:

    扫描实体类的包,他的默认别名就为这个嘞的类名,首字母小写!

    ```xml
    <typeAliases>
    <package name="com.zhang.pojo"/>
    </typeAliases>

若实体类比较多建议用第二种,但第一种可以DIY别名

若第二种方法非要改别名,那就在实体类上加注解

5、映射器(mappers)

MapperRegistry:注册绑定我们的Mappers文件

方式一:

1
2
3
<mappers>
<mapper resource="com.zhang.mapper.UserMapper"/>
</mappers>

方式二:使用class文件绑定注册

1
2
3
<mappers>
<mapper class="com.zhang.mapper.UserMapper"/>
</mappers>

注意点:

  • 接口和他的Mapper配置文件必须同名
  • 接口和他的Mapper配置文件必须在同一个包下

方式三:使用扫描包注入绑定

1
2
3
<mappers>
<package class="com.zhang.mapper.UserMapper"/>
</mappers>

6、生命周期

image-20220911165901375

image-20220911165821043

7、resultMap

结果集映射

id name pwd

id name passwoord

image-20220911172857940

  • resuletMap是Mybatis中最重要最强大的元素

  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

  • 你完全可以不用显式地配置它们。 虽然上面的例子不用显式配置 ResultMap

8、日志

1、日志工厂

如果一个数据库操作出现了异常,我们需要排错,日志就是最好的助手

曾经的日志:sout,debug

现在的日志

image-20220911230546552

  • SLF4J

  • LOG4J【掌握】

  • LOG4J2

  • JDK_LOGGING

  • COMMONS_LOGGING

  • STDOUT_LOGGING【掌握】

  • NO_LOGGING

Mybatis具体使用哪一个日志实现,在设置中设定

STDOUT_LOGGING标准日志输出

image-20220911232342890**

LOG4J

什么是LOG4J:

  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程

  • 我们也可以控制每一条日志的输出格式

  • 通过定义每一条日志信息的级别,我们能够更加细致的控制日志生成过程

  • 通过一个配置文件来领国的配置,而不需要修改应用代码

  1. 导入log4j的包

    1
    2
    3
    4
    5
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.12</version>
    </dependency>
  2. log4j.properties’

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
    log4j.rootLogger=DEBUG,console,file

    #控制台输出的相关配置
    log4j.appender.console=org.apache.log4j.ConsoleAppender

    log4j.appender.console.Target=System.out

    log4j.appender.console.Threshold=DEBUG

    log4j.appender.console.layout=org.apache.log4j.PatternLayout

    log4j.appender.console.layout.ConversionPattern=[%c]-%m%n


    #文件输出的相关配置

    log4j.appender.file=org.apache.log4j.RollingFileAppender

    log4j.appender.file.File=./log/zhang.log

    log4j.appender.file.MaxFileSize=10mb

    log4j.appender.file.Threshold=DEBUG

    log4j.appender.file.layout=org.apache.log4j.PatternLayout

    log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n


    #日志输出级别
    log4j.logger.org.mybatis=DEBUG

    log4j.logger.java.sql=DEBUG

    log4j.logger.java.sql.Statement=DEBUG

    log4j.logger.java.sql.ResultSet=DEBUG

    log4j.logger.java.sql.PrepareStatement=DEBUG
  3. 配置log4j为日志的实现

    1
    2
    3
    <settings>
    <setting name="logImpl" value="LOG4J"/>
    </settings>
  4. 直接运行测试

    image-20220912143253053

简单使用

  1. 要使用Log4j中的类,先导入包import org.apache.log4j.Logger;

  2. 日志对象,参数为当前类的class

    1
    static Logger logger=Logger.getLogger(Mytest.class);
  3. 日志级别

    1
    2
    3
    logger.info("info:进入了testLog4j");
    logger.debug("debug:进入了testLog4j");
    logger.error("error:进入了testLog4j");

9、注解开发

  1. UserMapper接口

    1
    2
    3
    4
    @Select("select * from user.user")
    List<User> getUsers();
    @Select("SELECT * from user.user where id=#{id} and name=#{name}")
    User getUser(@Param("id") int id,@Param("name") String name);
  2. Mybatis的配置文件中要将绑定接口

1
2
3
<mappers>
<mapper class="com.zhang.mapper.UserMapper"/>
</mappers>

3.代码测试

1
2
3
4
5
6
7
8
public void addUsers(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.addUser(new User(5, "ZHMPIG", "ZHMDAZHUZHU"));
if(i>0){
System.out.println("添加成功");
}
}

4.运行结果

image-20220913222334440

10、Lombok

Lombok的依赖坐标

1
2
3
4
5
6
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
<scope>provided</scope>
</dependency>

插件:在IDEA中打开Setting,再打开插件搜索Lombok

常用注解

1
2
3
4
5
6
@Getter and @Setter
@ToString
@EqualsAndHashCode
@AllArgsConstructor,
@NoArgsConstructor
@Data

11、多对一处理

环境搭建:SQL代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create table teacher(
id int(10) not null ,
name varchar(30) default null,
primary key (id)
) ;
INSERT INTO teacher(id,name) values (1,'李老师');
create table student(
id int(10) not null ,
name varchar(30) default null,
tid int(10) default null,
primary key (id),
key fktid (tid),
constraint fktid foreign key (tid) references teacher(id)
);
insert into student(id,name,tid) values (1,'小明',1);
insert into student(id,name,tid) values (2,'小红',1);
insert into student(id,name,tid) values (3,'小张',1);
insert into student(id,name,tid) values (4,'小李',1);
insert into student(id,name,tid) values (5,'小王',1);

实体类的构建:

Student

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.zhang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@AllArgsConstructor
@ToString
@NoArgsConstructor
public class Student {
private int id;
private String name;
//学生需要关联一个老师
private Teacher teacher;
}

Teacher

1
2
3
4
5
6
7
8
9
package com.zhang.pojo;

import lombok.Data;

@Data
public class Teacher {
private int id;
private String name;
}

StudentMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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.zhang.mapper.StudentMapper">

<select id="getStudent" resultMap="StudentTeacher">
select * from user.student
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher" />
</resultMap>

<select id="getTeacher" resultType="teacher">
select * from user.teacher where id = #{id}
</select>
</mapper>