Administrator
发布于 2022-10-25 / 46 阅读
0
0

Mybatis - HelloWorld

概述

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和
Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.

为什么要使用MyBatis?

MyBatis是一个【半自动化】的持久化层框架。

JDBC:

SQL夹在Java代码块里,耦合度高导致硬编码内伤

维护不易且实际开发需求中sql是有变化,频繁修改的情况多见

Hibernate和JPA:

长难复杂SQL,对于Hibernate而言处理也不容易

内部自动生产的SQL,不容易做特殊优化。

基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降。

对开发人员而言,核心sql还是需要自己优化

sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。

MyBatis-HelloWorld

教程也可以参考官方文档:https://mybatis.net.cn/getting-started.html

1、导包

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.2.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.17</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.4</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.20</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.3.20</version>
    </dependency>
  </dependencies>

  <build>
    <!--   **.xml写在src找不到问题解决方案     -->
    <resources>
      <resource>
        <!-- directory:指定资源文件的位置 -->
        <directory>src/main/resources</directory>
        <includes>
          <!-- “**” 表示任意级目录    “*”表示任意任意文件 -->
          <!-- mvn resources:resources :对资源做出处理,先于compile阶段  -->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <!--  filtering:开启过滤,用指定的参数替换directory下的文件中的参数(eg. ${name}) -->
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>

 

2、写配置

1、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://localhost:3306/mybatis?characterEncoding=utf-8&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--mappers标签:引入自己编写的每一个接口的xml实现文件
		resource属性:引入xml实现文件的位置
-->
--
//在此注册让Mybatis知道我们的dao实现xml文件在哪里
---
    <mappers>
        <mapper resource="mapper/employee.xml"/>
    </mappers>
</configuration>

 
2、接口

public interface employeemapper {

    Employee getEmployee(Integer id);
}

 
3、创建sql映射文件

mapper标签
	namespace属性:名称空间;写接口的全类名
select标签:用来定义一个查询操作
    id属性:方法名;相当于对于某个方法的实现
    resultType属性:方法运行后的返回值类型(查询操作必须指定)
    #{属性名}:代表取出传递过来的某个参数的值
    
-----------------------------------------------------------------------

<?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.lly.mapper.employeemapper">
    <select id="getEmployee" resultType="com.lly.pojo.Employee">
        select * from employee where id = #{id}
    </select>
</mapper>

3、测试

    @Test
    public void testGetEmployee() throws IOException {
        String resource = "mybatis-config";
        InputStream inputStream = Resources.getResourceAsStream(resource);
    --
    //1、根据全局配置文件创建出一个sqlSessionFactory
    //SqlSessionFactory:是SqlSession工厂,负责创建SqlSession对象
    //SqlSession对象:sql会话---(代表和数据库的一次会话)
    --
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    //2、获取和数据库的一次会话;与getConnection();拿到一条连接
    
        SqlSession session = sqlSessionFactory.openSession();
        try {
         //3、使用SqlSession操作数据库,获取到dao接口的实现
         
            employeemapper mapper = session.getMapper(employeemapper.class);
            Employee employee = mapper.getEmployee(1);
            System.out.println(employee);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}

补充:

SqlSessionFactory的使用
增删改需要设置事务

方式一、—要在方法中最后try-catch-finally关闭资源,增删改需要手动提交事务

方式二、—openSession(true);设置是否自动提交事务,true为自动提交,false为不自动提交
eg:
        //openSession(true)设置自动提交事务
    SqlSession sqlSession = sqlSessionFactory.openSession(true);

细节:

两个文件细节:

1、全局配置文件:mybatis-config.xml;指导mybatis正确运行的一些全局设置

2、SQL映射文件:Employee.xml;相当于是对mapper接口的一个实现描述细节;

细节二:

1、获取到的是接口的代理对象;mybatis自动创建的

2、SqlSessionFactory和SqlSession;

SqlSessionFactory:创建SqlSession对象,Factory只new一次就行

SqlSession:相当于connection,是和数据库进行交互的,也是一次和数据库的一次会话,就应该创建一个新的的SqlSession,一次与数据库连接,就创建一次会话

评论