mybatis入门

2022年6月23

一. mybatis 的入门

  1. 外部文件的引入(路径在resource下)db.properties

    mysql.driver=com.mysql.cj.jdbc.Driver
    mysql.url=jdbc:mysql://localhost:3306/数据库名称?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=UTC&useSSL=fals	e
    mysql.username=root
    mysql.password=password
    
    
  2. mybatis-config.xml ——路径(resource)

       <?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>
       <properties resource="db.properties" />  <!-- 外部文件的引入 -->
       <environments default="development">
          <environment id="development">
              <transactionManager type="JDBC"></transactionManager>
              <dataSource type="POOLED">
                  <property name="driver" value="${mysql.driver}"/>
                   <property name="url" value="${mysql.url}"/>
                  <property name="username" value="${mysql.username}"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--    路径要对,引入你要操作的数据库 xml 文件,就是映射sql文件-->
    <mappers>
        <mapper resource="mapper/UsersMapper.xml"></mapper>
    </mappers>
    
      </configuration>
    
  3. UserMapper.xml ——(resource/mapper)

    <?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.hcxy.pojo.Users"> <!-- 一般为数据表在持久层对应接口的完整路径 -->
       <select id="findById" resultType="com.hcxy.pojo.Users">
           select * from users where uid = #{id}
       </select>
    </mapper>
    
  4. User.java

    package com.hcxy.pojo;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data   //生成getter,setter等函数
    @AllArgsConstructor     //生成全参数构造函数
    @NoArgsConstructor  //生成无参构造函数
    public class Users {
       private int uid;
       private String uname;
       private int uage;
    }
    
  5. Text.java

    public class UserTest {
        public static void main(String[] args) throws IOException {
            //获取配置文件
            String path = "mybatis-config.xml";
            Reader resourceAsReader = Resources.getResourceAsReader(path);
            // 创建工厂对象SqlSessionFactory
            SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader);
            //创建SqlSession对象,有各种对数据库的操作
            SqlSession session = build.openSession();
            // 唯一标识:namespace statementID
            Users users = session.selectOne("com.hcxy.pojo.Users.findById",1);
           // log.debug(users);
            System.out.println("users = " + users);
            session.close();
        }
    }
    
    

mybatis 工作原理

MyBatis框架在操作数据库时,大体经过了8个步骤。下面结合MyBatis工作原理图对每一步流程进行
详细讲解,具体如下。

  1. MyBatis读取核心配置文件mybatis-config.xml:mybatis-config.xml核心配置文件主要配置了
    MyBatis的运行环境等信息。
  2. 加载映射文件Mapper.xml:Mapper.xml文件即SQL映射文件,该文件配置了操作数据库的SQL语
    句,需要在mybatis-config.xml中加载才能执行。
  3. 构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory,用于创建
    SqlSession。 4. 创建会话对象:由会话工厂SqlSessionFactory创建SqlSession对象,该对象中包含了执行SQL语句
    的所有方法。
  4. 创建执行器:会话对象本身不能直接操作数据库,MyBatis底层定义了一个Executor接口用于操作
    数据库,执行器会根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存
    地维护。
  5. 封装SQL信息:SqlSession内部通过执行器Executor操作数据库,执行器将待处理的SQL信息封装
    到MappedStatement对象中。
  6. 操作数据库:根据动态生成的SQL操作数据库。
  7. 输出结果映射:执行SQL语句之后,通过MappedStatement对象将输出结果映射至Java对象中。

