首页 > 编程知识 正文

谈谈你对mybatis的理解,mybatis怎么学

时间:2023-05-04 08:37:42 阅读:278115 作者:729

2019独角兽企业重金招聘Python工程师标准>>>

MyBatis是一款优秀的支持自定义SQL查询,存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用XML或注解进行配置和映射,MyBatis通过将参数映射到配置的SQL形成最终执行的SQL语句,最后将执行SQL的结果映射成Java对象返回。 MyBatis支持声明式数据缓存(declarative data caching).当一条SQL语句被标记为“可缓存”后,首次执行它时从数据库获取的所有数据会被存储在高速缓存中,后面再执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。MyBatis提供了默认情况下基于Java HashMap的缓存实现(一级缓存),以及用于与OSCache,Ehcache,Hazelcast 和 Memcached连接的默认连接器,同时还提供了API供其他缓存实现使用。 MyBatis的一级缓存和二级缓存。 MyBatis提供查询缓存,用于减轻数据压力,提高数据库性能。MyBatis提供一级缓存和二级缓存。 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个(内存区域HashMap)数据结构用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。一级缓存的作用于是同一个SqlSession,在同一个SqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。MyBatis默认开启一级缓存。 二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存是多个SqlSession共享的,器作用域是mapper的同一个namespace,不同的SqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存,第二次会从缓存中获取数据将不再从数据库中查询,从而提高查询效率。Mybatis默认没有开启二级缓存,需要在手动开启二级缓存。 MyBatis中,关于数据库字段和Java类型的对应关系。由于Java中的基本数据类型会有默认值,例如当某个类中存在private int age;字段时,创建这个类时,age会有默认值0.当使用age属性时,它总会有值。因此在某些情况下,便无法实现使age为null。并且在动态SQL的部分,如果使用age != null进行判断,结果总会为true,因而会导致很多隐藏的问题。所以,在实体类中不要使用基本数据类型。 MyBatis名称映射规则: 可以通过在resultMap中配置property属性和column属性的映射,或者在SQL中设置别名这两种方式实现将查询列映射到对象属性的目的。 property属性或别名要和对象中属性的名字相同,但是实际匹配时,MyBatis会先将两者都转换为大写形式,然后在判断是否相同,即property="userName" 和 property="username"都可以匹配到对象的userName属性上。判断是否相同的时候要使用USERNAME,因此在设置property属性或别名的时候,不需要考虑大小写是否一致,但是为了便于阅读,要尽可能按照统一的规则来设置。 在数据库中,由于大多数数据库设置不区分大小写,因此下划线方式的命名很常见,如user_name, user_email。在Java中,一般都使用驼峰式命名,如果userName,userEmail。因此MyBatis还提供了一个全局属性mapUnderscoreToCamelCase,通过配置这个属性为true可以自动将以下划线方式命名的数据库列映射到Java对象的驼峰式命名属性中。这个属性默认是false,需要手动打开。 mapper.xml中 parameterType属性:即将传入的语句参数的完全限定类名或别名。这个属性是可选的,因为MyBatis可以推断出传入语句的具体参数,因此不建议配置该属性。 在SQL语句中,为了防止类型错误,对于一些特殊的数据类型,建议指定具体的jdbcType值。例如头像图片 指定 BLOB类型, 时间类型指定TIMESTAMP.BLOB对应的类型是ByteArrayInputStream,就是二进制数据流。由于数据库区分date,time,datetime类型,但是Java中一般都使用java.util.Date类型。因此为了保证数据类型的正确,需要手动指定日期类型,date,time,datetime对应的JDBC类型分别为DATE,TIME,TIMESTAMP insert需要注意的是新建的对象插入数据库中,返回值是执行的SQL影响的行数。而不是插入对象的id。

转载于:https://my.oschina.net/u/2321816/blog/2248163

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。