MyBatis 配置文件记录

概念 

  将数据库表中记录的数据查询出来,并封装成一个实体类的对象。
  SqlSession代表和数据库的一次会话,是用openSession对象实现的,用完必须关闭,释放资源。
  SqlSession和connection一样都是非线程安全的,每次使用都应该获取新的对象。
  mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。

1  初级的mybatis

  拥有两个配置文件:全局配置文件 和 映射文件,必须创建mybatis环境。这里用IDEA创建maven项目,只需要在相应的POM文件中写入maven依赖即可。

1.1  pom.xml文件中添加相应依赖

<dependencies>
<!--mybatis依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
<!--mysql驱动依赖-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.7.6</version>
    </dependency>
<!--log4j日志文件系统-->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
<!--这个依赖用于做测试-->    
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.2</version>
        <scope>compile</scope>
    </dependency>
</dependencies>
<!--这个插件,将应用打包成一个可执行的jar包-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

1.2  全局配置文件 mybatis.xml

  在此映射文件中,只需要指定输入参数类型,返回结果参数类型,sql语句等就差不多了,也就是将原本jdbc所遇到的硬编码问题全部是使用xml配置文件来替代。以下是一个简单的示例。

1.2.1  全部 MyBatis 的配置元素

  MyBatis 配置 XML 文件的层次结构。这些层次是不能够颠倒顺序的,如果颠倒顺序,MyBatis 在解析 XML 文件的时候就会出现异常了。

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--配置-->
    <properties/><!--属性-->
-------------------------------------------------------------------------
    <settions/><!--设置-->
        属性:mapUnderscoreToCamelCase
        是否开启自动驼峰命名规则(camel cass)映射。
        即从经典数据库列名A_COLUMN到经典Java属性名aColumn的类似映射
        例如:数据库列名为U_NAME,则Java属性名为uName
    数据库表中的字段名称下划线后面的第一个字母,与Java属性名的第一个大写字母相同
    例如:
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
-------------------------------------------------------------------------
    <typeAliases><!--别名处理器,为某一个类型命名,不区分大小写-->
        <!-- 配置别名role,它代表com.learn.po.Role -->
        <typeAliase alias="role" type="com.learn.po.Role"/>
        <package name="com.zzfan.framework.entiey"/>
        name:指定包名
        可以为当前包以及下面所有的包中的每一个类起默认别名
        默认别名是类名的全小写
        package标签写在typeAliases标签中
    </typeAliases>
        <!-- 
            起好的别名用在映射文件中
            写sql语句的标签的resultType parameterType等标签中 
        -->

-------------------------------------------------------------------------
    <typeHandlers/><!--类型处理器-->
-------------------------------------------------------------------------
    <objectFactory/><!--对象工厂-->
-------------------------------------------------------------------------
    <plugins/><!--插件-->
-------------------------------------------------------------------------
    <environments><!--配置环境-->
    <!-- mybatis可以配置多种环境 -->    
        <environment>
        id:当前环境的唯一标识,便于多种开发环境切换
        <!-- 必须有以下两个标签 -->
            <transactionManager/><!--事务管理器-->
            <dataSource/><!--数据源-->
        </environment>
    </environments>
    <!-- 有如下示例 -->
    <environments default="development"> 
    <!-- 通过更改default来改变当前环境,达到快速切换的目的 -->
        <environment id="development" >
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
            </dataSource>
        </environment>
        <environment id="test">
            ...
            <!-- 当前环境用于测试,用到该环境时,只需要修改default的值 -->
        </environment>

</environments>
-------------------------------------------------------------------------
    <databaseIdProvider/><!--数据库厂商标识-->
        type属性:得到数据库厂商标识(驱动自带)
        mybatis就能根据数据库厂商标识执行不同的sql
        
        <!-- 为不同的数据库厂商起别名 -->
        <properties name="MySQL" value="mysql">
        然后在映射文件的标签如<select>等有一个databaseId属性,写其对应的别名
-------------------------------------------------------------------------
    <mappers/><!--映射器-->
    每一个mapper标签都注册一个标签,四种方式加载映射文件
    1,2注册配置文件 3注册接口
    1. <mapper resource="映射文件地址"/>
        引用类路径下的sql映射文件,使用相对路径,相对于项目下的。
        "mybatis/mybatis-config.xml"
    2. <mapper url=""/> 
        使用绝对路径或者网络路径,一般不用。
        "file:///var/mappers/AuthorMapper.xml"
    3. <mapper class=""/>
      A:接口的全限定名:包括类名以及接口的名称在内的全类名
        使用mapper接口的全限定名让mybatis通过全限定名称自己找映射文件
        前提:mapper接口的名称必须与映射文件名称相同,并放到同一目录下
      B:没有sql映射文件,在接口方法上使用注解
        @select("select * from tbl_employee where id = #{id}")
    4. <package name=""/>
        注册指定包下的所有映射文件
        注意:mapper接口的名称必须与映射文件名称相同,并放到同一目录下
-------------------------------------------------------------------------
</configuration>

1.2.2  配置文件示例

<?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) -->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="zzf940227"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 写好的sql映射文件一定要注册到全局配置文件中 -->
    <mappers>
        <mapper resource="mapper/EmployeeMapper.xml"/>
    </mappers>
