Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

  虽然内心相信Mybatis基于配置文件的配置早已经在实战之中被注解所遗忘,但是我相信还是会有一小部分人还是需要这种技术去维护原有使用这种方式去搭建的项目。

废话不多说首先使用框架包是不能少的了。导入Mybatis的包(这个框架的jar包就一个)。但是需要连接数据库少不了数据库的驱动包。接着创建JAVA项目。项目创建好了

,接着基于注解配置我们就需要创建xml的配置文件。配置框架我们需要一个有力的辅助帮助我们更方便更舒适地配置框架这里就需要联想到规则文件了。在框架历史的长河中

出现了两种配置文件一种是.xsd结尾的叫schema规则文件,一种叫做DTD的规则文件。Mybatis框架采用了比较老的DTD规则文件。这里有的人就会觉得奇怪?明明官网只给了我们一个jar包,到处都找不到规则文件呀。这里详细说明一下其实jar包可以通过rar解压。解压出来的文件夹搜索.dtd就能找到规则文件把它剪切到你不会轻易删除的地方用IDE加载就可以了。

  这个规则文件必须手工配置!!!这点非常重要

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

  打开Prefrences,搜索Catalog找到XML规则文件配置页面,ADD增加规则文件。这时候就需要官方文档登场为我们解困了。

附上官方文档连接http://www.mybatis.org/mybatis-3/zh/getting-started.html

在官网Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

入门往下找

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

这里就看到了这个规则文件的公共ID。关于公共ID呢,框架默认都是通过公共ID确认这个文件是否存在,不存在的话就会联网找这个文件,但是说是这么说,但是谁又会依赖于那个联网服务呢。所以直接认为是配置在本地最好就行了。这里我贴一下公共ID,这样一下看到这篇博客的兄dei们就不用在官网找那么麻烦了。

-//mybatis.org//DTD Config 3.0//EN

 注意这个版本,这里我用的是3.4.1的版本如果以后有4版本的Mybatis出来的话这个一定会被淘汰的,到时候就可以按照我写方法去官网试着查找了。(如果作者不像Spring那个作者整个页面风格全改了的话...)

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

按照这个步骤点确定就可以了。解压出来的两个规则文件苟这样加入到IDE。

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

接着创建带规则的XML

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

起名字这里没有特别的命名约束,但是为了更好的区分文件的作用配置文件建议命名为mybatis-configs

接口映射规则文件命名为XXX-mapper.xml这里的XXX是最好是接口的名字,这样一看就能够知道这个

映射文件对应的接口是XXX类

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

到了这一步就不需要多想了,我们既然知道Mybatis是使用DTD规则文件的我们就不应该点schema。

接着下一步

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

接着下一步。finish就行了,这一步什么都不需要配置无论是映射接口的映射文件还是配置文件

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

这样我们的XML配置文件就有各种各样友好的提示我们写代码就会很轻松了。映射文件的创建方法参考这个配置文件的创建方法就可以了,一模一样的。

创建好了配置文件接下来需要怎么做呢?接着下一步就要正式对Mybatis进行配置了。这个时候需要回想一下JDBC的流程:

  JDBC流程:

    1.首先需要创建和数据库的链接;

    2.接着获得数据库的执行对象;

    3.操作数据库增删改查处理结果;

    4.关闭书记句酷的链接

这个流程但凡是涉及到JDBC的框架都必须要经过这个流程。只是基于不同的框架作者dalao们给了我们不同的实现让我们解决JDBC的效率提高了简化了手续而已。我们就按照这种思路来开始着手我们的配置:

首先就是获得数据库的链接,那链接数据库最少需要的是4个要素:1.驱动,2.url,3.用户名.4.数据库密码。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<environments default="abc">
<environment id="abc">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/exercise"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>

  

 接下来我就解释一下这段代码:environments>标签用于配置数据库的数据源的。Mybatis很强大支持多个数据源 这里有个default属性这个属性代表着默认使用的数据库配置

这是它的子标签<environment>用于配置单个数据库的配置。这个标签有个ID属性这是作为数据库的唯一变量名使用的。可以在父标签的<environments>中设置id为数据库abc

这样我们在启动的时候默认链接的就是abc代表的数据库了。接下来继续看它的子标签<transactionManager>这个标签英文翻译过来就是事务代理Mybatis事务代理的方式只有两种一种就是使用事务代理一种就叫不使用事务代理。说到这里读者就可能开始骂我了:你这不是在讲废话么?不!我的确不是在讲废话!接下来带大家看看究竟是怎么回事。

