这是个开源的持久层框架。有几个特点:第一个是轻;第二个是将sql语句和代码分离;第三个是很好地支持java中复杂数据的映射;第四个是,我们用jdbc的时候要去拼凑sql语句,这种方式是不安全的,也不方便,mybatis这里用的是动态sql技术来代替这种拼凑sql语句。
使用的时候要导入相关jar包还有MySQL相关jar包,如果要输出sql语句的话,还要配置位置文件,就要加入log4j.properties这个文件。
在mybatis中有两种配置文件,一种是基本配置文件,一种是mapper配置文件也叫映射。通过配置文件我们可以建立SqlSessionFactory和SqlSession
下面介绍一下mybaits的工作流程:
1.读取基本配置文件,这里包含着连接数据库的信息;
2.然后就会生成SqlSessionFactory,这是个sqlsession的工厂,用来建立和数据库之间的会话。
3.有了SqlSessionFactory之后就可以建立SqlSession,这个东西的目的是用来执行sql语句,它通过调用mybatis中各种各样的api函数来执行sql语句。
4.sql语句则放在另一个配置文件里,就是我们的MAP配置文件。
5.返回结果。
6.关闭sqlsession。
基本配置文件:
(一般可以找现成的MyBatis配置文件,比如上Github上找)
基本配置文件大概由两部分组成,一部分是连接数据库的信息,另一部分是map配置文件的位置。
基本配置文件有两个元素,一个是
<environments defaults="development">
<environment id="development">
..
</environment>
<environments>
这里边叫环境,里面封装的就是连数据库的相关信息。 环境里面会有多个environment,每个environment代表的是连接的一种数据库,里面包含连接这种数据库的所有信息。
还有一个元素就是
<mappers>
<mapper resource="map/MapUser.xml"></mapper>
<mapper resource="map/MapVisit.xml"></mapper>
</mappers>
这里包含的是映射配置文件的映射信息。
关于sqlsessionfactory和sqlsession的生命周期:
sqlsessionfactory的生命周期是程序级的,一般的程序只有一个factory,程序开始它会建立,程序结束它会消亡。
sqlsession的生命周期是过程级的, 在一个方法中它会建立,方法结束它会销毁。
sqlsession和sqlsessionfactory的建立代码:
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader); //reader是个输入流,这个流就是基本配置的文件路径。
SqlSession session = sqlMapper.openSession();
Map文件:
mybatis的sql和代码之所以能够分开,靠的就是Map文件,Map文件中包含的是全部的sql代码,那么map文件怎么被找到呢,是在基本配置文件中来引用它的,这种引用的方式有三种:
第一种是相对路径引用,把map文件当作一个资源,resource,接的是个路径,也是个包路径也是个目录(图中那个其实类xml就在 包jike.book.map里的jikeUser.xml); 第二种方式是采用绝对路径的一种引用,采用的是java的url技术,这样你的文件可以在文件上,网络等都可以; 第三种路径是采用包路径引用,用的是package。
现在来看看map文件是什么样的,来看一个简单的map文件里的sql语句:
<select id="findById" parameterType="int" resultType="jike.book.pojo.JiKeUser"> select * from JikeUser where id=#{id} </select>
这里我们看到的是一个select语句,这里先是一个select元素来包含这个语句。 元素的主题部分就是我们的select的sql语句,这个语句基本和我们正常的sql语句差不多,但是就是在id=#{id}这不太一样,这里#后面的内容代表的是一个参数,参数的名称叫id。 这里就可以类比jdbc的PreparedStatement接口的那个 ? ,就是先准备一个sql语句,完了往里面填参数。
这里的select元素有三个属性,一个是id属性,这是找到这条sql语句的标志; 还有就是parameterType属性,它的作用是确定这个参数的类型,比如这里是int型; 还有就是resultType属性,它的作用就是确定返回值的类型,可以是map,也可以是java中的基本数据类,也可以是对象。
来看看查询的代码:(首先我们的数据库的表叫JiKeUser,表中有三个四个键,主键id,键name,键password,在Java中也有它的对应的实体类JiKeUser)
(这里顺便科普一下,POJO类就是数据库中表或数据对应的实体类)
JiKeUser temp = session.selectOne("findById",1);//调用session的查询方法,第一个参数是那个sql语句的id,第二个是给sql语句的参数。 System.out.println("name="+temp,getUserName()); session.close();//关闭session
看个完整的例子:
public static void main(String[] args) { String resource = "jike/book/map/MyBatisConfig.xml"; Reader reader = null; SqlSession session =null; try { reader = Resources.getResourceAsReader(resource); } catch(IOException e) { e.printStackTrace(); } SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder.build(reader); session = sqlMapper.openSession(); JiKeUser temp = session.selectOne("findById",1); System.out.println("name="+temp.getUserName()); session.close(); }
原文:http://www.cnblogs.com/wangshen31/p/7719624.html