MyBatis--原生的 API--注解的方式和MyBatis--mybatis-config.xml-配置文件详解

news2024/9/23 3:25:41

目录

原生的 API&注解的方式

MyBatis-原生的 API 调用

 为了大家的观看我把基于xml的配置和类也展示了如果你想要详细的观看可以看  连接这个博客

 创建Monster

创建MonsterMapper接口

创建MonsterMapper.xml

配置mybits的xml

创建MyBatisUtils

原生的 API 快速入门-代码实现

 创建MyBatisNativeTest类

创建myBatisNativeCrud

MyBatis-注解的方式操作

创建MonsterAnnotation类

修改 mybatis-config.xml , 对 MonsterAnnotaion 进行注册

创建MonsterAnnotationTest完成测试

注意事项和说明 

mybatis-config.xml-配置文件详解

说明

properties 属性

 创建 jdbc.properties

修改 mybatis-confing.xml

 修改父项目的 pom.xml(如果已经配置了*.properties 就不用再配置) 并完成测试

settings 全局参数定义

settings 列表,通常使用默认

typeAliases 别名处理器

修改mybatis-confi g.xml

修改MonsterMapper.xml 并完成测试

typeHandlers 类型处理器

 environments 环境


MyBatis原生的 API&注解的方式

MyBatis-原生的 API 调用

原生的 API 快速入门需求

● 在前面项目的基础上,将增删改查,使用 MyBatis 原生的 API 完成,就是直接通过

SqlSession 接口的方法来完成

1. 增加                                     2. 删除

3. 修改                                     4. 查询

 为了大家的观看我把基于xml的配置和类也展示了如果你想要详细的观看可以看  连接这个博客

 创建Monster

package com.wyxedu.entity;

import java.util.Date;

/**
 * Monster 和 monster表有对应关系
 * 体现OOP
 */
//解读
//1. 一个普通的Pojo类
//2. 使用原生态的sql语句查询结果还是要封装成对象
//3. 要求大家这里的实体类属性名和表名字段保持一致。
public class Monster {
    //属性-和表字段有对应关系
    private Integer id;
    private Integer age;
    private String name;
    private String email;
    private Date birthday;
    private double salary;
    private Integer gender;

    public Monster() {
    }

    public Monster(Integer id, Integer age, String name, String email, Date birthday, double salary, Integer gender) {
        this.id = id;
        this.age = age;
        this.name = name;
        this.email = email;
        this.birthday = birthday;
        this.salary = salary;
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Monster{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", birthday=" + birthday +
                ", salary=" + salary +
                ", gender=" + gender +
                '}';
    }
}

创建MonsterMapper接口

    package com.wyxedu.mapper;



import com.wyxedu.entity.Monster;

import java.util.List;

/**
 * 1. 这是一个接口
 * 2. 该接口用于声明操作monster表的方法
 * 3. 这些方法可以通过注解或者xml文件来实现
 */
public interface MonsterMapper {

    //添加monster
    public void addMonster(Monster monster);

    //根据id删除一个Monster
    public void delMonster(Integer id);

    //修改Monster
    public void updateMonster(Monster monster);

    //查询-根据id
    public Monster getMonsterById(Integer id);

