一, mybatis 历史:
额, 学习一门新事物时了解一下它的历史能在脑中形成一个大致的轮廓... 进入正题...
mybatis 以前叫做 ibatis,ibatis 是 Apache 旗下的产品, 在 2010 年时 google 将其接管并更名为 mybatis.(你可以发现它的包结构还是 org.apache.ibatis).
二, mybatis 介绍:
mybatis 运行在三层架构中的 Dao 层, 它的主要功能是简化 jdbc 操作, 并且能够降低耦合 (sql 语句和 java 代码分离), 便于维护. mybatis 是 ORM(Object Ralational Mapping 对象关系映射) 的产品. ORM 框架将数据库中的表和 JavaBean 二者观念起来. 但是, ORM 框架只是一个理念, mybatis 才是它的实现, 比较著名的 ORM 框架还有 hibernate,JPA 等.
三, 下载及配置:
1, 下载
当我们大致了解了 mybatis 的概念与用处之后, 我们就可以开始下载它啦, 外网有时候不稳定, 建议在中文官网下载, 网址: http://www.mybatis.cn/82.html, 下载完成你会得到一个压缩包, 将其解压缩将得到文件结构如下:
好的~ 我们把注意力放在 lib 目录和 mybatis-3.4.6.jar,mybatis-3.4.6.PDF 上面来~ 其中 lib 是你在使用 mybatis 进行开发的过程中, 可能会用到的一些 jar 包, 而 mybatis-3.4.6.jar 是 mybatis 的核心 jar 包, 剩下的 mybatis-3.4.6.PDF 很明显是官方文档啦~ 至于剩下的咱们装作没看见就好~
2, 使用 mybatis
好的, 当我们下载了 mybatis 之后, 就可以使用它啦~ 前面虽然说它是一个作用于 Dao 层的框架, 但它的实质是完成数据库表与 JavaBean 之间的关联, 所以我们创建一个 J2SE 项目 (普通的 Java 项目) 即可, 以 eclipse 为例就是 new->java project, 然后选中咱们的 src 目录, ctrl+n 输入 package, 然后创建一个 entity 包和一个 mapper 包还有一个 test 包, 额, 咱们做测试就不用那么规范了额. 其中 entity 包用于存放实体类, 也就是 JavaBean(为了防止可能有的童鞋不知道 JavaBean 是啥, 这里简单交代一下: JavaBean 的规范有三, 类的访问权限为 public, 构造方法的访问权限为 public 且必须提供无参构造, 所有属性的访问权限必须是 private, 嗯, 最重要的是它与表是映射关系);mapper 包用于存放接口和 xml 文件, 具体存放啥接口和啥 xml 文件先别着急, 也别乱想, 博主在下文会交代明白; 最后的 test 包用于存放咱们的 Test 类, 嗯, 就是做测试的.
建完后的项目结构如图:
然后咱们将刚刚下完的 mybatis 核心 jar 包复制粘贴到 src 目录下, 并右键 build path->add to build path 加入环境~
接下来在 src 目录下创建一个 xml 文件 (选中 src ctrl+n 输入 xml file), 该 xml 文件是 mybatis 的配置文件, 其中最核心的配置信息是数据库的信息(驱动路径, url, 账号密码之类的) 和需要加载的映射文件路径(就是上文中提到的 mapper 包下面的 xml 文件), 该配置文件的名字可以随便起, 在这里我们就命名为 mybatis-config.xml 吧!
关于配置文件的文件格式, 我们可以查看 mybatis 的官方文档 --mybatis-3.4.6.PDF.
找到目录我们先点击 getting started:
然后我们往下翻到第 3 页, 将这个模板直接复制到 mybatis-config.xml 文件中去:
ctrl+shift+f 整理文件格式之后我们开始配置.
<?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>
- <!-- 指定开发环境, 通过 default 值与 id 值进行制定, 这里我制定的就是 mysql 数据库环境 -->
- <environments default="devMysql">
- <!-- 配置开发环境, 可以指定多个开发环境 -->
- <environment id="devMysql">
- <!-- 事务提交方式, 这里设置 JDBC 是手动提交, 一般都是手动提交哦 -->
- <transactionManager type="JDBC" />
- <!-- 数据源类型, POOLED 是使用 mybatis 默认的数据源,
- 也可以选择 UNPOOLED 不使用数据源,
- 以及 JNDI 使用 tomcat 内置数据源,
- 不过一般推荐使用 POOLED 哦
- -->
- <dataSource type="POOLED">
- <property name="driver" value="com.mysql.jdbc.Driver" />
- <property name="url" value="jdbc:mysql://127.0.0.1:3306/testdb" />
- <property name="username" value="root" />
- <property name="password" value="abc" />
- </dataSource>
- </environment>
- <environment id="devOracle">
- <transactionManager type="JDBC" />
- <dataSource type="POOLED">
- <property name="driver" value="oracle.jdbc.OracleDriver" />
- <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
- <property name="username" value="scott" />
- <property name="password" value="abc" />
- </dataSource>
- </environment>
- </environments>
- <mappers>
- </mappers>
- </configuration>
额, 排版好大... 咳咳, ok, 我们这里配置了两个开发环境, 分别对应于 MySQL 数据库以及 oracle 数据库, 我们将对应的数据库驱动 jar 包粘贴到 src 目录下并 add build path 加入环境~
接下来, 我们在数据库中创建一个 person 表, 我使用的是 MySQL 数据库, 建表语句如下:
- create table person(
- id int primary key,
- name varchar(30),
- age int,
- gender int)
上文中提到, entity 包下存放的是数据库表对应的实体类, 那么是怎么个对应法呢? 简单来说就是表名与 JavaBean 的类名关联, 表中的字段与 JavaBean 中的属性关联(这个不关联也可以用别的手段解决, 但是最好关联), 与 person 表对应的实体类代码如下:
- package pers.tz.mapper;
- /**
- * @author tangze
- * @create 2019-10-11 0:07
- */
- public class person {
- private int id;
- private String name;
- private int age;
- private int gender;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public int getGender() {
- return gender;
- }
- public void setGender(int gender) {
- this.gender = gender;
- }
- public person(int id, String name, int age, int gender) {
- this.id = id;
- this.name = name;
- this.age = age;
- this.gender = gender;
- }
- public person() {
- }
- @Override
- public String toString() {
- return "person{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", age=" + age +
- ", gender=" + gender +
- '}';
- }
- }
接下来我们就可以开始写 sql 语句啦~ 我们之前说过, mybatis 的一个作用在于解耦合, 它将 sql 语句以及 java 代码分离, 在以往, 我们的 sql 语句是以字符串的形式与 java 语言混杂在一起的, 这样的结构不利于维护, 因此, 现在咱们写在一个单独的文件中, 这个文件就是上文中提到的 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="命名空间">
- </mapper>
上方的代码就是 mapper 包下的 xml 文件的大致结构, 一个 xml 文件与一个表相关联, 负责该表的 dml 操作, 也就是说 sql 语句都存放于该 xml 文件中. 又由于 xml 文件与表相关联, 所以我们不妨将该文件命名为 personMapper.xml. 我们在 personMapper.xml 中写入一条 sql 语句, 即插入一个 person 记录:
<?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="命名空间">
- <insert id="insertPerson" parameterType="pers.tz.entity.Person">
- insert into person values(#{id},#{name},#{age},#{gender})
- </insert>
- </mapper>
id 属性是该标签的唯一标识符, parameterType 属性是传入参数的类型, 这里接下来传入的是一个 JavaBean, 要写全类名, 因为这是 insert 语句所以使用的是 insert 节点, 与之相应的还有 delete update select 节点. 接下来我们在 mybatis-config.xml 文件中关联 personMapper.xml 文件(我先讲步骤, 你们也先会用, 原理等流程完成之后我会说明):
- <mappers>
- <mapper resource="mapper/personMapper.xml"/>
- </mappers>
然后... 我们创建一个上文所说的 mapper 包下的接口, 该接口用于与 personMapper.xml 文件关联, 我们不妨起名为 PersonMapper, 然后将 PersonMapper 的全类名复制, 作为 personMapper.xml 映射文件的命名空间... 然后在该接口中创建一个 insertPerson 方法:
<?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="mapper.PersonMapper">
- <insert id="insertPerson" parameterType="pers.tz.entity.Person">
- insert into person values(#{id},#{name},#{age},#{gender})
- </insert>
- </mapper>
- public interface PersonMapper {
- int insertPerson(Person person);
- }
这样, personMapper.xml 和 PersonMapper.java 就关联起来了, 接口中的方法名对应 xml 映射文件中的 id 值, 接口中的方法形参对应 xml 映射文件中的 parameterType 值, 接口的全类名对应 xml 映射文件中的命名空间. 实际上 mybatis 先通过它的配置文件 (即 mybatis-config.xml) 找到映射文件(即 personMapper.xml), 然后通过映射文件找到接口(PersonMapper.java)
走到这里我们的步骤差不多就走完了, 就剩下测试类了. 那么我们开始整一个测试类, 在 test 包下创建一个类, 我创建的是 Test 类:
- public class Test {
- public static void demo1(Person person) throws Exception {
- // 读入 mybatis-config.xml 文件
- Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
- // 工厂模式... 嘤嘤嘤说错了别喷我
- SqlSessionFactory sqlSessionFactory = new
- SqlSessionFactoryBuilder().build(reader);
- // 获取一个 session, 你可以将它近似的理解为 connection 对象
- SqlSession session = sqlSessionFactory.openSession();
- // 反射获取该接口的实现类, mybatis 帮你生成的实现类
- PersonMapper mapper = session.getMapper(PersonMapper.class);
- int count = mapper.insertPerson(person);
- // 手动提交
- session.commit();
- }
- public static void main(String[] args) {
- demo1(new Person(1,"张三",17,1));
- }
- }
执行完后.. 你就能看到在你的数据库表中多出一条记录啦...
原理
最后来简单说一下它的原理... 它的底层是对映射文件 (personMapper.xml) 进行解析, 从而得到该文件中的 sql 节点(上文中的 insert), 这样就能得到它的 id 值, parameterType 值, 以及其中的 sql 语句, 那么它要得到这些值干嘛呢? 看上方我们有这么一行代码:
PersonMapper mapper = session.getMapper(PersonMapper.class);
这里的 mapper 对象的类型不知道你发现了没有, 它的类型是一个接口! 那么显然这个对象是该接口的实现类, 但是这个实现类我们并没有写啊! 难道这个对象就是该接口的实例?! 这显然是不合理的, java 的接口连构造方法都没有! 那么真相就只有一个, 有一个家伙偷偷的帮我们写了实现类... 这个家伙就是 mybatis.
实际上, mybatis 通过 mybatis-config.xml 配置文件找到 personMapper.xml 映射文件, 然后通过该映射文件找到对应的接口, mybatis 底层会解析这个映射文件, 解析 sql 节点的属性值和其中的 sql 语句然后在底层帮你生成该接口的实现类, 然后父类引用指向子类实例, 就能调用子类的方法啦...
额, 第一部分就先到这里, 如果我没有漏掉什么的话.... 完.
如有不对请及时指正, 感激不尽
来源: https://www.cnblogs.com/twz123/p/11651549.html