Fork me on GitHub

Mybatis

系列三来了…这次是Mybatis

写此系列的目的是做一个学习笔记管理,方便以后复习用。

快速入门

  1. 添加坐标

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.26</version>
    </dependency>
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
    </dependency>
  2. 创建数据表

  3. 编写实体类

  4. 编写dao接口 mapper

  5. 编写映射文件UserMapper dtd的约束头参考

  6. 编写核心配置文件SqlMapConfig.xml

  7. 编写测试类

增删改查

1
2
3
4
sqlSession.selectList("userMapper.findAll");
sqlSession.insert("userMapper.add", user);
sqlSession.update("userMapper.update", user);
sqlSession.delete("userMapper.delete", 3);

核心配置文件

SqlMapConfig.xml

  1. emvironments—数据库环境的配置,指定事务管理类型和数据源

    • transactionManager: JDBC, MANAGED
    • dataSource: POOLED , JNDI, UNPOOLED
  2. mappers—加载映射文件 userMapper.xml

  3. properties—加载外部properties文件

  4. typeAliases—定义别名

  5. typeHandlers—配置自定义类型处理器

    • 处理日期转换为例
      1. 定义转换类继承类BaseTypeHandler<>
      2. 覆盖4个未实现的方法
      3. 在核心配置文件SqlMapConfig.xml中进行配置
      4. 测试
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class DateTypeHandler extends BaseTypeHandler<Date> {
    @Override
    //将java类型转换为数据库需要的类型
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
    long time = date.getTime();
    preparedStatement.setLong(i, time);
    }

    @Override
    //以下三个将数据库类型转换为java类型
    //String是要转换的字段名称
    //resultSet查询出的结果集
    public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
    long aLong = resultSet.getLong(s);
    Date date = new Date(aLong);
    return date;
    }
    ...
    }
    1
    2
    3
    4
    <!--自定义注册类型处理器-->
    <typeHandlers>
    <typeHandler handler="com.tsuki.handler.DateTypeHandler"/>
    </typeHandlers>
  6. plugins 扩展功能 – PageHelper,第三方插件进行功能扩展

    • 步骤

      • 导入通用的PageHelper坐标

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.3.0</version>
        </dependency>
        <dependency>
        <groupId>com.github.jsqlparser</groupId>
        <artifactId>jsqlparser</artifactId>
        <version>4.2</version>
        </dependency>
      • 在核心配置文件中配置PageHelper插件

        1
        2
        3
        4
        5
        6
        <!--配置分页助手插件-->
        <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
        <property name="dialect" value="mysql"/>
        </plugin>
        </plugins>
      • 测试

        • PageHelper.startPage(1, 2);

相应api(单元测试用)

  1. SqlSessionFactoryBuilder
  2. SqlSessionFactory: openSession() or openSession(boolean autoCommit) 可以设置自动提交事务
  3. SqlSession,增删改查

Dao层实现

  1. 传统方式

  2. 代理开发方式

    区别就是需不需要手动实现接口

    sqlSession.getMapper(UserMapper.class);

    要保持四个一致:映射文件中的mapper的namespace要是interface的全包名,id和方法名一致,parameterType和形参类型一致,resultType和返回值类型一致。

映射配置文件深入

1. 常用标签

<select> <insert> <update> <delete>

1
2
3
4
5
6
7
8
9
10
11
<mapper namespace="com.tsuki.dao.UserMapper">
<select id="findAll" resultType="user">
select * from user
</select>
<insert id="save" parameterType="user">
insert into user values(#{id}, #{username}, #{password}, #{birthday})
</insert>
<select id="findById" resultType="user">
select * from user where id=#{id}
</select>
</mapper>

2. 动态sql

占内存

<if> <foreach><sql><where>

多表操作

注解

常用注解:用注解替代映射文件

简单查询—-注解加载接口方法上

@Insert @Delete @Update @Select

1
2
3
4
<!--加载映射关系-->
<Mappers>
<package name="com.tsuki.mapper"/>
</Mappers>

复杂查询

@Result @Results @One(一对一) @Many(一对多,多对多)

套娃

报错

  1. java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis. 探究plugins分页插件时的问题,多半是版本问题—-论springboot的好处,内置版本号
  2. is not known to the MapperRegistry, 原因是namespace没有修改为全包名
  3. 用Mybatis插入数据但是没反应,用错了标签,’‘用成了’


本文标题:Mybatis

文章作者:tsuki

发布时间:2021.12.24 - 16:27

最后更新:2021.12.27 - 19:52

原始链接:https://tsuki419.github.io/MyBatis.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------THE END-------------
0%