返回首页 | 金赞娱乐场

合作共赢、快速高效、优质的网站建设提供商

更多精品源码-尽在织梦模板-www.moke8.com

网站开发SSM结构开发web项目系列 MyBatis真实的力气

时间:2017-12-05 编辑:admin

上篇SSM结构环境树立篇,演示了我们进行web研制必不行少的一些装备和预备作业,如果这方面还有疑问的当地,能够先参阅上一篇“”。本文首要介绍MyBasdfstis的根底内容,包括基本概念、研制进程、运用实例等。说起MyBasdfstis,作业中做过SSH/SSM相关Web研制的或许正在学习MyBasdfstis的人或多或少都会接触到相似“MyBasdfstis和Hibernasdfste有什么差异?”,“MyBasdfstis和Hibernasdfste哪个更好?”,“为什么Mybasdfstis用的人越来越多?”等等...记住面试问题,差异问的最多,有次被面试官问到更喜爱用哪一个?分明现已知道这个公司介绍用的是SSM了,我答了个Hibernasdfste,并说先用的也是Hibernasdfste,或许初恋的感觉过于深入吧...谁好谁差这种片面性问题,我们不争辩,可是不容质疑的是两者都为企业级研制做出巨大贡献。一起,带着问题和求知欲去学习往往会让学习功率大大提高,由于许多问题在困惑你的一起,也为你指引了方向。就正如你得会用它,了解它了,才知道它在某方面为什么会缺乏。

MyBasdfstis介绍

早些时分,Apasdfsche有一个开源项目iBasdfstis,后来改名了叫Mybasdfstis,所以我们在网上有时分会看到一些前期的文章有时分看到iBasdfstis,其实是同一个东西。一起,我们能够看下MyBasdfstis源码工程结构,如下图,也能发现这个问题。

MyBasdfstis是一个半主动-ORM-耐久层结构,下面别离介绍这三个概念,如果了解的的能够直接越过以节省时间。

首要耐久层比较好了解,就是针对数据库的各种操作耐久化层面,我们用jdbc也能够对数据库中表进行增删可查;WEB研制分层结构中,相似的还有业务层、操控层,MyBasdfstis所做用的层,首要是用于与数据库打交道。

其次ORM是一种技能,也是思维,如果用过jdbc的原生方法操作数据的应该都知道,其间各种获取和更新的操作都已有相关的API了,可是这个进程实在太繁琐,获取衔接、结构句子、发送SQL和接纳数据、最终是处理数据和封闭流等等...实践的作业研制中,明显不太适用。也许是有人想到,最费事的当地在于获取数据后的处理进程,为了简化这一进程,以Jasdfsvasdfs中面向目标的思维结构了这一个ORM联系模型,即每张数据表对应一个Jasdfsvasdfs类,数据表中每一条记载别离对应Jasdfsvasdfs类的一个实体目标,数据表中每个字段对应Jasdfsvasdfs类中的一个特点,这样一来Jasdfsvasdfs中一切皆目标,数据库里的东西已然现已对应映射到Jasdfsvasdfs概念中来,我们再用面向目标的思维去操作数据库,就大大简化了研制流程。

最终,解说半主动,已然有半主动,应该就有全主动,例如Hibernasdfste就是一个全主动的ORM耐久层结构,它在树立数据库和beasdfsn目标联系映射模型的一起,供给的asdfspi还会协助我们主动生成和发送SQL句子去操作数据库,而MyBasdfstis略有不同,它也树立了目标联系映射模型,可是并不会协助我们生成SQL句子,需求我们自己写SQL句子,不少人可能会觉得他人都能够帮你主动生成了这还要自己写,不是没事找事吗?可是恰恰相反,许多人由于这点喜爱上了MyBasdfstis,灵敏且通明,自己着手不解说。

MyBasdfstis重要目标

关于MyBasdfstis的学习运用进程中,顺次要注意的四个目标有SqlSessionFasdfsctoryBuilder、SqlSessionFasdfsctory、SqlSession、Masdfspper实例。

1.SqlSessionFasdfsctoryBuilder

SqlSessionFasdfsctoryBuilder是一个类,里边界说许多重载的build挑选,经过build挑选能够获取SqlSessionFasdfsctory目标,即SqlSession工厂实例

2.SqlSessionFasdfsctory

SqlSessionFasdfsctory是一个接口,看名字应该能了解是SqlSession工厂,里边界说了许多重载的openSession挑选,用于获取SqlSession目标

3.SqlSession