框架的配置想入门有两个渠道一个是看官方文档,另一个方法是用过jar包里面的类作者在写这些类和方法还有定义参数的时候都会给后面打开来看的人一些注解这些注解帮助后面看的人对代码的理解,这里讲到我们学习框架,就可以通过这两种方式去学习。当然有些人很幸运可以在大神的加护下写代码。那样虽然很幸福,不需要走太多的弯路,但是有可能会让人产生一种依赖。人都是有惰性的,能问出来的谁会去研究?为了保持一种良好的学习习惯和钻研精神,我就打开了官方文档开始对这个框架进行研究。

这里为什么我选择了文档呢,因为...有中文啊!!!!

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

你看,人家官方都这么说了,嗯还真的是这样对于事务Mybatis只给予了我们这两种方案。与此同时也给予了我们一个答案,这个标签的type属性就只有JDBC和MANAGED两个值啊。那么既然有事务代理那我们就要用啊。所以一般这里设置成JDBC就可以了。这样就可以支持报异常的时候的事务回滚了。这样做给我们带来了什么好处呢?就例如上街使用支付宝,在支付的瞬间系统出问题,如果没有事务代理的话那么问题就来了,首先会被支付宝扣钱,然后支付宝确认了这笔账款之后再向商家的账号确认这笔收款。在没有事务代理的情况下很有可能在支付的时候钱扣了,但是因为断网没办法确认钱是否从账户扣了,接着系统报异常,这时候系统程序停了。确认收款的代码就没法执行了,接着卖家就会收不到钱。通过这个例子我们就可以得知一个道理,对于数据库的管理必须要确认是正常的数据才能放进去。同时我们也需要明白一个道理,我们为什么要建立数据库?不就是为了保存一些重要的信息嘛。既然这些数据是重要的,我们就不应该产生只操作了一半的垃圾数据。只有围绕着这样的思想去管理我们的数据库我们在需要的时候才能够得到准确的数据。

  接下来就讲一下<dataSource>标签,

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

这里官方有着很详细的说明我就直接上链接了。这些解释都非常友好

http://www.mybatis.org/mybatis-3/zh/configuration.html

这里看完了就知道,这个标签type属性的参数有什么还有它们的作用了。细心的人会发现一个问题

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

这里官方给了我们一个例子,再看看这个<dataSource>这里的参数。你就会发现

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

Mybatis是支持第三方数据源的。官方都给了个活生生的例子给我们了。

接着我创建了一个实体类后面注释表明了这个对应数据库字段的长度等描述

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

接着写一个接口接口中有个增加的方法

package cn.devil.map;

public interface SrudentMapper {

	int insertStudent();
}  

然后为了我们好维护,就在接口所在的包下面创建一个子包用来存放我们的映射配置文件

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

接着又到了官方文档出场的时候了搜索一下关于映射文件的配置

http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

这里不得不说Mybatis的官方文档写的真的很友好。

但是官方却给使用者留了个大坑!!!!对于<mapper>标签中的

namespace属性只字不提=  =这是要坑死使用者的节奏么?

这个属性是用来定义这个映射文件对应哪个接口的,下面就写了一段代码一看大家就能理解它的作用了

  Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

  接下来就来解释一下这段代码这里有个insert标签,这是用来做数据库的增加数据操作用的里面我写了几个属性这是干嘛用的呢?

首先说一下useGeneratedKeys这个属性,它有true / false两个值看到这种值得属性一般都是个开关,这个属性它代表了开启字段返回,

但是我们到这里又怎么去设置返回的字段呢?这里接着的第二个属性就是了。这个属性对应的是实体类对应的属性按照Javabean命名规则

命名的属性名。这里我设置返回一个stuId。但是问题又来了,Mybatis是怎么知道我们定义的Javabean的属性名长什么样的呢。这里就需要我们通过配置

让Myabtis知道我们的命名规范,并且我们只需要告诉它我有什么字段它就给我们自动匹配这些字段,从而完成我们希望的传参。

这里我们离开映射文件的配置切回到mybatis配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings> <environments default="abc">
<environment id="abc">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/exercise"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments> </configuration>

  这里我们需要加入mapUnderscoreToCamelCase这个支持驼峰命名法的配置这样Mybatis就能帮助我们把数据库的字段转换成实体类的属性了。

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

这里看到这个官方的例子就能够很好的说明我们只需要设置这个参数为trueMybatis就能够帮我们进行字段的自动映射。

现在清点一下状况

1.我们现在有了数据源。可以连接数据库了

2.我们有了实体类实体类规范了我们到底会操作数据库表中的哪些字段

3.我们有了接口,Mybatis的官方文件说明,不需要写实现就能够操作数据库增删改查

4我们有了映射文件,映射文件中有我们的操作指令

那现在还差什么呢?万事俱备只欠东风。这东风又是什么呢?嗯,这里的东风指的是数据库的执行对象。材料工具都齐全了就差一个精明的师傅

帮我们进行数据库的操作了。那···Mybati8s的PrepareStament(数据库执行对象)又是谁呢?我继续查看官方文档,就在入门的地方就跟我们说了