    //查询所有的Monster
    public List<Monster> findAllMonster();
}

创建MonsterMapper.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">

<!--解读
1. 这是一个mapper xml 文件
2. 该文件可以去实现对应的接口的方法
3. namespace 指定该xml文件和哪个接口对应!!!
-->
<mapper namespace="com.wyxedu.entity.Monster">
   <!--配置addMonster
       1. id="addMonster" 就是接口的方法名
       2. parameterType="com.wyxedu.entity.Monster" 放入的形参的类型
       3. 注意"com.wyxedu.entity.Monster" 可以简写
       4. 写入sql语句=> 建议,现在sqlyog 写完成-测试通过,再拿过来
       5. (`age`, `birthday`, `email`, `gender`, `name`, `salary`) 表的字段
       6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性值
       7. 这里 #{age} age 对应monster对象的属性名,其它一样
   -->
    <insert id="addMonster" parameterType="Monster" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `monster`
        (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
        VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})
    </insert>

    <!--配置/实现delMonster方法
    1. 这里 java.lang.Integer 这是Java类型, 可以简写成 Integer
    2. 这里写入delete
    -->
    <delete id="delMonster" parameterType="Integer">
        DELETE FROM `monster` WHERE id = #{id}
    </delete>

    <!--配置实现 updateMonster
    1. com.wyxedu.entity.Monster 可以简写,.
    -->
    <update id="updateMonster" parameterType="Monster">
        UPDATE `monster`
        SET `age`=#{age} , `birthday`= #{birthday}, `email` = #{email},
        `gender` = #{gender} , `name`= #{name}, `salary` = #{salary}
        WHERE id = #{id}
    </update>

    <!--配置/实现getMonsterById-->
    <select id="getMonsterById" resultType="Monster">
        SELECT * FROM `monster` WHERE id = #{id}
    </select>

    <!--配置/实现findAllMonster-->
    <select id="findAllMonster" resultType="Monster">
        SELECT * FROM `monster`
    </select>
</mapper>

配置mybits的xml

注意这个是全部的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>

    <!--引入外部的jdbc.properties-->
    <properties resource="jdbc.properties"/>

    <!--配置MyBatis自带的日志输出-查看原生的sql-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--配置别名-->
    <typeAliases>
        <!--<typeAlias type="com.wyxedu.entity.Monster" alias="Monster"/>-->

        <!--
            如果一个包下有很多的类,我们可以直接引入包,这样
            该包下面的所有类名,可以直接使用
        -->
        <package name="com.wyxedu.entity"/>
    </typeAliases>


    
    <environments default="development">
        <environment id="development">
            <!--配置事务管理器-->
            <transactionManager type="JDBC"/>
            <!--配置数据源
            解读
            1. 我们使用外部的properties文件来设置相关的值
            2. 这个属性文件,需要统一的放在 resources目录/类加载路径
            3. 关于属性文件,在讲解java基础-集合
            -->
            <dataSource type="POOLED">
                <!--配置驱动-->
                <!--<property name="driver" value="com.mysql.jdbc.Driver"/>-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--配置连接mysql-url
                解读:
                1. jdbc:mysql 协议
                2. 127.0.0.1:3306 : 指定连接mysql的ip+port
                3. mybatis: 连接的DB
                4. useSSL=true 表示使用安全连接
                5. &amp; 表示 & 防止解析错误
                6. useUnicode=true : 使用unicode 作用是防止编码错误
                7. characterEncoding=UTF-8 指定使用utf-8, 防止中文乱码
                8. 温馨提示:不要背,直接使用即可
                -->
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.pwd}"/>
            </dataSource>
        </environment>
    </environments>
    <!--说明
    1. 这里我们配置需要关联的Mapper.xml
    2. 这里我们可以通过菜单 Path from source root
    -->
    <mappers>
        <!--<mapper resource="com/wyxedu/mapper/MonsterMapper.xml"/>-->

        <!--解读
           1. 如果是通过注解的方式,可不再使用 MonsterMapper.xml
           2. 但是需要在mybatis-config.xml注册/引入含注解的类
           3. 如果没有引入,不能使用
        -->
        <!--<mapper class="com.wyxedu.mapper.MonsterAnnotation"/>-->

        <!--
            解读
            1. 当一个包下有很多的Mapper.xml文件和基于注解实现的接口时,
               为了方便,我们可以以包方式进行注册
           2. 将下面的所有xml文件和注解接口 都进行注册
        -->
        <package name="com.wyxedu.mapper"/>
    </mappers>
</configuration>

创建MyBatisUtils

