MyBatis入门和全局配置文件介绍

目录

一、MyBatis

1.简介

2.为什么要使用

3.下载地址

4.MyBatis操作数据库流程

5.接口式编程简单案例

6.小结

二、MyBatis-全局配置文件

1.properties属性

2.settings设置

3.typeAliases别名处理器

4.environments环境

5.databaseIdProvider环境

6.mapper映射


一、MyBatis

1.简介

  • MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。

  • MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。

  • MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。

  • MyBatis是一个半自动化的持久化层框架。

2.为什么要使用

  • JDBC

    1. SQL夹在Java代码块中,耦合度高导致硬编码。

    2. 维护不易且实际开发中sql是有变化的。

  • Hibernate和JPA

    1. 长难复杂的SQL,对于Hibernate而言处理也不容易。

    2. 内部自动生产的SQL,不容易做特殊优化。

    3. 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。

3.下载地址

https://github.com/mybatis/mybatis-3/

4.MyBatis操作数据库流程

  1. 引入mysql-connector-java-5.1.37-bin.jar和mybatis-3.4.6.jar

  2. 创建MyBatis全局配置文件

  3. 创建SQL映射文件

  4. 根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory

  5. 使用SqlSessionFactory获取sqlSession对象。一个sqlSession对象代表和数据库的一次会话

  6. 使用SqlSession进行增删改操作

5.接口式编程简单案例

创建tb1_employee数据库表

  1. 创建sql表对应的实体类Employee

    public class Employee {
        private int id;
        private String name;
        private String gender;
        private String email;
      
        public Employee() {
        }
    ​
        public Employee(int id, String name, String gender, String email) {
            this.id = id;
            this.name = name;
            this.gender = gender;
            this.email = email;
        }
      //...
    }
  2. 创建操作Employee表的接口类

    package com.itheima.dao;
    ​
    import com.itheima.bean.Employee;
    ​
    public interface EmployeeMapper {
        public Employee getEmpById(Integer integer);
    }
  3. 创建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>
        <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://localhost:3306/mybatis" />
                    <property name="username" value="root" />
                    <property name="password" value="123456" />
                </dataSource>
            </environment>
        </environments>
        <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
        <mappers>
            <mapper resource="conf/EmployeeMapper.xml" />
        </mappers>
    </configuration>
  4. 创建SQL映射文件EmployeeMapper.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="com.itheima.dao.EmployeeMapper">
    <!-- 
    namespace:名称空间;指定为接口的全类名
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值
    ​
    public Employee getEmpById(Integer id);
     -->
        <select id="getEmpById" resultType="com.itheima.bean.Employee">
            select id,name,email,gender from tb1_employee where id = #{id}
        </select>
    </mapper>
  5. 得到SqlSession进行查询操作

 private static SqlSessionFactory getSqlSessionFactory() throws IOException {
        //1.根据xml配置文件创建一个SqlSessionFactory对象
        String resource = "conf/mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(resourceAsStream);
    }   
​
    @Test
    public void test01() throws IOException {
        //1.获取SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        //2.获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.获取接口的实现类对象
        //会为接口创建一个动态代理对象
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        Employee emp = mapper.getEmpById(1);
        System.out.println(emp);
        sqlSession.close();
    }

6.小结

  • SqlSession的实例不是线程安全的,因此不能被共享。

  • SqlSession每次使用完成后需要正确关闭。

  • SqlSession可以直接调用方法的id进行数据库操作,但是我们一般还是推荐使用SqlSession获取到Dao接口的代理类,执行代理对象的方法,可以更安全的进行类型检查操作。

二、MyBatis-全局配置文件

1.properties属性

<!--
        1、mybatis可以使用properties来引入外部properties配置文件的内容;
        resource:引入类路径下的资源
        url:引入网络路径或者磁盘路径下的资源
-->
    <properties resource="dbconfig.properties"></properties>
​
    <environments default="dev_mysql">
        <environment id="dev_mysql">
            <transactionManager type="JDBC"></transactionManager>
            <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>
        </environment>

dbconfig.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123456

2.settings设置

  • setting会改变MyBatis的运行时行为。

    ​ name:设置项名

    ​ value:设置项取值

