Mybatis全局配置及映射关系的实现

目录
  • 一、配置文件内容
    • 1.1、Proerties
    • 1.2、设置setting
    • 1.3、类型别名typeAliases
    • 1.4、映射器Mappers
    • 1.5、dataSource
    • 1.6、事务
  • 二、Mybatis中的关系映射
    • 2.1、一对一映射
    • 2.2、一对多映射

一、配置文件内容

mybatis.xml就是Mybatis的全局配置文件。

全局配置文件需要在头部使用约束文件。

<?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--属性:加载外部配置文件,例如数据库的连接信息
    Settings--全局配置参数:例如日志配置
    typeAliases--类型别名
    typeHandlers--类型处理器
    objectFactory--对象工厂
    Plugins--插件:例如分页插件
    Environments--环境集合属性对象
        environment(环境变量)
            transactionManager(事务管理器)
            dataSource(数据源)
    Mappers--映射器:注册映射文件

1.1、Proerties

属性可以在外部配置,并可以进行动态替换。我们既可以在properties元素的子元素设置(例如Datasource中的properties节点)也可以在java属性文件中配置。

数据源中有连接数据库的四个参数数据,我们一般都放在专门的属性文件中,mybatis的全局配置文件直接从属性文件中读取数据。

1、resources目录下创建jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?serverTimezone=UTC&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123@qwe

2、mybatis.xml中引入配置文件

    <properties resource="jdbc.properties"/>

3、使用属性文件中的值

 <dataSource type="POOLED">
    <!--  连接数据库四大参数  -->
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</dataSource>

1.2、设置setting

Mybatis中极为重要的调整设置,它们会改变Mybatis的运行行为,例如日志。

 <!-- 配置日志   -->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

1.3、类型别名typeAliases

可以为java类型设置一个缩写别名,仅用于xml配置,意在减低冗余全限定类名书写。
MyBatis中已经支持一些常见类型的别名,如下:

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

也支持自定义别名:

 <typeAliases>
        <!--  对单个实体类定义别名 -->
        <typeAlias type="com.jsonliu.test.entity.Users" alias="Users" />
        <!--  推荐:批量定义别名,扫描指定包下所有类,同时别名定义为类名,别名首字母大小写都可以 -->
        <package name="com.jsonliu.test.entity"/>
    </typeAliases>

1.4、映射器Mappers

1.4.1、使用相对于类路径的资源引用

语法:<mapper resource="">
使用相对于类路径的资源,从classpath路径查找文件
例如:<mapper resource="com/jsonliu/test/entity/Team.xml"/>

1.4.2、使用映射器接口实现类的完全限定类名

语法:<mapper class="">
要求:接口和映射文件同包同名
<mapper class="com.jsonliu.test.mapper.UsersMapper"/>

1.4.3、将包内映射器接口全部注册为映射器

推荐

语法:<package name="">
指定包下的所有mapper接口
例如:<package name="com.jsonliu.test.mapper"/>
注意:此种方法要求Mapper接口名称和mapper映射文件名称相同,且在同一个目录中

1.5、dataSource

Mybatis中访问数据库支持连接池技术,而且采用的自己的连接池技术。在mybatis.xml文件中进行配置,根据type属性创建相应类型数据源DataSource。
Mybatis数据源分三类:

  • UNPOOLED:不使用连接池数据源
  • POOLED:使用连接池数据源
  • JNDI:使用JNDI实现的数据源

前两个数据源都实现了javax.sql.Datasource接口

1.6、事务

默认手动提交事务:

Mybatis框架是对JDBC的封装,所以Mybatis事务的控制方式本身也是用JDBC的connection对象的commit()、rollback()方法,connection对象的setAutoCommit()设置事务提交方式为手动或者自动。

<!--  事务类型:使用JDBC事务,使用connection提交和回滚  -->
            <transactionManager type="JDBC" />

transactionManager 指定Mybatis所用事务管理器,支持:JDBC与MANAGED

JDBC事务管理机制,通过Connection对象的commit()方法提交,rollback()方法回滚。默认情况下Mybatis将关闭自动提交功能,观察日志可以看出,提交或者回滚都需要我们手动设置。