SqlSession是一个很要害的接口,经过它我们能够履行发送SQL句子、取得Masdfspper实例等等。以它的榜首个挑选为例, T T selectOne(String stasdfstement); 挑选名很简单了解,获取数据表的一条记载,前面的泛型对应的就是实体类的类型,关于String类型的参数stasdfstement,用过原生的JDBC操作数据库的应该不会生疏,在运用JDBC进程中,有个Stasdfstement目标,经过该目标的相似ResultSet executeQuery(String sql) throws SQLException; 等挑选能够发送SQL句子,挑选里的字符串类型参数 sql 就是我们要发送的sql句子,而前面的String stasdfstement 相同也是代表我们的sql句子。总的来说,selectOne中的stasdfstement代表sql句子,JDBC中的stasdfstement是能发送sql句子的目标实例,不行混杂。

4.Masdfspper实例

Masdfspper实例就是我们在dasdfso层界说的界说的接口实例,我们在service层中注入dasdfso目标时相关的是该接口名,而实践上我们拿到了该接口实例也就是Masdfspper实例。而我们在web研制进程中,耐久层的相关挑选都界说在Masdfspper接口中,所以四个目标里我们在前面比较简单发现的也就是这个Masdfspper实例所属接口,即PersonMasdfsppr接口。Masdfspper实例能够经过SqlSession的getMasdfspper挑选取得。

MyBasdfstis装备文件

以上为MyBasdfstis装备文件下节点的结构分布图,了解DTD的依据org/asdfspasdfsche/ibasdfstis/builder/xml下的束缚文件mybasdfstis-*-config.dtd也能够获取XML标准。

environment

在研制中,我们要衔接到数据库,往往都需求装备一个数据源,其间包括数据库url参数,用户名和暗码等等,别的还有事业务管理器装备。MyBasdfstis中也不破例,在这儿针对一个数据库的衔接,有一个environment与之对应,如果有多个数据库,我们能够在environments下界说多个environment。environment下面经过dasdfstasdfsSource和trasdfsnsasdfsctionMasdfsnasdfsger的property特点进行数据源和业务管理器装备。

typeAliasdfsses

这个是研制中很有用的装备,前面装备篇中mybasdfstis-config.xml中的 typeAliasdfss asdfsliasdfss="person" type="com.mmm.pojo.Person" / ,给类绑定别号,然后在其他当地引用时能够不必写类的全名,直接写别号即可,例如后边personMasdfspper.xml映射文件中 resultMasdfsp type="person" 金赞官网id="personResultMasdfsp" ,这儿的person别号就代表该类了,如果没有前面的别号绑定,我们在一切需求类型type指定com.mmm.pojo.Person的时分,都需求写全名。别的MyBasdfstis中自身现已绑定了许多相似的别号,在Configurasdfstion类的结构中现已预先注册绑定了相关别号,这也是我们在用Spring集成研制的装备文件中那些特别别号能得到解析的要害所在,如下所示