</configuration>

1.2.3 引入外部数据库配置信息

  引用db.properties中的信息,将上述配置信息中的dataSource标签中的内容进行如下修改。

# 引用外部数据库文件
         <dataSource type="POOLED">
             <!-- 引用db.properties中的信息,通过${} -->
             <property name="driver" value="${db.driver}"/>
             <property name="url" value="${db.url}"/>
             <property name="username" value="${db.username}"/>
             <property name="password" value="${db.password}"/>
         </dataSource>

# db.properties文件配置信息
db.driver = com.mysql.cj.jdbc.Driver
db.url = jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=utf8&aserverTimezone=GMT
db.username = root
db.password = zzf940227

# 导入properties文件
<properties resource = "db.properties">


1.3  映射文件操作  xxxMapper.xml
# xxxrMapper.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">
<!--namespace:名称空间,随便起(也别太随便),一般是该文件的全限定名
    id:唯一标识
    resultType:返回值类型(对应的应该是表相应的实体类)
    #{id}:从传递过来的参数中取出ID值
-->
<mapper namespace="mapper.xxxMapper">
    <select id="selectEmpid" resultType="com.zzfan.test.Mybatis.Employee">
        查询操作,这里写sql语句,下面的是示例。
    </select>
    <insert id="insertid" parameterType="com.zzfan.test.Mybatis.User">
        添加操作
    </insert>
    <delete id="deleteid" parameterType="com.zzfan.test.Mybatis.Employee">
        删除操作
    </delete>
    <update id="deleteid" parameterType="com.zzfan.test.Mybatis.Employee">
        更新操作
    </update>
--------------------------------------------------------------------
    <!-- resultMap最终还是要将结果映射到pojo上, -->
    <!--
        type:指定映射到哪一个pojo
        id:  设置ResultMap的id
    -->
    <resultMap type="order" id="orderResultMap">
        <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
        <!-- property:主键在pojo中的属性名 -->
        <!-- column:主键在数据库中的列名 -->
        <id property="id" column="id" />
        <!-- 定义普通属性 -->
        <result property="userId" column="user_id" />
        <result property="number" column="number" />
        <result property="createTime" column="create_time" />
        <result property="note" column="note" />
    </resultMap>
--------------------------------------------------------------------
</mapper>

2 DAO接口方式

  在开发中,都是开发DAO接口和DAO实现类,然后再DAO实现类中调用sqlsession的方法对数据库进行增删改查操作。

  让我留意到的是命名方式,有的是用 xxxDao 的方式命名,有的是 xxxMapper。两种肯定是都行。但我个人习惯使用Mapper结尾,与Mapper配置文件相对应。

  数据库表字段对应实体类的私有成员变量。

2.1 实体类

package com.zzfan.framework.entity;

public class Employee {
    private Integer id;
    private String last_name;
    private String email;
    private String gender;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getLastName() {
        return last_name;
    }
    public void setLastName(String lastName) {
        this.last_name = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", last_name='" + last_name + '\'' +
                ", email='" + email + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

2.2 DAO接口

import com.zzfan.framework.entity.Employee;

/**
 * 这个接口就是用来查出Employee,记录数据,并封装成Employee对象
 */
public interface EmployeeMapper {

    public Employee getEmpById(Integer id);

    public void addEmp(Employee employee);

    public void updateEmp(Employee employee);

    public void deleteEmpById(Integer id);

}

2.3  DAO接口实现类

package com.zzfan.framework.Impl;

import com.zzfan.framework.dao.EmployeeMapper;
import com.zzfan.framework.entity.Employee;
/**
 * 这里仅实现了接口的一个方法用于测试
 */
public class EmployeeMapperImpl implements EmployeeMapper {
    private SqlSessionFactory sqlSessionFactory;
    public EmployeeMapperImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public Employee getEmpById(Integer id) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession.selectOne("com.zzfan.framework.dao.EmployeeMapper.getEmpById", id);
    }
}

 

2.4  映射文件

# 部分内容进行修改
# mapper标签的namespace属性一般指定为接口的全限定名
<mapper namespace="com.zzfan.framework.dao.EmployeeMapper">
<!-- select标签的id就是接口的getEmpById()方法 -->
    <select id="getEmpById" resultType="com.zzfan.framework.entity.Employee">
        select * from tbl_employee where id = #{id}
    </select>
</mapper>

2.5  测试

public class MybatisTest {

    @Test
    public void test() throws IOException {
        // 1、读取配置文件
        String resource = "mybatis/mybatis-config.xml";
        // 2、获取SqlSessionFactory对象
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 3、获取sqlSession实例,能直接执行已经映射的sql语句
        SqlSessionFactory sqlSessionFactory = 
            new SqlSessionFactoryBuilder().build(inputStream);
        EmployeeMapper employeeMapper = new EmployeeMapperImpl(sqlSessionFactory);
        Employee employee = employeeMapper.getEmpById(1);
        
    }
}

补充

全局配置文件的标签顺序

properties
settings
typeAliases
typeHandlers
objectFactory
objectWrapperFactory
reflectorFactory
plugins
environments
databaseIdProvider
mappers

 

posted @ 2019-06-26 17:45  张小凡I4CU  阅读(148)  评论(0编辑  收藏  举报