优秀的编程知识分享平台

网站首页 > 技术文章 正文

Mybatis入门

nanyue 2024-11-21 18:56:23 技术文章 1 ℃

1.简介

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

当前,最新版本是MyBatis 3.5.5,其发布时间是2020年6月5日。

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2.特点

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql
  • 3.原理

    (1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。

    (2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。

    (3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。

    (4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

    项目开发中,重点关注:

    两类配置文件(主配置文件sqlmap-config.xml,模块配置文件XxxSqlMap.xml)

    一个对象SqlSession对象

    4.使用

    在maven项目下使用mybatis的基本步骤:

    (1)新建maven项目,在pom.xml中设置坐标(jdbc,mybatis,lombok,junit...)

     	<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    	<dependency>
    		<groupId>mysql</groupId>
    		<artifactId>mysql-connector-java</artifactId>
    		<version>5.1.48</version>
    	</dependency>
      
    	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    	<dependency>
    	    <groupId>org.mybatis</groupId>
    	    <artifactId>mybatis</artifactId>
    	    <version>3.5.4</version>
    	</dependency>
    	
    	<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    	<dependency>
    	    <groupId>org.projectlombok</groupId>
    	    <artifactId>lombok</artifactId>
    	    <version>1.18.12</version>
    	    <scope>provided</scope>
    	</dependency>	
    	
    	<!-- https://mvnrepository.com/artifact/junit/junit -->
    	<dependency>
    	    <groupId>junit</groupId>
    	    <artifactId>junit</artifactId>
    	    <version>4.13</version>
    	    <scope>test</scope>
    	</dependency>
    
    	<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    	<dependency>
    	    <groupId>org.slf4j</groupId>
    	    <artifactId>slf4j-api</artifactId>
    	    <version>1.7.30</version>
    	</dependency>
    
    	<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
    	<dependency>
    	  <groupId>org.slf4j</groupId>
    	  <artifactId>slf4j-simple</artifactId>
    	  <version>1.7.30</version>
    	  <scope>compile</scope>
    	</dependency>

    (2)编写mybatis的主配置文件(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.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://127.0.0.1:3306/cms?useUnicode=true&characterEncoding=utf8&useSSL=true"/>
            <property name="username" value="root"/>
            <property name="password" value="root"/>
          </dataSource>
        </environment>
      </environments>
      <!-- 导入模块配置文件 -->
      <mappers>
       <!-- 用户管理sql语句xml文件 -->
        <mapper resource="raky/train/mapper/UserMapper.xml"/>
      </mappers>
    </configuration>

    (3)编写实体类 User.java

    package raky.train.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
    	
    	private Integer id;
    	
    	private String name;
    	
    	private String pass;
    	
    	private Integer age;
    
    }

    (4)编写模块配置文件 UserMapper.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">
    
    <mapper namespace="raky.train.mapper.UserMapper">
      
      <!-- 映射关系-->
      <resultMap type="raky.train.entity.User" id="selectUserResult">
      	<id column="id" property="id"/>
      	<result column="name" property="name" />
      	<result column="pass" property="pass" />
      	<result column="age" property="age" />
      </resultMap>
    
     <!-- 查询列表对象 -->
      <select id="getList" resultMap="selectUserResult">
      	select * from user
      </select>
    
      <!-- 查询单个对象 -->
      <select id="getOne" parameterType="int" resultType="raky.train.entity.User">
      	select * from user where id = #{id}
      </select>
      <!-- 插入数据 -->
      <insert id="insert" parameterType="raky.train.entity.User">
      	insert into user(name,pass,age)values(#{name},#{pass},#{age})
      </insert>
      <!-- 更新数据 -->
      <update id="update" parameterType="raky.train.entity.User">
      	update user set name=#{name},pass=#{pass},age=#{age} where id=#{id}
      </update>
      <!-- 删除数据 -->
      <delete id="delete" parameterType="int">
      	delete from user where id=#{id}
      </delete>
      
    </mapper>

    (5)编写测试代码

    package raky.train;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    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 lombok.extern.slf4j.Slf4j;
    import raky.train.entity.User;
    
    /**
     * @author raky
     */
    @Slf4j
    public class TestMyBatis {
    
    	public static void main(String[] args) throws IOException {
    		//1.主配置文件位置
    		String resource = "mybatis-config.xml";
        
    		//2.加载主配置文件  ===》文件输入流   抛出IOException
    		InputStream inputStream = Resources.getResourceAsStream(resource);
        
    		//3.读取配置文件,创建SqlSessionFactory对象
    		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
    		//4.获取SqlSession对象   ====》Connection对象
    		SqlSession sqlSession = sqlSessionFactory.openSession();
        
    		//5.通过SqlSession对象针对数据库进行CRUD操作
    		List<User> userList = sqlSession.selectList("getList"); //selectUser  ===> xml(sql) 
        
    		//6.针对结果进行处理
    		userList.forEach(x -> log.info("====>{}",x));
    
    	}
    
    }
    

    至此,mybatis操作数据库的简单demo创建完成。

    Tags:

    最近发表
    标签列表