MANAGED:由容器来管理事务的整个生命周期(如Spring容器)

SqlSessionFactory的openSession()方法存在重载,可以设置自动提交方式。
如果sqlSession = SqlSessionFactory.openSession(true);
参数设置为true,再次执行增删改不需要执行sqlSession.commit(),事务会自动提交。

二、Mybatis中的关系映射

表结构如下:

2.1、一对一映射

添加实体类Player:

public class Player {
    private Integer playerId;
    private String playerName;
    private Integer playerNum;
    private Integer teamId;
    private Team team1;

    public Player() {
    }

    public Player(Integer playerId, String playerName, Integer playerNum, Integer teamId) {
        this.playerId = playerId;
        this.playerName = playerName;
        this.playerNum = playerNum;
        this.teamId = teamId;
    }

    @Override
    public String toString() {
        return "Player{" +
                "playerId=" + playerId +
                ", playerName='" + playerName + '\'' +
                ", playerNum=" + playerNum +
                ", teamId=" + teamId +
                ", team1=" + team1 +
                '}';
    }

    public Integer getPlayerId() {
        return playerId;
    }

    public void setPlayerId(Integer playerId) {
        this.playerId = playerId;
    }

    public String getPlayerName() {
        return playerName;
    }

    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }

    public Integer getPlayerNum() {
        return playerNum;
    }

    public void setPlayerNum(Integer playerNum) {
        this.playerNum = playerNum;
    }

    public Integer getTeamId() {
        return teamId;
    }

    public void setTeamId(Integer teamId) {
        this.teamId = teamId;
    }

    public Team getTeam1() {
        return team1;
    }

    public void setTeam1(Team team1) {
        this.team1 = team1;
    }
}

Mapper接口:

public interface PlayerMapper {

    Player queryById(int playerId);
    Player queryById1(int playerId);
    Player queryById2(int playerId);
    Player queryById3(int playerId);

}

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.jsonliu.test.mapper.PlayerMapper">
    <select id="queryById" resultType="player">
        select * from player where playerId=#{playerId}
    </select>

    <select id="queryById1" resultMap="joinTeamResult1">
        select * from player a inner join team b on a.teamId=b.teamId
        where a.playerId=#{playerId}
    </select>

    <select id="queryById2" resultMap="joinTeamResult2">
        select * from player a inner join team b on a.teamId=b.teamId
        where a.playerId=#{playerId}
    </select>

    <select id="queryById3" resultMap="joinTeamResult3">
        select * from player where playerId=#{playerId}
    </select>

    <resultMap id="baseResultMap" type="player">
        <id property="playerId" column="playerId" ></id>
        <result property="playerName" column="playerName"></result>
        <result property="playerNum" column="playerNum"></result>
        <result property="teamId" column="teamId"></result>
    </resultMap>

    <!-- 方式一:关联对象.属性,要求连接查询。 extends=表示继承其他的resultMap的ID  -->
    <resultMap id="joinTeamResult1" type="player" extends="baseResultMap">
        <id property="team1.teamId" column="teamId"></id>
        <result property="team1.teamName" column="teamName"></result>
        <result property="team1.location" column="location"></result>
        <result property="team1.createTime" column="createTime"></result>
    </resultMap>

    <!-- 方式二:直接引用关联对象的mapper映射,要求连接查询。 property=关联对象的属性名
        javaType=关联对象的类型  resultMap=关联对象命名空间中的resultMap-->
    <resultMap id="joinTeamResult2" type="player" extends="baseResultMap">
        <association property="team1" javaType="team" resultMap="com.jsonliu.test.mapper.TeamMapper.baseResultMap"/>
    </resultMap>

    <!-- 方式三:直接引用关联对象的查询方法,要求关联对象的mapper中必须有单独的查询方法。 property=关联对象的属性名
    javaType=关联对象的类型 select=关联对象的单独查询语句 column=外键列 -->
    <resultMap id="joinTeamResult3" type="player" extends="baseResultMap">
        <association property="team1" javaType="team" select="com.jsonliu.test.mapper.TeamMapper.queryById" column="teamId"/>
    </resultMap>
</mapper>

