二、【MyBatis】 MyBatis入门与简单使用一、什么是ORM二、为什么mybatis是半自动的ORM框架2.1 Hibernate优点2.2 Hibernate缺点2.3 MyBatis与Hibernate区别三、Mybatis快速入门3.1 项目引入Maven相关依赖3.2 创建测试数据库3.3 编写数据源配置文件3.4 根据数据表生成对应POJO类3.5 编写核心配置文件3.6 测试数据库连通性3.7 编写数据表对应接口3.8 编写映射配置文件3.9 核心配置文件加载映射配置文件3.10 完整核心配置文件3.11 完整测试四、总结
Object Relation Mapping 对象关系映射。对象指的是JAVA对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在JAVA对象和数据库的关系模型之间建立一种对象个关系,比如用一个Java的User类,去对应数据库中的一张表goyeer_user类,类中的属性和表中的列一一对应。User类就对应goyeer_userk类中的一行数据。
用Mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如Hibernate,则不需要编写SQL语句。用Hibernate开发,只需要定义好ORM映射关系,就可以直接进行CRUD操作。
开发者不需要熟练地操作SQL语句的编写。Hibernate会根据指定的存储逻辑,自动的生成对应的SQL,并调用JDBC接口执行,所以其开发效率高于Mybatis。
在多表关联时,对SQL查询的支持较差;
更新数据时,需要发送所有字段;
不支持存储过程;
不能通过优化SQL来优化性能等;
这些问题导致其只适合在场景不太复杂且对性能要求不高的项目中使用。
Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己 编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将 java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对 象。
Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性 能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运 营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的 前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定 义多套 sql 映射文件,工作量大。、
Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如 需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是 Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象 模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都 是好架构,所以框架只有适合才是最好。
mysql mysql-connector-java 8.0.33 org.mybatis mybatis 3.5.13 junit junit 4.13.2
DROP TABLE IF EXISTS `school`; CREATE TABLE `school` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `schoolid` varchar(255) DEFAULT NULL, `schoolcode` varchar(255) DEFAULT NULL, `schoolname` varchar(255) DEFAULT NULL, `province` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=MyISAM AUTO_INCREMENT=2786 DEFAULT CHARSET=utf8mb4;
编写 src/main/resources/jdbc.properties数据库连接文件
# 数据库驱动 jdbc.driver=com.mysql.cj.jdbc.Driver #jdbc:mysql://IP地址:接口地址/数据库 jdbc.url=jdbc:mysql://localhost:3306/school_db #登录名 jdbc.username=root #密码 jdbc.password=123456
package org.goyeer.domain; @Data public class School { public int id; public String schoolId; public String schoolCode; public String schoolName; public String province; }
src/main/resources/mybatis-config.xml
@Test public void testConetion() throws IOException { // 核心配置文件classpath路径 String resource = "mybatis-config.xml"; // 加载配置文件 Reader reader = Resources.getResourceAsReader(resource); // 构建会话工厂 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 从SqlSessionFactory对象中获取SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); System.out.println(sqlSession.getConnection()); // 归还连接给数据源 sqlSession.close(); }
com.goyeer.repository.mapper;
package com.goyeer.repository.mapper; import com.goyeer.domain.School; import java.util.List; public interface SchoolMapper { ListfindAll(); School selectOne(int id); }
src/main/resources/mapper/SchoolMapper.xml
@Test public void tstFindAll() throws Exception { String conf_path = "mybatis-config.xml"; InputStream resourceStream = Resources.getResourceAsStream(conf_path); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceStream); SqlSession session = sessionFactory.openSession(); SchoolMapper mapper = session.getMapper(SchoolMapper.class); Listschools = mapper.findAll(); }
我们可以使用Mybatis的注解开发一些简单映射语句,这样可以是代码显得更加简介。对于稍微复杂一点的语句Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。