Mybatis框架技术知识理解:

什么是mybatis?

        - mybatis是一个优秀的持久层框架,它对jdbc操作数据库的过程进行了封装。

        -mybatis也是一个ORM的半自动化框架,是开发者注重sql语句。

创建mybatis项目:

        1. 创建maven项目:

点击file--》new--》project

点击maven--》project sdk--》选择自己的jdk

 然后点击next,下一步

 点击finish完成。

2.在Maven的pom文件中引入MyBatis需要用的jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!--父工程-->
    <groupId>com.demo</groupId>
    <artifactId>Mybaties-demo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mybatis-01</module>
    </modules>

    <!--导入依赖-->
    <dependencies>

        <!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <!---mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--junit测试依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
<build>
    <resources>
        <!-- mapper.xml文件在java目录下 -->
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <!-- mapper.xml文件在resources目录下-->
        <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
    <pluginManagement>
        <plugins>
            <!--编译指定指定文件编码格式-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>
</project>

3.创建表语句:

create database `mybatis`;//创建数据库
use `mybatis;//连接数据库

create table `user`(//创建表
`id` INT(20) not null primary key,
`name` varchar(30) default null,
`psw` varchar(30) default null
)engine = innodb default charset = utf8;
//插入sql语句
insert into `user`(`id`,`name`,`psw`) values 
(1,'李勤珍','123456'),
(2,'张三','123456'),
(3,'李四','233556')

4.在resources下面创建Mybatis的核心配置文件:mybatis-config.xml

<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE configuration PUBLIC
        "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
        //环境配置,可以配置多套环境,不过只能使用一套
    <environments default="development">
        //id:环境标识
        <environment id="development">
                //transactionManager:事物管理器,负责提交和回滚
            <transactionManager type="JDBC"></transactionManager>
                //数据源配置,连接数据库
            <dataSource type="POOLED">//数据库连接池
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;CharacterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--每一个Mapper.xml都需要在Mybatis的核心配置文件中注册-->
    <mappers>
        <mapper resource="dao\UserMapper.xml"></mapper>
    </mappers>
</configuration>

5.在bean(pojo)包中中创建数据库的表的实体类

package bean;

public class User {
    private Integer id;
    private String name;
    private String psw;

    public User() {
    }

    public User(Integer id, String name, String psw) {
        this.id = id;
        this.name = name;
        this.psw = psw;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getPsw() {
        return psw;
    }

    public void setPsw(String psw) {
        this.psw = psw;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", psw='" + psw + '\'' +
                '}';
    }

}

6.在dao文件夹下面创建操作实体类的接口:UserDao

package dao;

import pojo.User;

import java.util.List;

//操作实体类
public interface UserDao {
    List<User> getUserList();

}
7.创建实现接口的xml文件:userDao.xml
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="dao.UserDao">
    <!--id对应Dao接口中的方法名-->
    <select id="getUserList" resultType="pojo.User">
    select * from mybatis.user
  </select>
</mapper>
8.在utils文件夹下面创建实际操作数据库的代码:

package utils;

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;

public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            //使用mybatis第一步:获取SqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        /*
        既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
        SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession
         实例来直接执行已映射的 SQL 语句
         */

    }
    //使用mybatis第二步:获取SqlSession对象
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();

    }
}

9.在test文件夹下面创建测试类,进行测试;

package dao;

import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import pojo.User;
import utils.MybatisUtils;

import java.util.List;

public class UserDaoTest {
    @Test
       public void test(){
        //第一步:获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.getUserList();
        //遍历userList
        for (User user : userList) {
            System.out.println(user);
            System.out.println(user.getName());
        }
        //关闭sqlSession
        sqlSession.close();
    }
}
 

 mybatis的配置文件:

        1、给返回类型起别名

1.核心配置文件:mybatis-config.xml下配置
<!--给扫描实体类,类型起别名-->
    <typeAliases>
                //只给一个类其别名
<!--        <typeAlias type="com.demo.bean.Student" alias="Student"/>-->
                //给这个包下,全部实体类其别名
        <package name="com.demo.bean"/>
    </typeAliases>

2.使用注解给实体类起别名

@Alias("student")//自定义起别名
public class Student {
    private int id;
    private  String name;
    private String sex;
    private String birthday;

    public Student() {
    }

        2、扫描映射器

1、<!--Mapper.xml需要在mybatis核心配置文件中注册-->
<mappers>
    <mapper resource="com/demo/dao/StudentDao.xml"/>
</mappers>

推荐:因为这个无需接口和xml文件名一致。

2、使用扫描接口类注入绑定

<mappers>

        <mapper class="com.demo.dao.StudentMapper"/>

</mappers>

注意:dao的接口类名必须和xml文件名一致。

          dao的接口类和xml文件必须在同一个包下。

3、使用扫描包注入绑定

<mappers>

        <package   name="com.demo.dao"/>

</mappers>

注意:dao的接口类名必须和xml文件名一致。

          dao的接口类和xml文件必须在同一个包下。

生命周期和作用域:

        SqlSessionFactory:

                创建一个SqlSssionFactory工厂对象,相当于一个数据库连接池。

                SqlSessionFactory一旦创建应该在运行期间存在,不能重新创建其他实例,因此它的作用域最简单的使用单例模式。

SqlSession:

       - 连接到连接池的一个请求。

        -SqlSession的实例不是线程安全的,因此不能被共享,所以它的最佳作用域是一个请求时,或者方法内。

        -用完后需要及时关闭连接,否则资源会被占用。

日志工厂配置使用:

  • SLF4J
  • LOG4J 【掌握】
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING 【掌握】
  • NO_LOGGING

STDOUT_LOGGING日志:

在mybatis核心配置文件中配置,STDOUT_LOGGING配置实例:

<!--工厂日志-->
<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

注意:要注意核心配置文件标签的顺序,名字不要写错,注意空格问题。

LOG4J日志:

        什么是log4j?

通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

1.导入log4j依赖

<dependency>

        <groupId>log4j</groupId>

        <artifactId>log4j</artifactId>

        <version>1.2.17</version>

</dependency>

2、在 resource目录下新建文件Log4j.properties

#将等级为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=[%-5p][ %d{yyyy-MM-dd HH:mm:ss,SSS}] - %-4r [%t] %C:%L %x - %m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/mybatis.log
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=3
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p][ %d{yyyy-MM-dd HH:mm:ss}] - %-4r [%t] %C:%L %x - %m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sq1.Statement=DEBUG
log4j.logger.java.sq1.ResultSet=DEBUG
log4j.logger.java.sq1.PreparedStatement=DEBUG

3、在Mybatis配置文件中设置日志为log4j

<settings>
    <setting name="logImpl" value="log4j"/>
</settings>

4、运行调试

 log4j简单使用:

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

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

        public class StudentLog4jTest {
            static Logger logger = Logger.getLogger(StudentLog4jTest.class);
                }

        3.在需要打印日志的地方进行调用,如下图

RowBounds实现分页:

        RowBounds:导入import org.apache.ibatis.session.RowBounds;

其他接口类,xml照常写;

 sql语句:

PageHelper分页插件:

        第一步引入分页插件依赖:

<!-- 引入mybatis的 pagehelper 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.2</version>
        </dependency>

  • 第二步:在mybatis的全局配置文件中配置PageHelper分页插件
  • <configuration>
    	<!-- 引入 pageHelper插件 -->
    	<!--注意这里要写成PageInterceptor, 5.0之前的版本都是写PageHelper, 5.0之后要换成PageInterceptor-->
    	<plugins>
    		<plugin interceptor="com.github.pagehelper.PageInterceptor">
    		<!--reasonable:分页合理化参数,默认值为false,直接根据参数进行查询。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。-->
    		<!--<property name="reasonable" value="true"/>-->
    		</plugin>
    	</plugins>
    </configuration>

Lombok插件:

        第一步:idea安装lombok插件!

        第二步:导入lombok依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.10</version>
    <scope>provided</scope>
</dependency>

 第三步:在实体类上添加注解

//get,set方法,equals,hashcode,toString方法等
@Data
//有参构造
@AllArgsConstructor
//无参构造
@NoArgsConstructor
public class User {

    private int id;
    private String name;
    private String sex;
}

一对多和多对一查询:

    JavaType和ofType的区别?

        JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型,而ofType指定的是 映射到list集合属性中pojo的类型 

association标签:用于处理对象的,属性的对象
collection标签::用于处理集合

一级缓存和二级缓存的区别:

        1.一级缓存默认开启的,SqlSession级别,也称为本地缓存。

        缓存失效的情况:

                -查询不同的数据(意思就是查询了其他生气了语句)。

                -使用了增删改生气了语句,可能改变原来的数据,必定刷新缓存!

                -使用了不同Mapper.xml。

                -使用了清除一级缓存(sqlSession.clearCache())。

注意:一级缓存默认开启,一级缓存只在SqlSession中有效,也就是拿到连接到关闭连接这个区间段。

        2.二级缓存需要手动开启的,它是基于namespace级别的缓存,也叫全局缓存。

        步骤:

                1.开启二级缓存

                <!--在当前 Mapper.xml文件开启二级缓存-->

                         <cache/>

                2.在 mybatis-config.xml 的配置文件中进行显示配置,开启二级缓存(全局缓存)

                        <settings>

                                <!--显示的开启全局缓存-->

                                <setting name="cacheEnabled" value="true"/>

                        </settings>

3.注意:我们在使用缓存的时候要记得序列化实体类,否则会抛出实体类未序列化异常

需要将实体类序列化:

4.总结:

  • 二级缓存是基于namespace级别的,在同一个Mapper下有效。
  • 所有的数据都会先放在一级缓存中。
  • 只有当会话提交或关闭时,才会提交到二级缓存中。

5.缓存查询顺序:

        1.先查二级缓存,二级缓存有数据就返回。

        2.二级缓存没有查询一级缓存,一级缓存有数据也返回。

        3.一级和二级缓存都没有,查询数据库。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值