Mybatis介绍
参考自极客视频还有博客:http://blog.csdn.net/zxc_helloworld/article/details/78037284
这是个开源的持久层框架。有几个特点:第一个是轻;第二个是将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配置文件(MyBatis的开发中一般一个表设一个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文件怎么被找到呢,是在基本配置文件中来引用它的,这种引用的方式有三种:
mappers>用来在mybatis初始化的时候,告诉mybatis需要引入哪些Mapper映射文件。
在<mappers>中有两个子元素 1.<package> 2.<mapper>
1.第一种配置映射文件的方式
<package name="映射文件所在包名">
注意:这种方式必须保证接口名(例如IUserDao)和xml名(IUserDao.xml)相同,还必须在同一个包中。
<package name="cn.sdut.dao"/>
2.第二种方式:<mapper resource="">
这种方式不用保证同接口同包同名。例如:<mapper resource="cn/sdut/pojo/PersonMapper.xml"/>
3.第三种方式:<mapper url="文件路径名">
这种方式我所了解的就是这样用:
<mapper url="file:E:/Study/myeclipse/_03_Test/src/cn/sdut/pojo/PersonMapper.xml"/>
采用的是java的url技术,这样你的文件可以在文件上,网络等都可以
4.第四种方式:<mapper class="接口路径">
这种方式和第一种方式要求一致,保证接口名(例如IUserDao)和xml名(IUserDao.xml)相同,还必须在同一个包中。例如:<mapper class="cn.sdut.dao.IPersonDao"/>
但是对于接口方法使用注解方式来说,使用这种方式没有xml文件都可以,更别提同包同名什么的限制条件了。
现在来看看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(); }