测试类:

public class PlayerMapperTest {

    private PlayerMapper mapper=MybatisUtil.getSqlSession().getMapper(PlayerMapper.class);

    @Test
    public void test1(){
        Player player = mapper.queryById1(1);
        System.out.println(player);
    }

    @Test
    public void test2(){
        Player player = mapper.queryById2(1);
        System.out.println(player);
    }

    @Test
    public void test3(){
        Player player = mapper.queryById3(1);
        System.out.println(player);
    }
}

2.2、一对多映射

修改实体类Team.java:

public class Team {
    /**
     * 球队ID
     */
    private Integer teamId;
    /**
     * 球队名称
     */
    private String teamName;
    /**
     * 球队地址
     */
    private String location;
    /**
     * 创立时间
     */
    private Date createTime;
    /**
     * 队员集合
     */
    private List<Player> playerList;
    ...
}

TeamMapper接口中添加方法:

    Team queryById1(int teamId);

    Team queryById2(int teamId);

PlayerMapper接口中添加方法:

    List<Player> queryByTeamId(int teamId);

TeamMapper.xml中添加映射:

 <!-- 方式一:使用collection,property=关联对象集合名称,javaType=关联对象集合类型,ofType=关联对象集合的泛型,
       resultMap=引起关联对象的结果映射  -->
    <resultMap id="joinResult1" type="team" extends="baseResultMap">
        <collection property="playerList" javaType="arrayList" ofType="Player" resultMap="com.jsonliu.test.mapper.PlayerMapper.baseResultMap"/>
    </resultMap>

    <!-- 方式一:使用collection,property=关联对象集合名称,javaType=关联对象集合类型,ofType=关联对象集合的泛型,
      select=引起关联对象的单独查询方法,使用的前提是关联对象中该方法可用
      column=引起关联对象的单独查询方法的参数,一般是外键-->
    <resultMap id="joinResult2" type="team" extends="baseResultMap">
        <collection property="playerList" javaType="arrayList" select="com.jsonliu.test.mapper.PlayerMapper.queryByTeamId" column="teamId"/>
    </resultMap>

PlayerMapper.xml中添加映射:

  <select id="queryByTeamId" resultType="player">
        select * from player where teamId=#{teamId}
    </select>

测试类中添加测试方法:

 @Test
    public void test13(){
        TeamMapper mapper = sqlSession.getMapper(TeamMapper.class);
        Team team = mapper.queryById1(1025);
        System.out.println(team);
    }

    @Test
    public void test14(){
        TeamMapper mapper = sqlSession.getMapper(TeamMapper.class);
        Team team = mapper.queryById2(1025);
        System.out.println(team);
    }