mybatis 核心配置

  • setting

     <!--解决数据库命名user_name 与 java的驼峰命名-->
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
    
  • typeAliases

    全限定类设置别名的方式:
    方式一:在<typeAliases>元素下,使用多个<typeAlias>元素为每一个全限定类逐个配置别名。 <typeAlias alias="User" type="com.hcxy.pojo.User"/> 
    
    方式二(推荐):通过自动扫描包的形式自定义别名 ,默认实体的类型就是别名也就是在对Sql映射的时候直接可以写实体类的名称,但是namespace 属性还是写实体类的包名路径比较好 
    <package name="com.hcxy.pojo"/>   
    

    除了可以使用 <typeAliases>元素为实体类自定义别名外,MyBatis框架还为许多常见的Java类型(如数值、字符串、日期和集合等)提供了相应的默认别名。
    例如别名byte映射类型byte、long映射类型long等,别名可以在MyBatis中直接使用,但由于别名不区 分大小写,所以在使用时要注意重复定义的覆盖问题

  • environments

    MyBatis可以配置多套运行环境,如开发环境、测试环境、生产环境等,我们可以灵活选择不同的配
    置,从而将SQL映射到不同运行环境的数据库中。不同的运行环境可以通过<environments>元素配 置,但不管增加几套运行环境,都必须要明确选择出当前要用的唯一的一个运行环境。

  1. 配置使用数据库环境,通过mabatis-config.xml 中修改 default

    <!--    配置数据库环境 default 指定使用那一套环境,这里有两套环境 development 和 text -->
      <environments default="development">    <!--  default 采用默认的配置环境与下面的 id 一致就用谁-->
            <environment id="development">   <!-- 配置单个的数据环境,id 当前数据库环境的唯一标识-->
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                <!--value可以用${}表达式获取properties中的值-->
                    <property name="driver" value="${mysql.driver}"/>
                    <property name="url" value="${mysql.url}"/>
                    <property name="username" value="${mysql.username}"/>
                    <property name="password" value="mysql.userpassword"/>
                </dataSource>
            </environment>
          <environment id="text">   <!-- 配置单个的数据环境,id 当前数据库环境的唯一标识-->
              <transactionManager type="JDBC"></transactionManager>
              <dataSource type="POOLED">	
                  <property name="driver" value="${mysql.driver}"/>
                  <property name="url" value="${mysql.url}"/>
                  <property name="username" value="${mysql.username}"/>
                  <property name="password" value="123456"/> <!-- 建议不使用直接写密码-->
              </dataSource>
          </environment>
          
        </environments>
    
  2. 修改创建工厂对象SqlSessionFactory

    //获取配置文件
       String path = "mybatis-config.xml";
       Reader resourceAsReader = Resources.getResourceAsReader(path);
      // 创建工厂对象SqlSessionFactory
      SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader,"text"); // 这里指定,xml中的指定则无效
    
  • mappers
    在MyBatis的核心配置文件中, <mappers>元素用于引入MyBatis映射文件。映射文件包含了POJO对象和数据表之间的映射信息,MyBatis通过核心配置文件中的 <mappers>元素找到映射文件并解析其中的映射信息。通过 <mappers>元素引入映射文件的方法有4种。

    	<mappers>
    	<!--第一种配置方式:相对路径/Mapper.xml--> 
    	<!--<mapper resource="com/hcxy/mapper/UsersMapper.xml"></mapper>--> 
    	<!--第二种配置方式:绝对路径/Mapper.xml--> <!--<mapper url="D:\IDEA\..."></mapper>--> 
    	<!--第三种配置方式:接口的全限定类名,需要将xml文件放入和接口同名文件夹下--> 
    	<!--<mapper class="com.hcxy.mapper.UsersMapper"></mapper>--> 
    	<!--第四种配置方式(推荐):指定到接口与xml映射文件的公共包名下--> 
    	<package name="com.hcxy.mapper"/> 
    	</mappers>
    

    mybatis接口式开发

    接口式开发:
    1.方法的名称需要保证和映射文件中的sqL语句的statmentId一致, 这里的两个方法名称findByID(), findTotal()与 UsersMapper.xml 中的 id 名称一致
    2.namespace的值必须是接口的全路径

  1. com.hcxy.mapper
    public interface UserMapper {
       public Users findByID(int id);
       public Integer findTotal();
    }
       //快速生成测试类:Ctrl + shift  + T
    
  2. UserMapperTest.java
    /**
     *
     * 接口式开发:
     * 1.方法的名称需要保证和映射文件中的sqL语句的statmentId一致, 这里的两个方法名称findByID(),findTotal(),就会知道去寻找了。
     * 与 UsersMapper.xml 中的 <select id="findById" resultType="users">  id 名称一致
     * 2.namespace的值必须是接口的全路径
     */
    
    public class UserMapperTest {
    
        UserMapper userMapper = null;
        SqlSession session = null;
    
        // 初始化操作
        @Before
        public void setUp() throws Exception{
            String path = "mybatis-config.xml";
            Reader resourceAsReader = Resources.getResourceAsReader(path);
            // 创建工厂对象SqlSessionFactory
            SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsReader);
            //创建SqlSession对象,有各种对数据库的操作
             session = build.openSession();
             // 通过动态接口动态代理对象来实现
            // 执行是要找那一条SQL语句来执行,sql 的唯一标识 是通过namespace + statementID 来识别的
             userMapper = session.getMapper(UserMapper.class);
    
        }
        @Test
        public void findByID() {
            Users users = userMapper.findByID(1);
            System.out.println("users = " + users);
            session.close();
        }
    
        @Test
        public void findTotal() {
            Integer integer = userMapper.findTotal();
            System.out.println("integer = " + integer);
            session.close();
        }
    }
    
  3. UserMapper.xml
    <!--
    接口式开发:
    1.方法的名称需要保证和映射文件中的sqL语句的statmentId一致
    2.namespace的值必须是接口的全路径
    -->
    <mapper namespace="com.hcxy.mapper.UserMapper"> <!--这个路径一定要写对了,接口的路径 -->
    
        <select id="findById" resultType="users">
            select * from users where uid = #{id}
        </select>
    
        <select id="findTotal" resultType="int">
            select count(*) from users
        </select>
    
    </mapper>
    
  4. 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>
    
       <properties resource="db.properties" />  <!-- 外部文件的引入 -->
    
    <!--解决数据库命名user_name 与 java的驼峰命名-->
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
    <!--引入了User.java的路径,就是别名,之后映射文件中就可以直接写实体类的名称-->
        <typeAliases>
            <package name="com.hcxy.pojo"/>
        </typeAliases>
    <!--    配置数据库环境 default 指定使用那一套环境 -->
      <environments default="development">    <!--  default 采用默认的配置环境与下面的 id 一致就用谁-->
            <environment id="development">   <!-- 配置单个的数据环境,id 当前数据库环境的唯一标识-->
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="${mysql.driver}"/>
                    <property name="url" value="${mysql.url}"/>
                    <property name="username" value="${mysql.username}"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
        <!--    路径要对,引入你要操作的数据库 xml 文件,就是映射sql文件-->
        <mappers>
    <!--        <mapper resource="mapper/UsersMapper1.xml"></mapper>-->
            <mapper resource="mapper/UsersMapper.xml"></mapper>
        </mappers>
    
    </configuration>
    

    两种的区别,与入门的

    1. 接口开发中,mybatis-config.xml,是这种去找实体类路径<typeAliases>
       <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
    <!--引入了User.java的路径-->
        <typeAliases>
            <package name="com.hcxy.pojo"/>
        </typeAliases>
        
    
    1. 在UserMapper.xml 中,namespace 的属性也不同<mapper namespace="com.hcxy.mapper.UserMapper">
      这个是写接口的路径,<select id="findById" resultType="users"> ,resultType 直接写 实体类的名称,不区分大小写。
  5. 公司最常用的是接口的方式:java 文件下的com.hcxy.mapper 与 resource 文件下要与 java 路径一样,却java 与xml的类名也要一致,采用包的形式映射。eg: UserMapper.java , UserMapper.xml
    <mappers>
    <!--        <mapper resource="mapper/UsersMapper1.xml"></mapper>-->
    <!--        <mapper resource="mapper/UserMapper.xml"></mapper>-->
            <package name="com.hcxy.mapper"/>
        </mappers>
        <!--采用包的时候,UserMapper.xml 中的namespace 要是接口类的路径,如下
        <mapper namespace="com.hcxy.mapper.UserMapper"> 
        -->
    

mabaits ---- insert,update,delete,select

  1. 写接口
  2. 在映射文件xml中写SQL语句,主语 id 与 接口的实现方法一致; 使用别名方便;
  3. 写实现接口
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值