二、【MyBatis】 MyBatis入门与简单使用
二、【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 完整测试四、总结
一、什么是ORM
Object Relation Mapping 对象关系映射。对象指的是JAVA对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在JAVA对象和数据库的关系模型之间建立一种对象个关系,比如用一个Java的User类,去对应数据库中的一张表goyeer_user类,类中的属性和表中的列一一对应。User类就对应goyeer_userk类中的一行数据。
二、为什么mybatis是半自动的ORM框架
用Mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如Hibernate,则不需要编写SQL语句。用Hibernate开发,只需要定义好ORM映射关系,就可以直接进行CRUD操作。
2.1 Hibernate优点
开发者不需要熟练地操作SQL语句的编写。Hibernate会根据指定的存储逻辑,自动的生成对应的SQL,并调用JDBC接口执行,所以其开发效率高于Mybatis。
2.2 Hibernate缺点
在多表关联时,对SQL查询的支持较差;
更新数据时,需要发送所有字段;
不支持存储过程;
不能通过优化SQL来优化性能等;
这些问题导致其只适合在场景不太复杂且对性能要求不高的项目中使用。
2.3 MyBatis与Hibernate区别
Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己 编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将 java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对 象。
Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性 能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运 营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的 前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定 义多套 sql 映射文件,工作量大。、
Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如 需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是 Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象 模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都 是好架构,所以框架只有适合才是最好。
三、Mybatis快速入门
3.1 项目引入Maven相关依赖
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.13</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency>
3.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;
3.3 编写数据源配置文件
编写 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
3.4 根据数据表生成对应POJO类
package org.goyeer.domain; @Data public class School { public int id; public String schoolId; public String schoolCode; public String schoolName; public String province; }
3.5 编写核心配置文件
src/main/resources/mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 这些属性可以在外部进行配置,并可以进行动态替换。 你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置 --> <properties resource="jdbc.properties"/> <!-- MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。 例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。 --> <!--默认使用的环境 ID(比如:default="development")。--> <environments default="development"> <!--每个 environment 元素定义的环境 ID(比如:id="development")。--> <environment id="development"> <!--事务管理器的配置(比如:type="JDBC")。--> <!-- 事务管理器(transactionManager) 在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"): JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。 MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。 如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。 这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,换句话说,你可以用 TransactionFactory 接口实现类的全限定名或类型别名代替它们。 --> <transactionManager type="JDBC"/> <!--数据源的配置(比如:type="POOLED")--> <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> </configuration>
3.6 测试数据库连通性
@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(); }
3.7 编写数据表对应接口
com.goyeer.repository.mapper;
package com.goyeer.repository.mapper; import com.goyeer.domain.School; import java.util.List; public interface SchoolMapper { List<School> findAll(); School selectOne(int id); }
3.8 编写映射配置文件
src/main/resources/mapper/SchoolMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace=" com.goyeer.repository.mapper.SchoolMapper"> <select id="findAll" resultType="org.goyeer.domain.School"> select * from school </select> <select id="selectOne" resultType="org.goyeer.domain.School"> select * from school where id =#{id} </select> </mapper>
3.9 核心配置文件加载映射配置文件
<mappers> <mapper resource="mapper/SchoolMapper.xml"></mapper> </mappers>
3.10 完整核心配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="jdbc.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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="mapper/EduSchoolMapper.xml"></mapper> </mappers> </configuration>
3.11 完整测试
@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); List<School> schools = mapper.findAll(); }
四、总结
我们可以使用Mybatis的注解开发一些简单映射语句,这样可以是代码显得更加简介。对于稍微复杂一点的语句Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。