MyBatis概述
什么是MyBatis?
我们可以从MyBatis官网上来查到MyBatis的简介(在这里分享一下我对于学一个框架的见解,我觉得第一步应该是去框架官网上看它的介绍的第一句话,来了解它到底是个什么东西,而不是上去直接百度),在这里翻译一下。
1、Mybatis是一个一流的持久化框架,它支持定制化SQL、存储过程和高级映射。(是什么)
2、MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。(优势)
3、MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(怎么做的)
第一句话就是概念,我们在介绍MyBatis的时候可以直接用。然后是第二句话,这是MyBatis相比较JDBC的明显优势所在,比如说我们想对数据库进行一个插入的操作,可以分别贴一下两种方法的代码
//JDBC方式进行插入
public static int insert(Test test) throws SQLException { Connection connection = null; PreparedStatement preparedStatement = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "root", "123456"); connection.setAutoCommit(false); preparedStatement = connection.prepareStatement("INSERT INTO test VALUES (?,?,?)"); if (null != test.getId()) { preparedStatement.setInt(1, test.getId()); } else { preparedStatement.setNull(1, INTEGER); } preparedStatement.setInt(2, test.getNums()); preparedStatement.setString(3, test.getName()); connection.commit(); return preparedStatement.executeUpdate(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (null != connection) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } return 0; }
//MyBatis方式进行插入 public static int insert(SqlSession sqlSession, Test test) { TestMapper testMapper = sqlSession.getMapper(TestMapper.class); return testMapper.insert(test); }
通过上面两段代码的展示,我觉得什么都不用说了,无论是复杂性和可读性,MyBatis的优势都太明显了。
MyBatis的使用
(1)xml文件
可以通过Generator来自动生成代码,但是代码里可能有一些乱七八糟的注释,配置Generator的方式的过程可以简单说一下,配置它主要是先在pom文件中配置plugin,然后通过GeneratorConfig.XML文件来进行,不过我不是很提倡这种,因为对于后续的维护和回滚有很大影响,不过也有解决办法,就是你创建两个项目,一个负责Generator,一个是你的主项目,可以拷贝Generator里生成的文件。
然后配置mapper.xml文件,在里面定义Bean、写SQL语句。
(2) Annotation
主要就是通过注解来操作,比如说通过@Select写SQL语句。
我个人还是比较倾向于第一种,目前也只用过第一种。但是看了网上的相关博客之后,觉得这两种模式各有利弊,可以把他们俩的优劣势列出来
优势 | 劣势 | |
Mapper.xml |
(1)跟接口分离,统一管理 (2)不会直接看到复杂的SQL语句,从而提高代码可读性 |
通常需要操作多个XML文件 |
Annotation | 通过注释就可以看到具体的SQL语句 | 代码可读性差 |
MyBatis-Config.xml文件解析
我们通过MyBatis-config.xml文件来控制MyBatis的使用,主要是控制properties和settings来进行的。
properties
首先是properties,我们通过它来设置我们的DataSource,也就是数据源,我们用的哪个数据库、数据库账号和密码等一些信息都在这设置
<dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="11111111"/>
</dataSource>
我们也可以通过传入属性到SqlSessionFactory里来进行控制,但是和在Mapper接口中写方法的两种方式(直接写和通过使用XML文件,两者可以并存,但只能是互补关系,不然会报错)不同的是,这样是可以覆盖的,因此MyBatis官方定义了他们的优先级:
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
因此,通过方法参数传递的属性具有最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
|
settings
这个是设置MyBatis的一些默认行为,他应该怎样准备,怎样工作,怎样结束,涉及到许多scope,我就不在这一一罗列了,具体的可以参考MyBatis官网的XML配置 。
TypeHandlers
这也是一个比较重要的点,在写这篇文章的时候,我对于他的理解,就是它可以帮助我们在Javatype和JDBCtype之间作了一个桥梁,可以让我们的数据类型在写入的时候不会出错。MyBatis内部自己定义了许多的TypeHandlers,我们也可以自己定义。
Mappers
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:
<!-- 使用相对于类路径的资源引用 --> <mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers> <!-- 使用完全限定资源定位符(URL) --> <mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/> </mappers> <!-- 使用映射器接口实现类的完全限定类名 --> <mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/> </mappers> <!-- 将包内的映射器接口实现全部注册为映射器 --> <mappers> <package name="org.mybatis.builder"/> </mappers>
这些配置会告诉了 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了,也就是接下来我们要讨论的。