package com.wyxedu.util;

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;

/**
 * MyBatisUtils 工具类,可以得到SqlSession
 */
public class MyBatisUtils {

    //属性
    private static SqlSessionFactory sqlSessionFactory;

    //编写静态代码块-初始化sqlSessionFactory
    static {
        try {
            //指定资源文件, 配置文件mybatis-config.xml
            String resource = "mybatis-config.xml";
            //获取到配置文件mybatis-config.xml 对应的inputStream
            //这里说明:加载文件时,默认到resources目录=>运行后的工作目录target-classes
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            System.out.println("sqlSessionFactory="
                    + sqlSessionFactory.getClass());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //编写方法,返回SqlSession对象-会话
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}


原生的 API 快速入门-代码实现

 创建MyBatisNativeTest类

package com.wyxedu.mapper;

import com.wyxedu.entity.Monster;
import com.wyxedu.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

import java.util.Date;
import java.util.List;


public class MonsterMapperTest {
    //属性
    private SqlSession sqlSession;
    private MonsterMapper monsterMapper;

    /**
     * 解读
     * 1. 当方法标注 @Before, 表示在执行你的目标测试方法前,会先执行该方法
     */
    //编写方法完成初始化
    @Before
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //获取到到MonsterMapper对象 class com.sun.proxy.$Proxy7 代理对象
        //, 底层是使用了动态代理机制, 后面我们自己实现mybatis底层机制时,会讲到
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        System.out.println("monsterMapper=" + monsterMapper.getClass());

    }

    @Test
    public void addMonster() {

        for (int i = 0; i < 2; i++) {
            Monster monster = new Monster();
            monster.setAge(10 + i);
            monster.setBirthday(new Date());
            monster.setEmail("kate@qq.com");
            monster.setGender(1);
            monster.setName("大象精-" + i);
            monster.setSalary(1000 + i * 10);
            monsterMapper.addMonster(monster);

            System.out.println("添加对象--" + monster);
            System.out.println("添加到表中后, 自增长的id=" + monster.getId());
        }

        //如果是增删改, 需要提交事务
        if(sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }

        System.out.println("保存成功...");

    }

    @Test
    public void delMonster() {

        monsterMapper.delMonster(2);

        if(sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }

        System.out.println("删除成功...");

    }

    @Test
    public void updateMonster() {

        Monster monster = new Monster();
        monster.setAge(50);
        monster.setBirthday(new Date());
        monster.setEmail("king3@qq.com");
        monster.setGender(0);
        monster.setName("老鼠精-01");
        monster.setSalary(2000);
        monster.setId(3);

        monsterMapper.updateMonster(monster);

        if(sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }

        System.out.println("修改成功...");

    }

    @Test
    public void getMonsterById() {

        Monster monster = monsterMapper.getMonsterById(3);
        System.out.println("monster=" + monster);

        if(sqlSession != null) {
            sqlSession.close();
        }
        System.out.println("查询成功~");
    }


    @Test
    public void findAllMonster() {

        List<Monster> monsters = monsterMapper.findAllMonster();
        for (Monster monster : monsters) {
            System.out.println("monster-" + monster);
        }
        if(sqlSession != null) {
            sqlSession.close();
        }
        System.out.println("查询成功~");
    }
}

使用 sqlSession 原生的 API 调用我们编写的方法[了解]

创建myBatisNativeCrud

package com.wyxedu.mapper;

import com.wyxedu.entity.Monster;
import com.wyxedu.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * MyBatisNativeTest: 演示使用MyBatis原生API操作
 */
public class MyBatisNativeTest {

    //属性
    private SqlSession sqlSession;

    //编写方法完成初始化
    @Before
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //sqlSession 返回的对象是 DefaultSqlSession
        System.out.println("sqlSession--" + sqlSession.getClass());

    }

