mybatis快速入门


概述

mybatis 是持久层框架,支持自定义 SQL、存储过程以及高级映射
通过 XML 或注解来配置和映射原始类型、接口和 Java POJO(实体类)为数据库中的记录
官网:https://mybatis.net.cn/

思想

采用 ORM 思想解决实体和数据库映射的问题
ORM: 对象关系映射。数据库的一条数据对应java中的一个对象

环境搭建

普通Java项目

  • 需要导入mybatis-x.x.x.jar

maven项目

  1. 导入依赖
  2. 创建实体类,dao接口(名称建议改为mapper)
  3. 创建mybatis主配置文件SqlMapConfig.xml
  4. 创建映射的配置文件UserDao.xml

maven项目目录结构

  • 项目名称
    • src 源代码
      • main 主代码
        • java Java代码
          • cn
            • dy
              • pojo 实体类
              • mapper 持久层接口
        • resources 资源目录
          • SqlMapConfig.xml Mybatis核心配置文件
          • log4j.properties log4j日志配置文件
          • cn
            • dy
              • mapper 持久层映射目录(此目录结构必须和Java中的结构保持一致)
      • test 测试代码
    • target 构建目录

注意

在mybatis中持久层操作接口名称和映射文件名称也叫做Mapper
mybatis的映射文件位置必须和mapper(dao)接口的包位置相同
maven编译时会将映射文件和编译后的mapper(dao)接口放在同一目录下

SqlMapConfig.xml核心文件

<!-- mybatis配置的dtd约束 -->
<?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>
    <!--配置mybatis环境 这里默认使用MySQL配置-->
    <environments default="mysql">
        <!--配置MySQL环境-->
        <environment id="mysql">
            <!-- MySQL事务 -->
            <transactionManager type="JDBC"></transactionManager>
            <!--数据源(连接池) POOLED为mybatis的数据源-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

<!--配置映射文件-->
    <mappers>
      <!-- resource指向mapper的xml映射文件 -->
        <mapper resource="cn/dy/mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

mapper的xml映射文件

<!-- mybatis中mapper的dtd约束 -->
<?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属性必须是接口的全限定接口名 -->
<mapper namespace="cn.dy.mapper.UserMapper">
    <!-- id属性值必须和接口中的方法名相同 -->
    <!-- resultType属性值必须是pojo的全限定接口名 -->
    <!-- parameterType属性值必须是方法参数的全限定接口名 -->
    <!-- sql中的参数以 #{pojo中的属性名} 的形式传递-->
    <select id="findUserById" resultType="cn.dy.pojo.User" parameterType="java.lang.Integer">
        SELECT username,birthday,sex,address FROM user WHERE id = #{id}
    </select>

    <!-- 这里在添加后返回主键id -->
    <!-- keyColumn为数据库中的列名 -->
    <!-- keyProperty为pojo中的属性名 -->
    <!-- order 取值:AFTER,BEFORE;AFTER:添加后返回,BEFORE:添加前返回(有可能导致id错误) -->
    <insert id="addUser" parameterType="cn.dy.pojo.User">
        INSERT INTO user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address})
        <selectKey resultType="java.lang.Integer" keyColumn="id" keyProperty="id" order="AFTER">
            select last_insert_id()
        </selectKey>
    </insert>

</mapper>

mybatis构建流程

  1. 使用mybatis提供的Resources工具类读取 核心配置文件(SqlMapConfig.xml)
    InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");

  2. 创建SqlSessionFactoryBuilder构建者对象(SqlSessionFactoryBuilder采用构建者模式)
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

  3. 使用SqlSessionFactoryBuilder对象去构建SqlSessionFactory工厂对象(SqlSessionFactory采用工厂模式)
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);

  4. 使用SqlSessionFactory工厂对象去创建SqlSession对象 (openSession默认不开启事务)
    SqlSession sqlSession = sqlSessionFactory.openSession();

  5. 使用SqlSession对象去创建代理对象
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

  6. 使用代理对象去调用方法

    User user = new User(null, "张三", Date.valueOf("2012-12-11"), "男", "南京");
    userMapper.addUser(user);
  7. 释放资源

    //  这里提交事务
    sqlSession.commit();
    try {
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    sqlSession.close();

#{}与${value}的区别

#{}使用…对象,使用占位符的方式,可以避免sql注入问题
${}使用…对象,会引发sql注入问题


文章作者: zrh
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zrh !
  目录