• 重温mybatis之一篇带你入门Mybatis


    一.前言

    我是一个五年得java开发工程师,在印象里,从第一年我就会使用mybatis了,从最开始得xml配置,到spring整合,再到springboot。无非就是写个mapper抽象类,写个mapper.xml方法。就这么一直用着。期间也想看看这么优秀得框架是怎么生成的。奈何工作缠身。最近比较闲,打算整理一下。那么我们现在开始。

    二.准备阶段

    pom中添加依赖

    1. <dependency>
    2. <groupId>org.mybatisgroupId>
    3. <artifactId>mybatisartifactId>
    4. <version>3.5.10version>
    5. dependency>

    如果想连接mysql加上

    1. <dependency>
    2. <groupId>mysqlgroupId>
    3. <artifactId>mysql-connector-javaartifactId>
    4. <version>8.0.33version>
    5. dependency>

    三.开干

    (1)两种构建方式创建SqlSessionFactory

    1.xml方式

    在resource里面添加一个mybatis-config.xml文件

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <environments default="development">
    7. <environment id="development">
    8. <transactionManager type="JDBC"/>
    9. <dataSource type="POOLED">
    10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    11. <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
    12. <property name="username" value="root"/>
    13. <property name="password" value="123456"/>
    14. dataSource>
    15. environment>
    16. environments>
    17. configuration>

    main方法中直接上:

    1. public static void main(String[] args) {
    2. InputStream resourceAsStream = null;
    3. try {
    4. resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
    5. } catch (IOException e) {
    6. e.printStackTrace();
    7. }
    8. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    9. }

    2.java配置方式

    1. PooledDataSource pooledDataSource = new PooledDataSource("com.mysql.cj.jdbc.Driver", "jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
    2. JdbcTransactionFactory jdbcTransactionFactory = new JdbcTransactionFactory();
    3. Environment environment = new Environment("development", jdbcTransactionFactory, pooledDataSource);
    4. Configuration configuration = new Configuration(environment);
    5. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

    (2)获取Sqlsession

    SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。

    SqlSession sqlSession = sqlSessionFactory.openSession();

    里面有各种查询方法 

    老版本的写法

     List> animals = sqlSession.selectList("com.chen.mybatis.selectAnimal");

    这里面的“com.chen.xxxxxxx”在哪呢?  

    首先你得在上面提到的mybatis-config.xml 中添加一个标签

    1. "animalMapper.xml"/>

    然后在resources目录下创建一个anmalMapper.xml

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.chen.mybatis">
    6. <select id="selectAnimal" resultType="java.util.Map">
    7. select * from animal
    8. select>
    9. mapper>

    namespace + select id 就是代码里面的参数了。

    新版本写法

    1. AnimalMapper mapper = sqlSession.getMapper(AnimalMapper.class);
    2. List animals = mapper.selectList();

    AnimalMapper 接口

    1. @Mapper
    2. public interface AnimalMapper {
    3. List selectList();
    4. @Select("select name from animal where id = #{id}")
    5. String selectNameById(int id);
    6. }

    这个selectNameById 就是在java注解里面写sql了,我不太喜欢这样。不过多说明了。

    四.作用域

    SqlSessionFactoryBuild 是为了创建SqlSessionFacory的 最佳作用域是方法作用域

    SqlSessionFactory 最好就创建一个

    SqlSession 是线程不安全的,最佳作用域是请求或方法作用域,绝对不能把她放到一个静态域里面。

    五.xml配置

    这部分配置信息读者老爷们直接去官网看把

    https://mybatis.org/mybatis-3/zh/configuration.html

    六.类型处理器 typeHandlers 

    MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。

    觉得好玩的应该是自定义类型处理器

    你可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 并且可以(可选地)将它映射到一个 JDBC 类型。比如:

    xml配置文件里面添加如下:

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.chen.mybatis.AnimalMapper">
    6. <resultMap id="BaseResultMap" type="com.chen.mybatis.Animal">
    7. <constructor>
    8. <idArg column="id" javaType="java.lang.Integer" jdbcType="INTEGER"/>
    9. <arg column="name" javaType="java.lang.String" jdbcType="VARCHAR"/>
    10. <arg column="age" javaType="java.lang.Integer" jdbcType="INTEGER"/>
    11. <arg column="types" typeHandler="com.chen.mybatis.MyTypeHandler" javaType="java.util.List" jdbcType="VARCHAR"/>
    12. constructor>
    13. resultMap>
    14. <select id="selectList" resultMap="BaseResultMap">
    15. select * from animal
    16. select>
    17. mapper>

    注: 这个xml只能放到和mapper接口相同的目录下,要不不好用哦 

    1. package com.chen.mybatis;
    2. import org.apache.ibatis.type.BaseTypeHandler;
    3. import org.apache.ibatis.type.JdbcType;
    4. import org.apache.ibatis.type.MappedJdbcTypes;
    5. import org.apache.ibatis.type.MappedTypes;
    6. import org.apache.rocketmq.shaded.commons.lang3.StringUtils;
    7. import org.apache.rocketmq.shaded.io.grpc.netty.shaded.io.netty.util.internal.StringUtil;
    8. import java.sql.*;
    9. import java.util.Arrays;
    10. import java.util.List;
    11. /**
    12. * @Title: MyTypeHandler
    13. * @Description:
    14. * @author: chenyulei
    15. * @date: 2023/10/10 10:50
    16. */
    17. //这个注解定义的是JdbcType类型,这里的类型不可自己随意定义,必须要是枚举类org.apache.ibatis.type.JdbcType所枚举的数据类型
    18. @MappedJdbcTypes(JdbcType.VARCHAR)
    19. //这里定义的是JavaType的数据类型,描述了哪些Java类型可被拦截
    20. @MappedTypes({List.class})
    21. public class MyTypeHandler extends BaseTypeHandler> {
    22. @Override
    23. public void setNonNullParameter(PreparedStatement preparedStatement, int i, List parameter, JdbcType jdbcType) throws SQLException {
    24. String hobbys= StringUtils.join(parameter,",");
    25. try {
    26. preparedStatement.setString(i,hobbys);
    27. } catch (SQLException e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. @Override
    32. public List getNullableResult(ResultSet rs, String columnName) throws SQLException {
    33. return Arrays.asList(rs.getString(columnName).replace("[","").replace("]","").split(","));
    34. }
    35. @Override
    36. public List getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
    37. return Arrays.asList(resultSet.getString(columnIndex).replace("[","").replace("]","").split(","));
    38. }
    39. @Override
    40. public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    41. return Arrays.asList(cs.getString(columnIndex).replace("[","").replace("]","").split(","));
    42. }
    43. }

    上面代码就是把varchar类型的types,返回回来处理成了List。 

    七.插件(plugins)

    你总想在sql执行期间打印一些东东,那我们就可以使用拦截器咯

    1. package com.chen.mybatis;
    2. import org.apache.ibatis.executor.Executor;
    3. import org.apache.ibatis.mapping.MappedStatement;
    4. import org.apache.ibatis.plugin.Interceptor;
    5. import org.apache.ibatis.plugin.Intercepts;
    6. import org.apache.ibatis.plugin.Invocation;
    7. import org.apache.ibatis.plugin.Signature;
    8. import org.apache.ibatis.session.ResultHandler;
    9. import org.apache.ibatis.session.RowBounds;
    10. import java.util.Properties;
    11. /**
    12. * @Title: SelectPlugins
    13. * @Description:
    14. * @author: chenyulei
    15. * @date: 2023/10/11 15:36
    16. */
    17. @Intercepts({@Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class})})
    18. public class SelectPlugins implements Interceptor {
    19. private Properties properties = new Properties();
    20. @Override
    21. public void setProperties(Properties properties) {
    22. this.properties = properties;
    23. }
    24. @Override
    25. public Object intercept(Invocation invocation) throws Throwable {
    26. Object proceed = invocation.proceed();
    27. System.out.println("拦截select方法");
    28. return proceed;
    29. }
    30. }

    别忘了在配置类里面添加

    1. configuration.setMapUnderscoreToCamelCase(true);
    2. configuration.addInterceptor(updatePlugins);

  • 相关阅读:
    四、LockSupport与线程中断
    OpenVPN安装部署详解
    进击!BERT句向量表征
    go语言实现LeetCode59 螺旋矩阵Ⅱ
    Apache HTTPD (CVE-2017-15715)换行解析漏洞复现
    D - United We Stand
    shiro认证机制及认证原理
    WPS中XLS表格使用的技巧记录
    【语音识别】声学建模中基于树的状态绑定
    嵌入式IDE(2):KEIL中SCF分散加载链接文件详解和实例分析
  • 原文地址:https://blog.csdn.net/Chen_leilei/article/details/133772725