    //使用sqlSession原生的API调用我们编写的方法[了解]
    @Test
    public void myBatisNativeCrud() {

        //添加
        /**
         *
         *  @Override
         *   public int insert(String statement, Object parameter) {
         *     return update(statement, parameter);
         *   }
         *
         *   statement: 就是接口方法-完整声明
         *   parameter: 入参
         */

        //Monster monster = new Monster();
        //monster.setAge(100);
        //monster.setBirthday(new Date());
        //monster.setEmail("kate2@qq.com");
        //monster.setGender(0);
        //monster.setName("大象精-100");
        //monster.setSalary(10000);
        //
        //int insert =
        //        sqlSession.insert("com.wyxdu.mapper.MonsterMapper.addMonster", monster);
        //
        //System.out.println("insert---" + insert);
        //删除

        //int delete = sqlSession.delete("com.wyxdu.mapper.MonsterMapper.delMonster", 11);
        //System.out.println("delete--" + delete);

        //修改

        //Monster monster = new Monster();
        //monster.setAge(20);
        //monster.setBirthday(new Date());
        //monster.setEmail("kate3@qq.com");
        //monster.setGender(1);
        //monster.setName("牛魔王-100");
        //monster.setSalary(1000);
        //monster.setId(10);//这个一定要有,如果没有就不知道修改哪个对象
        //int update =
        //        sqlSession.update("com.wyxdu.mapper.MonsterMapper.updateMonster", monster);
        //System.out.println("update--" + update);

        //查询

        List<Monster> monsters =
                sqlSession.selectList("com.wyxdu.mapper.MonsterMapper.findAllMonster");

        for (Monster monster : monsters) {
            System.out.println("monster--" + monster);
        }

        //如果是增删改, 需要提交事务
        if(sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }

        System.out.println("操作成功...");
    }
}

MyBatis-注解的方式操作

在前面项目的基础上,将增删改查,使用 MyBatis 的注解的方式完

1.增加                      2.删除

3.修改                      4.查询

创建MonsterAnnotation类

package com.wyxedu.mapper;

import com.wyxedu.entity.Monster;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**

 * MonsterAnnotation: 使用注解的方式来配置接口方法
 */
public interface MonsterAnnotation {

    //添加monster
    /*

           解读
           1. 使用注解方式配置接口方法addMonster
           2. 回顾xml如何配置
           <insert id="addMonster" parameterType="Monster" useGeneratedKeys="true" keyProperty="id">
                INSERT INTO `monster`
                (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
                VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})
            </insert>

            解读
            1. useGeneratedKeys = true 返回自增的值
            2. keyProperty = "id" 自增值对应的对象属性
            3. keyColumn = "id" 自增值对应的表的字段


     */
    @Insert("INSERT INTO `monster` (`age`, `birthday`, `email`, `gender`, `name`, `salary`) " +
            "VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    public void addMonster(Monster monster);

    //根据id删除一个Monster
    /*
        xml文件中的配置
        <delete id="delMonster" parameterType="Integer">
            DELETE FROM `monster` WHERE id = #{id}
        </delete>
     */
    @Delete("DELETE FROM `monster` WHERE id = #{id}")
    public void delMonster(Integer id);

    //修改Monster
    /*
         <update id="updateMonster" parameterType="Monster">
            UPDATE `monster`
            SET `age`=#{age} , `birthday`= #{birthday}, `email` = #{email},
            `gender` = #{gender} , `name`= #{name}, `salary` = #{salary}
            WHERE id = #{id}
        </update>
     */
    @Update("UPDATE `monster` " +
            "SET `age`=#{age} , `birthday`= #{birthday}, `email` = #{email}, " +
            "`gender` = #{gender} , `name`= #{name}, `salary` = #{salary} " +
            "WHERE id = #{id}")
    public void updateMonster(Monster monster);

    //查询-根据id
    /*
        xml配置
        <select id="getMonsterById" resultType="Monster">
            SELECT * FROM `monster` WHERE id = #{id}
        </select>
     */
    @Select("SELECT * FROM `monster` WHERE id = #{id}")
    public Monster getMonsterById(Integer id);

    //查询所有的Monster
    /*
        xml配置
        <select id="findAllMonster" resultType="Monster">
            SELECT * FROM `monster`
        </select>
     */
    @Select("SELECT * FROM `monster`")
    public List<Monster> findAllMonster();
}

修改 mybatis-config.xml , 对 MonsterAnnotaion 进行注册