到此这篇关于Mybatis全局配置及映射关系的实现的文章就介绍到这了,更多相关Mybatis全局配置及映射关系内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis全局配置文件详解

    目录 MyBatis全局配置文件 settings 设置 typeAliases 类型命名 存在的问题: @Alias("") environments 环境 transactionManager 事务管理器 JDBC:JdbcTransactionFactory databaseIdProvider 数据库厂商标识 DB_VENDOR 变短 sql映射文件 总结 MyBatis全局配置文件 MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性

  • mybatisPlus 实体类与数据库表映射关系详解

    目录 实体类与数据库表映射关系 具体的映射方法有两种 忽略某个实体类属性和数据库表字段之间的映射关系 问题描述 解决方案 实体类与数据库表映射关系 使用mybatisPlus时,会确定实体类和数据的映射关系 具体的映射方法有两种 1.默认:采用驼峰映射规则 例如MyUserTable 对应的数据库表为 my_user_table ;  TEMyUserTable 对应表名为t_e_my_user_table; 2.注解@TableName   在类名上方添加@TableName("my_user

  • Mybatis如何使用@Mapper和@MapperScan注解实现映射关系

    目录 使用@Mapper和@MapperScan注解实现映射关系 Mybatis-@MapperScan和mybatis:scan分析 <mybatis:scan> MapperScan 使用@Mapper和@MapperScan注解实现映射关系 MyBatis与Spring整合后需要实现实体和数据表的映射关系. 实现实体和数据表的映射关系可以在Mapper类上添加@Mapper注解,如下代码: /** * 用户信息Mapper动态代理接口 * @author pan_junbiao **/

  • Mybatis全局配置及映射关系的实现

    目录 一.配置文件内容 1.1.Proerties 1.2.设置setting 1.3.类型别名typeAliases 1.4.映射器Mappers 1.5.dataSource 1.6.事务 二.Mybatis中的关系映射 2.1.一对一映射 2.2.一对多映射 一.配置文件内容 mybatis.xml就是Mybatis的全局配置文件. 全局配置文件需要在头部使用约束文件. <?xml version="1.0" encoding="UTF-8" ?>

  • MyBatis映射关系详解

    目录 数据库的配置 一.映射关系一对一 1.映射关系 1 对 1-基本介绍 2.映射关系 1 对 1-映射方式 3.应用实例 3.1方式一 方式二: 通过配置 XxxMapper.xml 的方式来实现下面的 1 对 1 的映射关系,实现级 联查询 , 通过 person 可以获取到对应的 identcard 信息 重点解析: 注解的方式实现 通过注解的方式来实现下面的 1 对 1 的映射关系,实现级联查询 , 通过 person 可以获取到 对应的 identcard 信息 在实际开发中还是 推

  • Mybatis 创建方法、全局配置教程详解

    总体介绍:MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]! 和数据库打交道的技术有: 原生的JDBC技术--->Spring的JdbcTemplate技术 这些工具都是提供简单的SQL语句的执行,但是和我们这里学的MyBatis框架还有些不同, 框架是一整套的东西,例如事务控制,查询缓存,字段映射等等. 我们用原生JDBC操作数据库的时候都会经过: 编写sql---->预编译---->设置参数----->执行sql------->

  • MyBatis全局映射文件实现原理解析

    全局配置文件为mybatis-config.xml 1.properties标签 <properties resource="dbconfig.properties"></properties> 可以使用properties来引入外部properties配置文件的内容 引入方式有两种: ①resource:引入类路径下的资源 ②url:引入网络路径或者磁盘路径下的资源 2.settings标签 <settings> <setting name=

  • 浅谈hibernate中多表映射关系配置

    1.one-to-many 一对多关系的映射配置(在一的一方实体映射文件中配置) <!-- cascade属性:级联操作属性 save-update: 级联保存,保存客户时,级联保存客户关联的联系人 delete:级联删除,删除客户时,级联删除客户关联的联系人 all:级联保存+级联删除 --> <!-- inverse属性:设置是否不维护关联关系 true:不维护关联 false(默认值):维护关联 --> <!-- 一对多 --> <set name=&quo

  • Hibernate使用hbm.xml配置映射关系解析

    在使用hibernate时,经常需要配置与类对应的hbm.xml文件,并在其中指明数据库表的具体细节. 由于映射关系的配置比较繁琐,故总结了模板代码如下: 多对一: <many-to-one name="本类中的属性名" class="对方类" column="本类中的属性名+Id"></many-to-one> 一对多: <set name="本类中的属性名"> <key colum

  • mybatis学习笔记之mybatis注解配置详解

    Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyBatis 很大程度简化了你的代码而且保持简洁,很容易理解和维护.MyBatis 3 已经引入 了很多重要的改进来使得 SQL 映射更加优秀. MyBatis 3构建在基于全面且强大的Java配置API上.该配置API是基于XML的MyBatis配置的基础,也是新的基于注解配置的基础

  • 基于MyBatis XML配置方法(全面了解)

    MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息. 文档的顶层结构如下: configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFactory 对象工厂 plugins 插件 environments 环境 environment 环境变量 transactionManager 事务管理器 dataSourc

  • Mybatis结果集自动映射的实例代码

    在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType.这个时候其实就用到了Mybatis的结果集自动映射.Mybatis的自动映射默认是开启的,有需要我们也可以将其关闭(还可以调整自动映射的策略). 1       Mybatis结果集自动映射 在使用Mybatis时,有的时候我们可以不用定义resultMap,而是直接在<select>语句上指定resultType.这个时候其实就用到了Mybatis的结果集

随机推荐