Mybatis| 青训营笔记

91 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天

1.mybatis简介

  • 支持定制Sql,存储过程以继高级映射的优秀持久层框架
  • 避免了几乎所有的jdbc代码和手动设置参数以及获取结果集
  • 使用xml和注解用于配置和映射,将接口和javaPOJO进行映射记录

1.1为什么使用Mybatis

  • sql和java编码分开,功能边界清晰,一个专注于业务,一个专注于数据
  • mybatis是一个半自动化的持久层框架
  • JDBC耦合度过高
  • Hibernate和JPA导致性能降低

自动化就是不用自己写SQL,

hibernate通过对象直接映射为sql语句,实现了全自动化,这样导致很耗费性能

2.Mybatis之HelloWorld

2.1操作数据库

  • 创建Mybatis全局配置文件 "mybatis-config.xml"

后面会讲解一下这个配置文件

  • 创建Sql映射文件 "xxxMapper.xml"

这里记录的式Sql执行规则

  • 利用SqlSessionFactoryBuilder创建一个SqlSessionFactory
  • 利用SqlSessionFactory获取sqlSession对象
  • 通过SqlSession根据方法id进行操作
    @Test
    public void testSelectStudentById() throws IOException {
//      读取配置文件,resources下的xml文件,最终会被放在类路径下
        String resource = "mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建一个sqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取sqlSession对象
        SqlSession sqlSession = factory.openSession();
//        指定要执行sql语句的id
//                sql语句的id=namespace+"."+select|等标签的id;
        String sqlId="java1.dao.StudentDao.selectStudentById";
//        通过sqlSession执行sql语句
        Student student= sqlSession.selectOne(sqlId,1002);
        System.out.println(student);
        sqlSession.close();
    }

SqlSession:不是线程安全得。每次使用后都要进行关闭

2.2HelloWorld接口式编程

  • 创建一个Dao接口
    • 对应要使用一个Dao接口和一个Dao.xml

  • 修改Mapper文件
public interface StudentDao {
    //查询一个学生
    Student selectStudentById(Integer id);
}
<?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">
<!--查询语句
id:唯一标识符,这里和接口方法绑定
resultType标识返回值类型,让框架自动为你封装
-->
<select id="selectStudentById" resultType="java1.bean.Student">
  select * from student where id = #{id}
</select>
</mapper>
  • 测试
        SqlSession sqlSession = sqlSessionFactory.openSession();
    	//mapper实际是一个代理对象,交由代理对象执行方法
        StudentDao mapper = sqlSession.getMapper(StudentDao.class);
        Student student = mapper.selectStudentById(1001);
        System.out.println(student);
// 这里的sqlSession没有进行关闭,这是一个坏习惯

3全局配置文件详解

mybatis全局配置文件,mybatis-config.xml

文件结构,详细去看文档

• configuration 配置

• properties 属性 //这个可以额外写一个文件

• settings 设置

• typeAliases 类型命名

• typeHandlers 类型处理器

• objectFactory 对象工厂

• plugins 插件

• environments 环境

• environment 环境变量

• transactionManager 事务管理器

• dataSource 数据源

• databaseIdProvider 数据库厂商标识

• mappers 映射器

3.1properties文件

将数据库链接信息写,方便进行修改,解耦等操作

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springdb?useUnicode=true&amp;characterEncoding=utf-8
jdbc.username=root
jdbc.password=admin

全局文件

<?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="dbconfig.properties"> </properties>

  <!--    设置日志-->
  <settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <!--        这里是对命名规则的转换-->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!--        这里是开启懒加载-->
    <setting name="lazyLoadingEnabled" value="false"/>
    <!--        这里是将自动加载关闭,导致后来有需要的时候才进行加载-->
    <setting name="aggressiveLazyLoading" value="false"/>
  </settings>
  <!--可以为java类型起别名

  -->
  <typeAliases>
    <!--
    type就是全类名
    默认别名就是类名的小写
    alias就是一个新的别名
    -->
    <typeAlias type="java1.bean.Employee" alias="emp"></typeAlias>
    <!--    package可以批量起别名
    name就是指定的包 (默认就是类名小写) -->
    <package name="java1.bean"/>
  </typeAliases>


  <!--
  environments环境们,标识可以匹配多个环境
  -->
  <!--    这里的default标识默认使用的那个数据库的连接信息,与买你的id匹配-->
  <environments default="development">
    <!--  environment 表示一种环境-->
    <environment id="development">
      <!--            事务管理器,type表示类型JDBC是一个缩写-->
      <transactionManager type="JDBC"/>
      <!--            -->
      <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="mysql">
      <!--            事务管理器,type表示类型JDBC是一个缩写-->
      <transactionManager type="JDBC"/>
      <!--            -->
      <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>
  </environments>
  <!--
  databaseIdProvider:支持多数据库厂商
  DB_VENDOR:这是一个别名,得到数据库厂商标识,标识是驱动自带的,

  -->
  <databaseIdProvider type="DB_VENDOR">
    <property name="MySQL" value="mysql"/>
    <property name="Oracle" value="oracle"/>
  </databaseIdProvider>




  <!--    这里是找到其他的mapper文件
  从target/classes开始:
  这里用/做分隔符
  一个mapper标签 指定一个mapper;
  -->
  <!--    <mappers>-->
  <!--    将sql映射注册到全局配置中
  resource="用类路径下的sql映射文件"
  url:师表磁盘下的sql映射文案金
  class:标识接口,要求,
  1.映射文件和类在同一目录下,名称相同,
  2.利用注解的方式进行标识,不用映射文件,
  -->
  <!--        <mapper resource="java1/dao/StudentDao.xml"/>-->
  <!--    </mappers>-->
  <mappers>
    <package name="java1.dao"/>
  </mappers>

</configuration>

3.2 Settings设置

mybaits相关设置,改变mybatis运行时行为

  <!--    设置日志-->
  <settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <!--        这里是对命名规则的转换-->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!--        这里是开启懒加载-->
    <setting name="lazyLoadingEnabled" value="false"/>
    <!--        这里是将自动加载关闭,导致后来有需要的时候才进行加载-->
    <setting name="aggressiveLazyLoading" value="false"/>
  </settings>

3.3 typeAliases别名处理器

  <typeAliases>
    <!--
    type就是全类名
    默认别名就是类名的小写
    alias就是一个新的别名
    -->
    <typeAlias type="java1.bean.Employee" alias="emp"></typeAlias>
    <!--    package可以批量起别名
    name就是指定的包 (默认就是类名小写) -->
    <package name="java1.bean"/>
  </typeAliases>

还可以使用注解方式进行指定别名,@Alias("emp")给一个类取一个别名

注意,有很多java内酯雷默认有了别名,我们不要占用