   <mappers>
        <mapper resource="com/wyxedu/mapper/MonsterMapper.xml"/>

        <!--解读
           1. 如果是通过注解的方式,可不再使用 MonsterMapper.xml
           2. 但是需要在mybatis-config.xml注册/引入含注解的类
           3. 如果没有引入,不能使用
        -->
        <mapper class="com.wyxedu.mapper.MonsterAnnotation"/>
    </mappers>

创建MonsterAnnotationTest完成测试

package com.wyxedu.mapper;

import com.wyxedu.entity.Monster;
import com.wyxedu.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

import java.util.Date;
import java.util.List;


public class MonsterAnnotationTest {

    //属性
    private SqlSession sqlSession;
    private MonsterAnnotation monsterAnnotation;

    @Before
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        monsterAnnotation = sqlSession.getMapper(MonsterAnnotation.class);
        //返回的依然是一个接口的代理对象
        System.out.println("monsterAnnotation--" + monsterAnnotation.getClass());
    }

    @Test
    public void addMonster() {

        Monster monster = new Monster();
        monster.setAge(30);
        monster.setBirthday(new Date());
        monster.setEmail("kate6@qq.com");
        monster.setGender(1);
        monster.setName("狐狸精-100");
        monster.setSalary(1000);
        //使用在接口方法配置注解方式完成对DB操作
        monsterAnnotation.addMonster(monster);
        System.out.println("添加后monster-id-" + monster.getId());

        //如果是增删改, 需要提交事务
        if(sqlSession != null) {
            sqlSession.commit();
            sqlSession.close();
        }

        System.out.println("保存成功...");

    }

    @Test
    public void findAllMonster() {

        //使用接口配置注解的方式操作DB
        List<Monster> allMonster = monsterAnnotation.findAllMonster();
        for (Monster monster : allMonster) {
            System.out.println("monster--" + monster);
        }


        if(sqlSession != null) {
            sqlSession.close();
        }

        System.out.println("查询成功...");
    }
}

注意事项和说明 

1.如果是通过注解的方式,就不再使用MonsterMapper.xml文件,但是需要在mybatis-config.xml文件中注册含注解的类/接口

2.使用注解方式,添加时,如果要返回自增长id值,可以使用@Option注解

    @Insert("INSERT INTO `monster` (`age`, `birthday`, `email`, `gender`, `name`, `salary`) " +
            "VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
public void addMonster(Monster monster);

其他的类似


mybatis-config.xml-配置文件详解

说明

mybatis 的核心配置文件(mybatis-config.xml),比如配置 jdbc 连接信息,注册 mapper等等,我们需要对这个配置文件有详细的了解

文档地址: https://mybatis.org/mybatis-3/zh/configuration.html

properties 属性

● 通过该属性,可以指定一个外部的 jdbc.properties 文件,引入我们的 jdbc 连接

 创建 jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8
jdbc.user=root
jdbc.pwd=123456

修改 mybatis-confing.xml

    <environments default="development">
        <environment id="development">
            <!--配置事务管理器-->
            <transactionManager type="JDBC"/>
            <!--配置数据源
            解读
            1. 我们使用外部的properties文件来设置相关的值
            2. 这个属性文件,需要统一的放在 resources目录/类加载路径
            3. 关于属性文件,在讲解java基础-集合
            -->
            <dataSource type="POOLED">
                <!--配置驱动-->
                <!--<property name="driver" value="com.mysql.jdbc.Driver"/>-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--配置连接mysql-url
                解读:
                1. jdbc:mysql 协议
                2. 127.0.0.1:3306 : 指定连接mysql的ip+port
                3. mybatis: 连接的DB
                4. useSSL=true 表示使用安全连接
                5. &amp; 表示 & 防止解析错误
                6. useUnicode=true : 使用unicode 作用是防止编码错误
                7. characterEncoding=UTF-8 指定使用utf-8, 防止中文乱码
                8. 温馨提示:不要背,直接使用即可
                -->
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.pwd}"/>
            </dataSource>
        </environment>
    </environments>

 修改父项目的 pom.xml(如果已经配置了*.properties 就不用再配置) 并完成测试