Mybatis是通过 SqlSession 来进行数据库操作的。那我们应该怎么获得它呢?官方这里又给了我们提示。我们可以通过SqlSessionFactory

并且通过配置数据源来进行对数据库的链接和操作的管理。那现在我们就有需求了。那么我们现在就需要一个这样的工厂为我们生成SqlSession

这里就创建一个类,并且去看作者的描述

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

看到这里就可以知道我们现在需要一个建工厂的水泥工,它帮我们建好工厂之后工厂就是我们的了,你说人家都拿钱走了还有他什么事?对吧。

package cn.devil.utils;

import java.io.IOException;
import java.io.Reader; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisUtil { public SqlSessionFactory createSqlSessionFactory() {
Reader reader;
try {
reader = Resources.getResourceAsReader("mybatis-configs.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
return builder.build(reader);
} catch (IOException e) {
e.printStackTrace();
} return null;
}
}

  所以这里我们就利用了这个对象建立了一个工厂报错的话返回空正常的时候就给我们建好一个工厂。

建好工厂之后builder.build(arg);的时候发现,我说我要该工厂,但是盖工厂工人说不行!我需要图纸!这里作者封装了很多种方法去读取这个图纸(数据源)

这里我选择了用Resource.getResourceAsReader("mybatis-configs.xml(配置文件的全路径)");它通过io流处理完之后给我们返回了一个Reader对象,这个

对象正式我们的工人需要的图纸(配置文件)。这样工厂(SqlSessionFactory)就给我们建好了,但是我们这里只需要一个工厂就够了,但是现在的方法会在每次被调用的

时候产生一个新的工厂。这时候怎么解决呢。我们可以把这个方法设置成私有的,静态的,然后开放一个静态的入口,让类加载的时候就默认生成一个对象放在内存的方法区。

随时都可以调用这个入口产生的工厂对象了。

  这里我们只是建造了工厂,但是我们还需要工人去给我们执行SQL语句呢于是我们就可以在类里面创建一个方法调用水泥工帮我们建造一个生产工厂

利用这个工厂的openSession方法获得我们需要的SqlSession对象了具体代码如下

package cn.devil.utils;

import java.io.IOException;
import java.io.Reader; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MybatisUtil { public static SqlSessionFactory SSF = MybatisUtil.createSqlSessionFactory(); private static SqlSessionFactory createSqlSessionFactory() {
Reader reader;
try {
reader = Resources.getResourceAsReader("mybatis-configs.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
return builder.build(reader);
} catch (IOException e) {
e.printStackTrace();
} return null;
} public static SqlSession getSqlSession() {
return SSF.openSession();
} public static void main(String[] args) {
System.out.println(MybatisUtil.getSqlSession());
}
}

  运行结果如下

org.apache.ibatis.session.defaults.DefaultSqlSession@161cd475
接着需要定义映射文件和接口的关系这里需要用到<mapper>标签在配置文件里面加上下面的代码:
   <mappers>
<mapper resource="cn/devil/map/xml/student-mapper.xml"/>
</mappers>

 我相信大家一看就知道怎么回事了Mapper标签是个复数那就意味着可以有很多个对应的mapper

mapper标签之中有两个属性,一个是resource 一个是class说道这个class嘛都说明是class了肯定就是配置对应的注解操作的映射接口的

现在需要配置映射文件xml所以需要用到这个resource属性。这里只需要配置我们项目根目录的路径就可以了。一般情况下source文件夹就是

项目的根目录。

 我们这就成功获得SQLsession对象了接着我们就可以写一个测试类去测试整个框架的功能了下面是测试类的代码

package cn.devil.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test; import cn.devil.map.SrudentMapper;
import cn.devil.pojo.Student;
import cn.devil.utils.MybatisUtil; public class StudentManagerTest { @Test
public void insertStu() {
//获得数据库执行对象SqlSession
SqlSession sqlSession = MybatisUtil.getSqlSession();
//给SqlSession传递一个映射接口让它按照映射接口和映射文件的方法操作数据库
SrudentMapper mapper = sqlSession.getMapper(SrudentMapper.class); //创建一个插入数据库的对象
Student student = new Student();
student.setStuName("DEVIL666"); //操作对象
int result = mapper.insertStudent(student);
System.out.println(result); //提交事务,并且关闭数据库连接
sqlSession.commit();
sqlSession.close();
}
}

  右键方法运行查看返回的值

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

1这个是回调的stuId,接着就去数据库看一下

结果出来了

Mybatis-基于配置文件的配置(——纪念这个即将被抛弃的孩子)

这样就配置成功了。需要其他删改查的操作只需要看着官方文档的说明就可以顺利地实现了。

上一篇:linux命令学习之:netstat


下一篇:selinux基本概念