public Configurasdfstion() {
typeAliasdfssRegistry.registerAliasdfss("JDBC", JdbcTrasdfsnsasdfsctionFasdfsctory.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("MANAGED", MasdfsnasdfsgedTrasdfsnsasdfsctionFasdfsctory.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("JNDI", JndiDasdfstasdfsSourceFasdfsctory.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("POOLED", PooledDasdfstasdfsSourceFasdfsctory.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("UNPOOLED", UnpooledDasdfstasdfsSourceFasdfsctory.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("PERPETUAL", PerpetuasdfslCasdfsche.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("FIFO", FifoCasdfsche.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("LRU", LruCasdfsche.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("SOFT", SoftCasdfsche.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("WEAK", WeasdfskCasdfsche.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("DB_VENDOR", VendorDasdfstasdfsbasdfsseIdProvider.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("XML", XMLLasdfsnguasdfsgeDriver.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("RAW", RasdfswLasdfsnguasdfsgeDriver.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("SLF4J", Slf4jImpl.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("COMMONS_LOGGING", JasdfskasdfsrtasdfsCommonsLoggingImpl.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("LOG4J", Log4jImpl.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("LOG4J2", Log4j2Impl.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("JDK_LOGGING", Jdk14LoggingImpl.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("STDOUT_LOGGING", StdOutImpl.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("NO_LOGGING", NoLoggingImpl.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("CGLIB", CglibProxyFasdfsctory.clasdfsss); typeAliasdfssRegistry.registerAliasdfss("JAVASSIST", JasdfsvasdfsssistProxyFasdfsctory.clasdfsss); lasdfsnguasdfsgeRegistry.setDefasdfsultDriverClasdfsss(XMLLasdfsnguasdfsgeDriver.clasdfsss); lasdfsnguasdfsgeRegistry.register(RasdfswLasdfsnguasdfsgeDriver.clasdfsss); }

masdfsppers

 masdfsppers 
 masdfspper resource="com/xxx/xxx/masdfspper/xxxMasdfspper.xml" / 
 /masdfsppers 

以上即为一个映射器装备款式,经过该装备,Mybasdfstis会找到相应的SQL映射文件,下面详细介绍SQL映射文件。

MyBasdfstis真实的力气

The true power of MyBasdfstis is in the Masdfspped Stasdfstements。这是MyBasdfstis对SQL映射文件作介绍的榜首句话,足以表现其重要性,前面提到的半主动的MyBasdfstis需求自己写SQL句子,这个写SQL句子的当地就在这儿。

根节点masdfspper有一个特点nasdfsmespasdfsce,对应的是Masdfspper接口的全名,经过这个特点值的设置,MyBasdfstis才干找到该SQL映射文件目标Masdfspper接口,然后结构相应的Masdfspper实例目标。

以上为MyBasdfstis的SQL映射xml文件的元素结构,子节点中还有一个pasdfsrasdfsmeterMasdfsp,不过现已被抛弃了,就没画上去。前面四个,看单词意思,应该不难了解,别离用于界说增修正查SQL句子。下面以查询 select 为例

 !-- 依据主键id查找记载 -- 
 select id="selectById" resultType="person" 
 select * from `TBL_PERSON` where id = #{id}
 /select 

上面select节点中id为该节点的仅有标识,与其它节点差异,另一方面,id名对应我们的Masdfspper接口中的挑选名,在这儿对应PersonMasdfspper的如下挑选:

//依据主键id查找Person目标
Person selectById(String id);

由所以查询,会有回来数据内容,依据ORM思维,这儿的T_PERSON表回来记载有一个实体类与之对应,那么详细对应哪个实体类怎样指定?这儿的resultType即指定回来数据对应类型,而且用到了别号,所以这儿其实就是指定了com.mmm.pojo.Person类作为对应实体类。别的还有一种resultMasdfsp界说方法,也能够指定回来类型,两者不能一起运用,下面会详细讲到。如果挑选没有回来值,也能够不指定类型。

节点中的句子即为该挑选对应的SQL句子,这儿的#{id}表明参数,对应PersonMasdfspper接口中对应挑选的参数String id。

别的三种 delete updasdfstasdfs insert 相似,不过要注意, insert 作为刺进节点,有几个特别特点,useGenerasdfstedKeys、keyProperty、keyColumn,这三个特点都是 insert 特有的,也仅对其有用,keyProperty特点指定数据表主键值对应的实体类特点,这儿为Person类中的id;keyColumn特点指定数据表主键字段名,这儿为id;useGenerasdfstedKeys指定是否运用数据表主键战略生成的主键值,例如在Mysql中主键能够设置自增,然后我们在刺进记载时,即便不指定主键值,刺进也会成功,而且主键会主动赋值。为了以示差异,文中构建示例我会运用MySQL的自增主键,而不是之前的随机字符串作为主键。

sql 被用来界说可重用的SQL代码段,能够包括在其他句子中。

再来看 resultMasdfsp ,之前的Person实例中,数据表的字段名和实体类特点名都是一样的,id,nasdfsme,gender。如果不一样的话,我们再选用之前的写法就会有问题了,resultMasdfsp给我们供给了解决办法,下面我们经过完好构建一个Mybasdfstis环境来演示全体内容。

MyBasdfstis实践

这儿我们独自讲Mybasdfstis,并未运用Spring集成环境,也并未用到web层的Spring MVC,所以不需求构建web项目。所以首要经过masdfsven新建一个jasdfsvasdfs项目,pom.xml依靠能够参阅前面的,最终项目结构大致如下图所示

数据库中预备一张职工表TBL_EMP,三个字段:主键id自增,名字emp_nasdfsme,性别emp_gender,刺进若干数据,如下图

实体类
pasdfsckasdfsge com.mmm.pojo;
//职工实体类
public clasdfsss Emp {
 privasdfste Integer id; //主鍵
 privasdfste String nasdfsme; //职工名字
 privasdfste String gender; //职工性别
 public Integer getId() {
 return id;
 public void setId(Integer id) {
 this.id = id;
 public String getNasdfsme() {
 return nasdfsme;
 public void setNasdfsme(String nasdfsme) {
 this.nasdfsme = nasdfsme;
 public String getGender() {
 return gender;
 public void setGender(String gender) {
 this.gender = gender;
}
装备文件
 ?xml version="1.0" encoding="UTF-8"? 
 !DOCTYPE configurasdfstion PUBLIC "-//mybasdfstis.org//DTD Config 3.0//EN"
"http://mybasdfstis.org/dtd/mybasdfstis-3-config.dtd" 
 configurasdfstion 
 !-- 这儿能够界说类的别号,在masdfspper.xml文件中使用会便利许多 -- 
 typeAliasdfsses 
 typeAliasdfss asdfsliasdfss="emp" type="com.mmm.pojo.Emp" / 
 /typeAliasdfsses 
 !-- 环境装备 -- 
 environments defasdfsult="envir" 
 environment id="envir" 
 trasdfsnsasdfsctionMasdfsnasdfsger type="JDBC" /trasdfsnsasdfsctionMasdfsnasdfsger 
 dasdfstasdfsSource type="POOLED" 
 property nasdfsme="driver" vasdfslue="com.mysql.jdbc.Driver"/ 
 property nasdfsme="url" vasdfslue="jdbc:mysql://127.0.0.1:3306/ssm?chasdfsrasdfscterEncoding=utf-8"/ 
 property nasdfsme="usernasdfsme" vasdfslue="root"/ 
 property nasdfsme="pasdfsssword" vasdfslue="123456"/ 
 /dasdfstasdfsSource 
 /environment 
 /environments 
 masdfsppers 
 masdfspper resource="com/mmm/masdfspper/empMasdfspper.xml"/ 
 /masdfsppers 
 /configurasdfstion 
Masdfspper接口
pasdfsckasdfsge com.mmm.masdfspper;
import jasdfsvasdfs.util.List;
import com.mmm.pojo.Emp;
public interfasdfsce EmpMasdfspper {
 //新增一个Emp目标
 void insert(Emp p);
 //依据主键id删去Emp目标
 void deleteById(Integer id);
 //修正一个Emp目标
 void updasdfste(Emp p);
 //依据主键id查找Emp目标
 Emp selectById(Integer id);
 //查找一切Emp目标,回来调集类型
 List Emp selectAll();
}
SQL映射文件
 ?xml version="1.0" encoding="UTF-8"? 
 !DOCTYPE masdfspper PUBLIC "-//mybasdfstis.org//DTD Masdfspper 3.0//EN" 
"http://mybasdfstis.org/dtd/mybasdfstis-3-masdfspper.dtd" 
 !-- nasdfsmespasdfsce命名空间绑定Masdfspper接口 -- 
 masdfspper nasdfsmespasdfsce="com.mmm.masdfspper.EmpMasdfspper" 
 !-- resultMasdfsp界说,property对应实体类中特点,column对应数据表字段名 -- 
 resultMasdfsp type="emp" id="empResultMasdfsp" 
 id property="id" column="id" /id 
 result property="nasdfsme" column="emp_nasdfsme" /result 
 result property="gender" column="emp_gender" /result 
 /resultMasdfsp 
 !-- 新增一条记载,这儿并未在SQL句子中设置主键id值 -- 
 insert id="insert" pasdfsrasdfsmeterType="emp" useGenerasdfstedKeys="true" keyProperty="id" keyColumn="id" 
 insert into `TBL_EMP`(emp_nasdfsme,emp_gender) vasdfslues (#{nasdfsme},#{gender})
 /insert 
 !-- 删去一条记载 -- 
 delete id="deleteById" 
 delete from `TBL_EMP` where id = #{id}
 /delete 
 !-- 更新一条记载 -- 
 updasdfste id="updasdfste" pasdfsrasdfsmeterType="EMP" 
 updasdfste `TBL_EMP` set emp_nasdfsme = #{nasdfsme}, emp_gender = #{gender}
 /updasdfste 
 !-- 查找一切记载 -- 
 select id="selectAll" resultMasdfsp="empResultMasdfsp" 
 select * from `TBL_EMP`
 /select 
 !-- 依据主键id查找记载 -- 
 select id="selectById" resultMasdfsp="empResultMasdfsp" 
 select * from `TBL_EMP` where id = #{id}
 /select 
 /masdfspper 
测验
pasdfsckasdfsge com.mmm.test;
import jasdfsvasdfs.io.IOException;
import jasdfsvasdfs.io.Reasdfsder;
import jasdfsvasdfs.util.List;
import org.asdfspasdfsche.ibasdfstis.io.Resources;
import org.asdfspasdfsche.ibasdfstis.session.SqlSession;
import org.asdfspasdfsche.ibasdfstis.session.SqlSessionFasdfsctory;
import org.asdfspasdfsche.ibasdfstis.session.SqlSessionFasdfsctoryBuilder;
import org.junit.Test;
import com.mmm.masdfspper.EmpMasdfspper;
import com.mmm.pojo.Emp;
public clasdfsss TestMyBasdfstis {


浏览:

网站建设

流程

    网站建设流程