解读:

在build中配置resources,来防止我们资源导出失败的问题      

1. 不同的idea/maven 可能提示的错误不一样

2. 不变应万变,少什么文件,就增加相应配置即可

3. 含义是将 src/main/java目录和子目录 和 src/main/resources目录和子目录的资源文件 xml 和 properties在build项目时,导出到对应的target目录下


    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>

settings 全局参数定义

settings 列表,通常使用默认

typeAliases 别名处理器

1.    别名是为 Java 类型命名一个短名字。它只和 XML 配置有关,用来减少类名重复的部分
2.    如果指定了别名,我们的MappperXxxx.xml 文件就可以做相应的简化处理
3.    注意指定别名后,还是可以使用全名的
4.    举例说明

修改mybatis-confi g.xml

    <!--配置别名-->
    <typeAliases>
        <!--<typeAlias type="com.wyxedu.entity.Monster" alias="Monster"/>-->

        <!--
            如果一个包下有很多的类,我们可以直接引入包,这样
            该包下面的所有类名,可以直接使用
        -->
        <package name="com.wyxedu.entity"/>
    </typeAliases>

修改MonsterMapper.xml 并完成测试

 没有在 mybatis-config.xml 指定 typealiases 时,需要给 Monster 指定全类名

   <!--配置addMonster
       1. id="addMonster" 就是接口的方法名
       2. parameterType="com.wyxedu.entity.Monster" 放入的形参的类型
       3. 注意"com.wyxedu.entity.Monster" 可以简写
       4. 写入sql语句=> 建议,现在sqlyog 写完成-测试通过,再拿过来
       5. (`age`, `birthday`, `email`, `gender`, `name`, `salary`) 表的字段
       6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性值
       7. 这里 #{age} age 对应monster对象的属性名,其它一样
   -->
    <insert id="addMonster" parameterType="Monster" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO `monster`
        (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
        VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})
    </insert>

typeHandlers 类型处理器

1.    用于java 类型和jdbc 类型映射
2.    Mybatis 的映射基本已经满足,不太需要重新定义
3.    这个我们使用默认即可,也就是 mybatis 会自动的将 java 和 jdbc 类型进行转换.
4.    java 类型和 jdbc 类型映射关系一览 [ 手 册 ]

https://mybatis.org/mybatis-3/zh/configuration.html#typeHandlers 

 

 environments 环境

resource 注册Mapper 文件: XXXMapper.xml 文件(常用,使用过)

 class:接口注解实现(使用过)

url:外部路径,使用很少,不推荐, <mapper url="file:///D:\yy\kk\yy\MOnsterMapper.xml" />

package 方式注册 :<package name="com.hspedu.mapper"/> 并测试

当一个包下有很多的 Mapper.xml 文件和基于注解实现的接口时,为了方便,我们可以以包方式进行注册将下面的所有 xml 文件和注解接口 都进行注册

<package name="com.wyxedu.mapper"/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510922.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《计算机网络—自顶向下方法》 第二章Wireshark实验:DNS协议分析

