mybatis的主要特使是sqlMap,也可以当作orm来使用,不过sql得自己写。至于你说的更换数据库,只要你的SQL写得够通用,把底层的数据源替换掉就可以了。
就算是orm的hibernate的hql语句,如果没有注意各个数据库的不同点,写的不好,有的hql也一样不能通用的
使用fluent mybatis可以不用写具体的xml文件,通过java api可以构造出比较复杂的业务sql语句,做到代码逻辑和sql逻辑的合一。
不再需要在Dao中组装查询或更新 *** 作,在xml或mapper中再组装参数。
那对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?
需求场景设置
我们通过一个比较典型的业务需求来具体实现和对比下,假如有学生成绩表结构如下:
create table `student_score`
(
id bigint auto_increment comment '主键ID' primary key,
student_id bigint not null comment '学号',
gender_man tinyint default 0 not null comment '性别, 0:女; 1:男',
school_term int null comment '学期',
subject varchar(30) null comment '学科',
score int null comment '成绩',
gmt_create datetime not null comment '记录创建时间',
gmt_modified datetime not null comment '记录最后修改时间',
is_deleted tinyint default 0 not null comment '逻辑删除标识'
) engine = InnoDB default charset=utf8;
现在有需求:
统计2000年三门学科('英语', '数学', '语文')及格分数按学期,学科统计最低分,最高分和平均分, 且样本数需要大于1条,统计结果按学期和学科排序
我们可以写SQL语句如下
select school_term,
subject,
count(score) as count,
min(score) as min_score,
max(score) as max_score,
avg(score) as max_score
from student_score
where school_term >= 2000
and subject in ('英语', '数学', '语文')
and score >= 60
and is_deleted = 0
group by school_term, subject
having count(score) > 1
order by school_term, subject;
那上面的需求,分别用fluent mybatis, 原生mybatis 和 Mybatis plus来实现一番。
三者实现对比
使用fluent mybatis 来实现上面的功能
具体代码:
>
1、传统的建表方式
其实为了方便我们对数据库表进行管理,Android本身就提供了一个帮助类:SQLiteOpenHelper。这个类集创建和升级数据库于一身,并且自动管理了数据库版本,算是一个非常好用的工具。
那我们现在就来试试SQLiteOpenHelper的用法吧。首先你要知道SQLiteOpenHelper是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。本篇文章只需要把注意力放在创建数据库这里就行了,升级数据库我们会在下一篇文章中去讨论。
新建一个MySQLiteHelper类并让它继承SQLiteOpenHelper,这样一个最基本的数据库帮助类的代码如下所示:
[java] view plain copy
public class MySQLiteHelper extends SQLiteOpenHelper {
public MySQLiteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
其中,当数据库创建的时候会调用onCreate()方法,在这里去执行建表 *** 作就可以了。比如说我们想新建一张news表,其中有title,content,publishdate,commentcount这几列,分别代表着新闻标题、新闻内容、发布时间和评论数,那么代码就可以这样写:
[java] view plain copy
public class MySQLiteHelper extends SQLiteOpenHelper {
public static final String CREATE_NEWS = "create table news ("
+ "id integer primary key autoincrement, "
+ "title text, "
+ "content text, "
+ "publishdate integer,"
+ "commentcount integer)";
public MySQLiteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
dbexecSQL(CREATE_NEWS);
}
}
可以看到,我们把建表语句定义成了一个常量,然后在onCreate()方法中去执行了这条建表语句,news表也就创建成功了。这条建表语句虽然简单,但是里面还是包含了一些小的细节,我来解释一下。首先,根据数据库的范式要求,任何一张表都应该是有主键的,所以这里我们添加了一个自增长的id列,并把它设为主键。然后title列和content列都是字符串类型的,commentcount列是整型的,这都很好理解,但是publishdate列该怎么设计呢?由于SQLite中并不支持存储日期这种数据类型,因此我们需要将日期先转换成UTC时间(自1970年1月1号零点)的毫秒数,然后再存储到数据库中,因此publishdate列也应该是整型的。
现在,我们只需要获取到SQLiteDatabase的实例,数据库表就会自动创建了,如下所示:
[java] view plain copy
SQLiteOpenHelper dbHelper = new MySQLiteHelper(this, "demodb", null, 1);
SQLiteDatabase db = dbHelpergetWritableDatabase();
LitePal的基本用法
虽说LitePal宣称是近乎零配置,但也只是“近乎”而已,它还是需要进行一些简单配置才可以使用的,那么我们第一步就先快速学习一下LitePal的配置方法。
快速配置
1 引入Jar包或源码
首先我们需要将LitePal的jar包引入到项目当中,可以点击这里查看LitePal的最新版本,选择你需要的下载即可。下载好了jar包之后,把它复制到项目的libs目录中就算是引入成功了,如下图所示:
如果你不想用jar包的话,也可以把LitePal的源码下载下来,然后作为一个library库导入到Eclipse当中,再让我们的项目去引用这个library库就可以了。
2 配置litepalxml
接着在项目的assets目录下面新建一个litepalxml文件,并将以下代码拷贝进去:
[java] view plain copy
<xml version="10" encoding="utf-8">
<litepal>
<dbname value="demo" ></dbname>
<version value="1" ></version>
<list>
</list>
</litepal>
配置文件相当简单,<dbname>用于设定数据库的名字,<version>用于设定数据库的版本号,<list>用于设定所有的映射模型,我们稍后就会用到。
3 配置LitePalApplication
由于 *** 作数据库时需要用到Context,而我们显然不希望在每个接口中都去传一遍这个参数,那样 *** 作数据库就显得太繁琐了。因此,LitePal使用了一个方法来简化掉Context这个参数,只需要在AndroidManifestxml中配置一下LitePalApplication,所有的数据库 *** 作就都不用再传Context了,如下所示:
[java] view plain copy
<manifest>
<application
android:name="orglitepalLitePalApplication"
>
</application>
</manifest>
当然,有些程序可能会有自己的Application,并在这里配置过了。比如说有一个MyApplication,如下所示:
[java] view plain copy
<manifest>
<application
android:name="comexampleMyApplication"
>
</application>
</manifest>
没有关系,这时只需要修改一下MyApplication的继承结构,让它不要直接继承Application类,而是继承LitePalApplication类,就可以使用一切都能正常工作了,代码如下所示:
[java] view plain copy
public class MyApplication extends LitePalApplication {
}
但是,有些程序可能会遇到一些更加极端的情况,比如说MyApplication需要继承另外一个AnotherApplication,并且这个AnotherApplication还是在jar包当中的,不能修改它的代码。这种情况应该算是比较少见了,但是如果你遇到了的话也不用急,仍然是有解释方案的。你可以把LitePal的源码下载下来,然后把src目录下的所有代码直接拷贝到你项目的src目录下面,接着打开LitePalApplication类,将它的继承结构改成继承自AnotherApplication,再让MyApplication继承自LitePalApplication,这样所有的Application就都可以在一起正常工作了。
仅仅三步,我们就将所有的配置工作全部完成了,并且这是一件一本万利的事情,自此以后,你就可以开心地体验LitePal提供的各种便利了,就让我们从建表开始吧。
开始建表
前面在介绍的时候已经说了,LitePal采取的是对象关系映射(ORM)的模式,那么什么是对象关系映射呢?简单点说,我们使用的编程语言是面向对象语言,而我们使用的数据库则是关系型数据库,那么将面向对象的语言和面向关系的数据库之间建立一种映射关系,这就是对象关系映射了。
但是我们为什么要使用对象关系映射模式呢?这主要是因为大多数的程序员都很擅长面向对象编程,但其中只有少部分的人才比较精通关系型数据库。而且数据库的SQL语言晦涩难懂,就算你很精通它,恐怕也不喜欢经常在代码中去写它吧?而对象关系映射模式则很好地解决了这个问题,它允许我们使用面向对象的方式来 *** 作数据库,从而可以从晦涩难懂的SQL语言中解脱出来。
那么接下来我们就看一看LitePal中是如何建表的吧。根据对象关系映射模式的理念,每一张表都应该对应一个模型(Model),也就是说,如果我们想要建一张news表,就应该有一个对应的News模型类。新建一个News类,如下所示:
[java] view plain copy
package comexampledatabasetestmodel;
public class News {
}
然后,表中的每一列其实就是对应了模型类中的一个字段,比如news表中有id、title、content、publishdate、commentcount这几个列,那么在News类中就也应该有这几个字段,代码如下所示:
[java] view plaincopy
[java] view plain copy
public class News {
private int id;
private String title;
private String content;
private Date publishDate;
private int commentCount;
// 自动生成get、set方法
}
其中id这个字段可写可不写,因为即使不写这个字段,LitePal也会在表中自动生成一个id列,毕竟每张表都一定要有主键的嘛。
这里我要特别说明一下,LitePal的映射规则是非常轻量级的,不像一些其它的数据库框架,需要为每个模型类单独配置一个映射关系的XML,LitePal的所有映射都是自动完成的。根据LitePal的数据类型支持,可以进行对象关系映射的数据类型一共有8种,int、short、long、float、double、boolean、String和Date。只要是声明成这8种数据类型的字段都会被自动映射到数据库表中,并不需要进行任何额外的配置。
那么有的朋友可能会问了,既然是自动映射的话,如果News类中有一个字符串字段我并不想让它映射到数据库表中,这该怎么办呢?对此,LitePal同样采用了一种极为轻量的解决方案,只有声明成private修饰符的字段才会被映射到数据库表中,如果你有某一个字段不想映射的话,只需要将它改成public、protected或default修饰符就可以了。
现在模型类已经建好了,我们还差最后一步,就是将它配置到映射列表当中。编辑assets目录下的litepalxml文件,在<list>标签中加入News模型类的声明:
[java] view plain copy
<xml version="10" encoding="utf-8">
<litepal>
<dbname value="demo" ></dbname>
<version value="1" ></version>
<list>
<mapping class="comexampledatabasetestmodelNews"></mapping>
</list>
</litepal>
注意这里一定要填入News类的完整类名。
OK,这样所有的工作就都已经完成了,现在只要你对数据库有任何的 *** 作,news表就会被自动创建出来。比如说LitePal提供了一个便捷的方法来获取到SQLiteDatabase的实例,如下所示:
[java] view plain copy
SQLiteDatabase db = ConnectorgetDatabase();
好了,到目前为止你已经算是对LitePal的用法有点入门了,那么本篇文章的内容就到这里,下篇文章当中我们将学习使用LitePal进行升级表的 *** 作。感兴趣的朋友请继续阅读 Android数据库高手秘籍(三)——使用LitePal升级表 。
一、什么是Hibernate框架?
1、Hibernate框架是应用在javaEE三层结构中的dao层框架。
2、在dao层里面做对数据库的增删改查 *** 作,使用Hibernate框架实现增删改查 *** 作。Hibernate底层就是jdbc,对jdbc的轻量级的封装,使用Hibernate不需要写复杂的jdbc代码。
3、Hibernate是开源的、轻量级的框架。轻量级的框架:Hibernate不需要依赖其他的东西就可以直接使用。
总结:Hibernate是使用ORM思想对数据库进行的增删改查 *** 作的轻量级框架。
二、ORM(Object/Relational
Mapping):对象/关系映射
是通过使用描述对象和数据库之间映射的数据,将java程序中的对象自动持久化到关系数据库中;
本质上就是将数据从一种形式转换到另外一种形式。
东方标准国际软件专业讲师,曾经负责过的重大的大型项目包括:全军武器装备
质量管理系统、全军办公自动化系统、日本NTT电信管理系统等。主要著作包括
《ASPNET开发答疑200问》《ASPNET开发实例导航》等。毕业于北京大学计算
机专业。
1 什么是ORM
ORM的全称是Object Relational Mapping,即对象关系映射。它的实现思想就是
将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可
以把对数据库的 *** 作转化为对这些对象的 *** 作。因此它的目的是为了方便开发人
员以面向对象的思想来实现对数据库的 *** 作。
2.什么是Hibernate
对于Hibernate的称呼有很多,比如工具、技术、框架以及解决方案等,这些都
可以,重要的是大家要知道它的作用。在这里我习惯性称它为框架,它是一种能
实现ORM的框架。能实现ORM这个功能的框架有很多,Hibernate可以说是这些框
架中最流行、最受开发者关注的,甚至连JBoss公司也把它吸收进来,利用它在
自己的项目中实现ORM功能。
3.ORM的实现原理
现在在Java领域大家对Hibernate的讨论很多,比如它的优缺点、如何应用、错
误如何解决以及把它和Struts/Spring等框架相结合作为整个系统的解决方案。
在这里我想和大家探讨一些更深层次的话题,那就是Hibernate是如何实现ORM的
功能?如果让我们自己开发一款实现ORM功能的框架需要怎么做?其实这些问题
就是围绕着一个词,那就是“映射”,如果我们知道如何实现这种映射那么我们
也能够开发出自己的一款ORM框架。会使用 Hibernate的开发人员都知道,在使
用它实现ORM功能的时候,主要的文件有:映射类(java)、映射文件
(hbmxml)以及数据库配置文件(properties或cfgxml),它们各自的
作用如下。
⑴映射类:它的作用是描述数据库表的结构,表中的字段在类中被描述成属性,
将来就可以实现把表中的记录映射成为该类的对象。
⑵映射文件:它的作用是指定数据库表和映射类之间的关系,包括映射类和数据
库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对
应关系等。
⑶数据库配置文件:它的作用是指定与数据库连接时需要的连接信息,比如连接
哪中数据库、登录用户名、登录密码以及连接字符串等。
在这三种主要的文件中,映射类为普通Java源文件、映射文件为XML格式、数据
库配置文件为Properties格式或者是XML格式。想理解“映射” 首先我们需要知
道如何解析这三种文件,即解析XML格式文件、解析Properties格式文件和解析
Java类文件。下面我们来分别探讨一下如何实现这些文件的解析。
⑴如何解析XML文件
前面我们说过映射文件是XML格式,数据库配置文件也可以是XML格式,因此如果
能解析XML文件我们就可以获取这两个文件的信息。XML文件格式我简单做下介绍
,比如tom这句就是一个XML格式的描述,name代表节点,节点必须有开始标记和
结束标记,在开始标记中我们可以添加一些属性的声明比如sex。解析XML的技术
可以分为两类那就是SAX和DOM,这两种方式的差别和优缺点大家可以上网查阅或
者我们会在以后的文章中提出,请大家关注。实现解析XML文件的功能很方便,
我们可以通过下载第三方的一些工具包如xml-apisjar和 xercesImpljar等,
也可以使用JDK自带的工具类DocumentBuilderFactory、DocumentBuilder、
Document、Element等等,大家可以通过API文挡查阅这些类的说明。通过这些类
我们可以把XML文件的信息读入内存并通过类中的某些方法获取指定节点的名字
、值、属性名、属性值这些信息。
⑵解析Properties文件
数据库配置文件可以是XML格式也可以是Properties格式,Properties文件一般
采用“属性名=属性值”的形式描述信息。如果配置文件采用Properties文件描
述,我们就需要想办法解析这种类型的文件了。想解析Properties文件大家就需
要熟悉Properties这个类了,这个类有一些常用方法比如,load()加载指定文件
并读取文件中的属性信息,PropertyNames()返回所有属性名,getProperty ()
返回指定属性名的属性值。通过解析Properties文件我们可以得到连接数据库必
要的信息,然后通过底层JDBC技术与数据库建立连接。
⑶解析Java类文件
通过解析映射文件和数据库配置文件我们可以建立数据库的连接,可以得到映射
类的名字、属性名、数据库表名、字段名以及类型等信息。要把数据库中表的数
据映射成为对象,首先需要把表中的记录取出,然后将每个字段值给映射类对象
的每个属性,这个赋值过程要调用对象中的set方法。我们现在通过映射文件只
知道类名和属性名,如何根据类名和属性名调用相应的set和get方法,是一个关
键问题。在Java中有一种机制叫反射机制,使用这种机制我们可以得到类的信息
,包括类只用的修饰符、方法、属性、继承的父类以及实现接口等信息。反射机
制相关的类有Class、Field、Method以及 Constructor等。通过Class的
getFields()、getMethods()和getConstructors()方法得到相应的属性、方法和
构造方法。通过Field类的getName()、getType()和getModifiers()方法得到相
应的属性名、属性类型、属性修饰符信息。通过Method类getReturnType()可以
获取方法的返回类型,invoke()方法可以根据给定的方法名和参数值执行对象中
对应的方法。我们可以首先通过以上方法获取类中的属性名,然后拼写成setXXX
和getXXX方法名,最后根据方法名执行对应的方法,将数据库数据加载到对象中
。
此外要实现Hibernate机制还会涉及到一个技术点,那就是如何获取数据库的相
关信息。要实现这个功能,就需要大家了解JDBC的 DataBaseMetaData类和
ResultSetMetaData类,通过这两个类的方法我们就可以获取数据库表的字段名
、类型、大小等相关信息。
以上就是关于mybatis算是orm框架吗,可以更换底层数据库吗全部的内容,包括:mybatis算是orm框架吗,可以更换底层数据库吗、阿里开源的 ORM 框架!它是否能抢得过MybatisPlus市场(上)、有什么好的支持多种数据库的ORM框架等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)