Mybaits

本文详细介绍了Mybatis框架,包括其概念、解决的问题、入门案例、对象分析、日志配置、ThreadLocal的使用、Mapper的优化、动态SQL、分页插件、缓存机制以及反向生成插件等内容,旨在帮助读者深入理解和掌握Mybatis。
摘要由CSDN通过智能技术生成

文章目录

一.Mybatis概述

1.1 概念介绍

  • Mybatis原名iBatis,是一个基于java持久层的框架,采用了ORM思想,内部封装了JDBC,因此,开发人员只需要关注SQL本身即可,避免了和api打交道。
  • Mybatis通过XML或注解的方式对statement进行配置,并通过java对象和statement中的sql的动态参数进行映射生成最终执行的SQL语句,最后由mybatis框架执行SQL,并将结果直接映射为java对象。

1.2 解决的问题

1、数据库连接的创建、释放连接的频繁操作造成资源的浪费从而影响系统的性能。
2、SQL语句编写在代码中,硬编码造成代码不容易维护,实际应用中SQL语句变化的可能性比较大,一旦变动就需要改变java类。
3、使用preparedStatement的时候传递参数使用占位符,也存在硬编码,因为SQL语句变化,必须修改源码。
4、对结果集的解析中也存在硬编码。

二.入门案例

2.1 创建数据库和表

在这里插入图片描述

2.2 创建项目,导入依赖

	<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
    </dependencies>
    <plugins>
	     <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
       	 </plugin>
    <plugins>

2.3 mybatis配置文件

内容可以从网址复制mybatis网址
datasource中的property值根据自己的数据库进行修改

<?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="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers>
</configuration>

2.4 编写实体类

实体类中的属性必须与列名保持一致

	private Integer teamId;
    private String teamName;
    private String location;
    private Date createTime;

2.5 编写ORM映射文件

正常的数据库dao操作都是通过接口+实现方法进行调用。现在通过实体类映射,在实体类xml配置文件中写入sql语句进行dao操作。后期引入dao层可省略此步骤。

2.5.1 XML映射文件必须与实体类在同一个包下面

2.5.2 XML映射文件名称必须是实体类名称一致

在这里插入图片描述

  • 若创建文件夹直接命名为com.kkb.pojo,实际只有一个文件夹,因此需要根据层级一个个创建。
  • 头文件在网址复制即可
<?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="名称必须与映射的类的名字一致,是完全限定名"
    				后期在mybatis配置文件中配置了别名后,可进行简写-->
    <mapper namespace="com.kkb.pojo.Team">
        <!-- id="自定义名称,id不能重复;相当于dao中的方法名称"
        resultType="使用的要求:实体类中的属性名与表中的列名一致" -->
        <select id="queryAll" resultType="com.kkb.pojo.Team">
        select * from team
    </select>
   <mapper>

2.6 映射文件注册到mybatis配置文件中

下图所示仅是方式一,且较为低效,后期引入dao层后将采取新的方式。

<mappers>
	<mapper resource="com/kkb/pojo/Team.xml"/>
 </mappers>

2.7 配置映射文件的扫描位置

若前面的Team.xml不是写在resource中,而是写在和实体类同级的包中,即在src/java/main路径下,则需进行以下配置,不过实际开发中,为了方便管理,xml文件都是写在resource中。

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <!--所在的目录-->
                <includes>
                    <!--包括目录下的.properties,.xml 文件都会扫描到-->
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    <build>

2.8 mybatis接口测试

//mybatis的配置文件--相当于创建工厂的图纸
 	private String resource = "mybatis.xml";
    private SqlSession sqlSession;
    
 @Before
    public void before() throws IOException {
   
   		 //1、读取mybatis的配置文件
        Reader reader = Resources.getResourceAsReader(resource);
        //2、创建SqlSessionFactory对象,目的是获取sqlSession--根据图纸创建工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //3、创建可以执行SQL语句的SqlSession--工厂创建产品
        sqlSession = sqlSessionFactory.openSession();
    }

 @Test
    public void findAll() {
   
   		 //4、执行SQL语句
        List<Team> teamList = sqlSession.selectList("com.kkb.pojo.Team.queryAll");
        //5、循环输出查询的结果
        teamList.forEach(t-> System.out.println(t));
    }

    @After
    public void after() {
   
   		 //6、关闭SqlSession,释放资源
        sqlSession.close();

2.9 输入映射-单参传递

多参传递后期引入dao层再讲解

<!--id:相当于方法名
	parameterType:参数类型
	resultType:方法返回类型
	#{id}:相当于占位符?,花括号中内容自定义,无实际意义-->
<select id="findById" 
		parameterType="int" 
		resultType="com.kkb.pojo.Team"> 
		select * from team where teamId=#{id} 
</select>
//测试案例
 		Team t = sqlSession.selectOne("com.kkb.pojo.Team.queryOne",1001);
        System.out.println(t);

三.Mybatis对象分析

3.1 Resources

用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。

3.2 SqlSessionFactoryBuilder

使用SqlSessionFactoryBuilder的原因
是将SqlSessionFactory这个复杂对象的创建交由Builder来执行,也就是使用了建造者设计模式,此处不多加阐述。

3.3 SqlSessionFactory

SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。相当于线程池

  • 默认的 openSession()方法没有参数,相当于openSession(false),进行增删改时不会自动提交事务。
  • 若需要自动提交事务,将false改成ture即可。
  • 实际开发中一般在service层设置事务的提交,所以opensession方法一般设置成默认方式。

3.4 SqlSession

  • 相当于线程池每个线程
  • SqlSession 接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话。
  • SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法。

3.5 Mybatis架构

在这里插入图片描述

四.配置日志文件

4.1 添加依赖

		<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

4.2 添加日志配置文件

在resource下添加log4j.properties配置文件
在这里插入图片描述

4.3 在mybatis配置文件中添加日志配置

 <!--配置日志-->
    <settings>
        <setting name="logImpl" value="LOG4J
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值