mybatis (一)应用分析与最佳实践


本节目标:
1、了解ORM 框架发展史,了解mybatis特性
2、掌握mybatis 编程式开发方法和核心对象
3、掌握mybatis 核心配置含义
4、掌握mybatis 的高级用法与扩展方式

为什么用mybatis

	传统的数据库连接的步骤
	1、加载驱动
	2、获取数据库连接
	3、获取statement对象
	4、execute执行sql
	5、处理resultset数据
	6、关闭资源
	比较繁琐,消耗性能:
	1、重复代码
	2、资源管理
	3、结果集处理
	4、sql耦合

如何解决

	写一个工具类,把资源管理和重复代码封装起来,只传sql

框架实现的思想

	封装重复代码
	结果集转化为对象

常见的第三方工具

	Apache DbUtils---QueryRunner		
	Spring JDBC ------JdbcTemplate
	1、封装了原生的操作
	2、可以设置datasource
	3、提供RowMapper接口处理结果集
public class ParentDto<T> implements RowMapper<T>
{
    private static Log logger = LogFactory.getLog(ParentDto.class);
    
    private Class<T> cls;
    
    public ParentDto(Class<T> cls)
    {
        this.cls = cls;
    }
    
    public T mapRow(ResultSet rs, int rowNum)
    {
        Field[] fields = cls.getDeclaredFields();
        
        T t = null;
        
        String name = "";
        try
        {
            // 获取对象中的所有字段
            // 实例化
            t = cls.newInstance();
            
            for (Field f : fields)
            {
                // if(f.isAnnotationPresent(NotPersistent.class)){
                // continue;
                // }
                // 获取字段名称
                String fieldName = f.getName();
                
                name = fieldName;
                if (isExistColumn(rs, fieldName))
                {
                    Object o = null;
                    
                    // 通过字段名称获取该字段的值(实体字段名称必须与数据库字段名称一致才可以)
                    o = rs.getObject(fieldName);
                    if (o != null)
                    {
                        // 使用BeanUtils通过字段名将value设置到实体中
                        BeanUtils.setProperty(t, fieldName, o);
                    }
                    
                }
                
            }
            
        }
        catch (SQLException e)
        {
            logger.error("ParentDto getFields erroring SQLException,dto is" + cls.getName() + ",columName is " + name);
        }
        catch (InstantiationException e)
        {
            logger.error("ParentDto getFields erroring InstantiationException,dto is" + cls.getName());
        }
        catch (IllegalAccessException e)
        {
            logger.error("ParentDto getFields erroring IllegalAccessException,dto is" + cls.getName());
        }
        catch (Exception e)
        {
            logger.error("ParentDto getFields erroring Exception,dto is" + cls.getName());
        }
        
        return t;
    }
    
    public boolean isExistColumn(ResultSet rs, String columnName)
    {
        try
        {
            if (rs.findColumn(columnName) > 0)
            {
                return true;
            }
        }
        catch (SQLException e)
        {
            return false;
        }
        return false;
    }
    
}

使用时:

List<NotAcceptSpeedDto> list = jdbcTemlate.query(sb.toString(), new ParentDto<NotAcceptSpeedDto>(NotAcceptSpeedDto.class));

DBUtils和Spring JDBC 对jdbc做了轻量级的封装,解决了:

对数据的增删改查进行了封装
管理数据源,创建、关闭资源
映射结果集

存在的不足之处:

sql不灵活,硬编码
参数需要自动映射,可以是对象或者map
结果集可以映射成实体类,但是不能把实体类映射为数据库记录或者sql
没有缓存、性能不行

ORM

ojbect relation mapping 对象与关系映射
Object  对象
Mapping 映射
relation  关系型数据库

hibernate

	现在不怎么用了
	总结:
	1、自动生成sql
	2、自动管理资源
	3、对象和关系型数据库的完全映射,操作对象就跟操作数据库一样
	4、提供了缓存机制
	缺点:
	不灵活、优化sql难,不支持动态sql,无法根据条件自动生成sql

mybatis

半自动化的ORM框架

maven依赖

<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.3</version>
    </dependency>

        <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.19</version>
    </dependency>

mybatis-config.xml文件配置

<configuration>
	<properties resource="db.properties"></properties>
	<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/><!-- 单独使用时配置成MANAGED没有事务 -->
            <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>

    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

Mapper.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.test.mybatis.mapper.UserMapper">
    <resultMap id="userResultMap" type="com.test.mybatis.domain.User">
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="pwd" property="pwd" jdbcType="VARCHAR"/>
    </resultMap>


    <select id="queryUser" resultType="com.test.mybatis.domain.User">
        select * from user
    </select>
</mapper>

mapper接口

public interface UserMapper
{
    User queryUser();
}

test 原生api

private SqlSessionFactory sqlSessionFactory;

    @Before
    public void initDB() throws IOException
    {
        String source = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(source);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void queryUser()
    {
        SqlSession session = sqlSessionFactory.openSession();

        User user = (User) session.selectOne("com.test.mybatis.mapper.UserMapper.queryUser",1);

        System.out.println("queryUser==========="+user);

        session.close();

    }

    @Test
    public void queryUserByMappper()
    {
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper userMapper = session.getMapper(UserMapper.class);

        User user = userMapper.queryUser();

        System.out.println("queryUserByMappper============="+user);

        session.close();
    }

SqlSession

增删改查操作
没有交给spring管理时使用方式
1、加载mybatis配置文件(获取数据源)
2、SqlSessionFactoryBuilder().build(inputstream) 创建sqlsessionFacotry
3、sqlSessionFactory.openSession() 获得session
4、session 增删改查
	交给mapper增删改查 实现接口和sql映射

总结:mybatis核心特性:

	使用连接池管理
	sql和代码分离
	结果集映射
	参数映射和动态sql
	缓存管理
	插件机制

核心对象的生命周期

	mybatis的几个核心对象:
	SqlSessionFactoryBuiler
	SqlSessionFactory
	SqlSession
	Mapper
	
SqlSessionFactoryBuiler:方法的局部,构建玩SqlSessionFactory就可以gg了
SqlSessionFactory:单例,整个生命周期
SqlSession:一次会话请求
Mapper:实际上是一个代理,从SqlSession中获取的,也是一次会话请求了

在这里插入图片描述

核心配置

configuration 根标签
properties 配置参数,例如数据库参数
settings mybatis的核心配置

typeAliases 别名转换 ,sql里resultType就可以写别名,不用写全路径了
typeHandlers java类型和数据库类型相互转换,如String和varchar、text
objectFactory 反射创建对象实例
plugins 插件
environments environment 配置不同的环境,生产、测试环境
transactionManager 事务
datasource
mapper
在这里插入图片描述在这里插入图片描述

动态sql

动态标签

if
choose(when,otherwise)
trim(where,set)
foreach

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

批量操作

批量插入
在这里插入图片描述
批量更新
在这里插入图片描述
批量删除
在这里插入图片描述
mybatis有一定的拼接大小限制;默认不超过4M

嵌套查询 N+1 延迟加载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值