域名系统 DNS(Domain Name System) 是互联网使用的命名系统&#xff0c;用于把便于大家使用的机器名字转换为 IP 地址。许多应用层软件经常直接使用 DNS&#xff0c;但计算机的用户只是间接而不是直接使用域名系统。 互联网采用层次结构的命名树作为主机的名字&#xff0c;并使…

Pytorch高级训练框架Ignite详细介绍与常用模版

引言 Ignite是Pytorch配套的高级框架&#xff0c;我们可以借其构筑一套标准化的训练流程&#xff0c;规范训练器在每个循环、轮次中的行为。本文将不再赘述Ignite的具体细节或者API&#xff0c;详见官方教程和其他博文。本文将分析Ignite的运行机制、如何将Pytorch训练代码转为…

Kubectl-AI: 一款 OpenAI GPT 自动生成应用 K8s yaml神器

首页: 官网 下载安装 wget https://github.com/sozercan/kubectl-ai/releases/download/v0.0.10/kubectl-ai_linux_amd64.tar.gz tar xvf kubectl-ai_linux_amd64.tar.gz -C /usr/local/bin/kubectl-ai需要OpenAI API密钥或Azure OpenAI服务 API密钥和端点以及有效的Kubernet…

系统移植——linux内核移植——分析内核编译过程

uImage镜像文件 1.进入linux内核源码目录 ubuntuubuntu:~$ cd FSMP1A/linux-stm32mp-5.10.61-stm32mp-r2-r0/linux-5.10.61/ 打开Makefile文件 vi Makefile 搜索include 因为 $(SRCARCH)->arm 所以上述指令为 arch/arm/Makefile 2.进入linux内核源码目录下,arch/arm目录下…

Windows 11 本地部署 Stable Diffusion web UI

Windows 11 本地部署 Stable Diffusion web UI 0. 什么是 Stable Diffusion1. 什么是 Stable Diffusion web UI2. Github 地址3. 安装 CUDA Toolkit 11.84. 安装 cuDNN v8.9.1 for CUDA 11.x5. 配置环境变量6. 安装 Python 3.10.67. 安装 Stable Diffusion web UI8. 启动 Stabl…

吊打面试官的Java项目经验一:物流系统

引言&#xff1a; java面试一般分为两部分&#xff0c;技术面试和项目面试&#xff0c;相信大多数小伙伴们都刷过很多技术性的面试题&#xff0c;连博主本人也刷过很多无聊的面试题&#xff0c;但是对于项目经验的面试&#xff0c;可能很多刚入行小伙伴属于一个空白期&#xff…

【软考|软件设计师】编辑距离算法

目录 编辑距离算法&#xff1a; 步骤&#xff1a; 实例&#xff1a; 题&#xff1a; 完整代码如下&#xff1a; 调试&#xff1a; 代码解析&#xff1a; 具体过程参考&#xff1a; 编辑距离算法&#xff1a; 是一种计算两个自符串之间差异程度的方法&#xff0c;它通过…

现场工程师出马:VMware+LVM卷快速在windows Server上部署Kafka集群

最近遇到的疑难现场问题层出不穷&#xff0c;本次遭遇的挑战是在4台windows Server 服务器上部署Kafka集群。这是一种比较少见的操作&#xff0c;原因是有些依赖的驱动对虚拟化支持不好&#xff0c;只能运行在实体win机上。 原有的上层业务是由B团队开发运维&#xff0c;现在B…

今年的博客数量上两百了

今年的博客数量上两百了 不知不觉在 C S D N CSDN CSDN中写了那么多篇文章。与 C S D N CSDN CSDN相伴的生活中&#xff0c;我过得很充实。

并发编程10:Java对象内存布局和对象头

文章目录 10.1 面试题10.2 Object object new Object()谈谈你对这句话的理解&#xff1f;10.3 对象在堆内存中布局10.3.1 权威定义----周志明老师JVM10.3.2 对象在堆内存中的存储布局 10.4 再说对象头的MarkWord10.5 聊聊Object obj new Object()10.5.1 运行结果展示10.5.2 压…