3.typeAliases别名处理器

  • 可以为Java类型设置一个短的名字,方便我们引用某个类

  • 类很多的情况下,可以批量设置别名,给这个包下的而每一个类创建一个默认的别名,就是类名小写

  • 也可以使用@Alisa注解为其制定一个别名

    typeAliases>
            <!--
                typeAlias:为某个java类型起别名
                    type:指定要起别名的全类名,默认别名就是类名小写
                    alias:指定新的别名
            -->
            <typeAlias type="com.itheima.bean.Employee" alias="employee"></typeAlias>
            <!--
                package:为某个包下的所有类及其子包批量起别名(类名小写)
                
                批量起别名的情况下,可以会造成某个包下的子包下有类名冲突,
                可以使用@Alias(value="指定别名")注解指定新的别名
            -->
            <package name="com.itheima.bean"/>
        </typeAliases>

4.environments环境

  • MyBatis可以配置多种环境,比如开发、测试和生产环境对应的不同配置

  • 每种环境使用一个environment标签进行配置并制定唯一标识符

  • 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境

<!--
    id:指定当前环境的唯一标识
    transactionManager:事务管理器
        type:事务管理器的类型
            JDBC(JdbcTransactionFactory)
            MANAGED(ManagedTransactionFactory)
            自定义事务管理器:实现TransactionFactory接口.type指定为全类名
                
    dataSource:数据源
        type:数据源类型
            UNPOOLED(UnpooledDataSourceFactory)
            POOLED(PooledDataSourceFactory)
            JNDI(JndiDataSourceFactory)
            自定义数据源:实现DataSourceFactory接口,type是全类名
--> 
    <environments default="dev_mysql">
        <environment id="dev_mysql">
            <transactionManager type="JDBC"></transactionManager>
            <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>
        </environment>
    
        <environment id="dev_oracle">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${orcl.driver}" />
                <property name="url" value="${orcl.url}" />
                <property name="username" value="${orcl.username}" />
                <property name="password" value="${orcl.password}" />
            </dataSource>
        </environment>
    </environments>

5.databaseIdProvider环境

  • MyBatis可以根据不同的数据库厂商执行不同的语句

 <!-- 
         type="DB_VENDOR":
             使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义。
            property 
                    name:数据库厂商标识
                    value:为标识起一个别名,方便SQL语句使用databaseId属性引用
      -->
    <databaseIdProvider type="DB_VENDOR">
        <!-- 为不同的数据库厂商起别名 -->
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>
<!--
    1.如果没有配置databaseIdProvide标签,那么databaseId=null
    2.如果配置了,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=指定的值,否则依旧为null
    3.如果databaseId不为null,它只会找到配置databaseId的sql语句
    4.MyBatis会加载不带databaseId的属性和带有匹配当前数据库databaseId属性的所有语句。如果同时找到带有databaseId和不带databaseId的相同语句,则后者被舍弃
--> 
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
        select * from tbl_employee where id = #{id}
    </select>
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
        databaseId="mysql">
        select * from tbl_employee where id = #{id}
    </select>
    <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
        databaseId="oracle">
        select * from tbl_employee where id = #{id}
    </select>

6.mapper映射

  • mapper逐个注册SQL映射文件

<mappers>
        <mapper resource="conf/EmployeeMapper.xml" />
</mappers>
  • 批量注册

<!--
    mapper:注册一个sql映射 
                注册配置文件
                resource:引用类路径下的sql映射文件
                    mybatis/mapper/EmployeeMapper.xml
                url:引用网路路径或者磁盘路径下的sql映射文件
                    file:///var/mappers/AuthorMapper.xml
                    
                注册接口
                class:引用(注册)接口,
                    1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
                    2、没有sql映射文件,所有的sql都是利用注解写在接口上;
                    推荐:
                        比较重要的,复杂的Dao接口我们来写sql映射文件
                        不重要,简单的Dao接口为了开发快速可以使用注解; 
-->
<mappers>
    <package name="com.atguigu.mybatis.dao"/>
</mappers>

猜你喜欢

转载自blog.csdn.net/fy_java1995/article/details/82799150