C++入门(命名空间、缺省参数、函数重载、引用、内联函数)

全文目录 引言C输入与输出命名空间概念使用使用域作用限定符::使用某个成员使用using namespace 引入整个命名空间域使用using引入某个成员 缺省参数概念分类 函数重载定义与调用原理 引用定义需要注意 使用引用作为返回型参数引用作为返回值 引用与指针的区别 内联函数总结 引…

华为OD机试真题 Java 实现【猜字谜】【2023Q2】

一、题目描述 小王设计了一人简单的清字谈游戏&#xff0c;游戏的迷面是一人错误的单词&#xff0c;比如nesw&#xff0c;玩家需要猜出谈底库中正确的单词。猜中的要求如 对于某个谜面和谜底单词&#xff0c;满足下面任一条件都表示猜中&#xff1a; 变换顺序以后一样的&…

np保存数据为txt或者csv格式

目录 1、基础参数 2、参数详解 2.1、fmt 2.2、delimiter 2.3、newline 2.4、header 1、基础参数 numpy.savetxt(fname,arrry,fmt%.18e,delimiter ,newline\n,header,footer,comments# ,encodingNone,) 2、参数详解 fname:要存入的文件、文件名、或生成器。arrry:要存储…

xxl-Job分布式任务调度 入门

1.概述 1.1 什么是任务调度 我们可以先思考一下业务场景的解决方案&#xff1a; 某电商系统需要在每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券。 某银行系统需要在信用卡到期还款日的前三天进行短信提醒。 某财务系统需要在每天凌晨0:10结算前一天的…

C高级第二天

#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,const char *argv[]) { int n 0, m 0, MAX 0; int arr[n][m]; printf("请输入矩阵行数、列数>>>"); scanf("%d%d", &n…

【动态规划】线性DP

目录 一&#xff1a;思考方式 二&#xff1a;例题 例题1&#xff1a;数字三角形 例题二&#xff1a;最长上升子序列​​​​​​​ 例题三&#xff1a;最长公共子序列 一&#xff1a;思考方式 线性dp就是一条线上的动态规划 二&#xff1a;例题 例题1&#xff1a;数字三…

Python基础(三)

目录 1、Python的输入函数input() 1、input函数介绍 1.1作用&#xff1a; 1.2返回值类型&#xff1a; 1.3值得存储&#xff1a; 2、input函数的基本使用 2、Python中的运算符 2.1算术运算符 2.1.1标准算术运算符 2.1.2取余运算符(%) 2.1.3幂运算符(**) 2.1.4特殊运…

分布式锁的多种实现方式

1、不使用分布式锁 synchronized (this){int stock Integer.parseInt(Objects.requireNonNull(stringRedisTemplate.opsForValue().get("stock")));if (stock > 0) {int realStock stock - 1;// 更新库存stringRedisTemplate.opsForValue().set("stock&qu…

vi编辑器的三种模式及其对应模式下常用指令

vi是Linux系统的第一个全屏幕交互式编辑工具&#xff0c;在嵌入式的 学习中是一个不可或缺的强大的文本编辑工具。 一、三种模式 命令模式 如何进入命令模式&#xff1a;按esc键 复制&#xff1a;yy nyy(n&#xff1a;行数) 删除(剪切): dd ndd 粘贴&#xff1a;p 撤销&…

【Java】java | 将可运行jar打包成exe可执行文件

一、说明 1、javafx桌面程序&#xff0c;但又不想安装jre环境 2、需要将可执行jar打包成exe 3、使用工具exe4j 二、操作步骤 1、下载exe4j https://exe4j.apponic.com/ 2、安装 说明1&#xff1a; 在d盘建个exe4j的文件夹 说明2&#xff1a; 建个output文件jar&#xff0c;存放…