Mybatis初学笔记

MyBatis环境搭建:
1.需要mybatis-3.3.0.jar,将该jar包导入web工程的libs文件夹中;
2.在src下新建一个mybatis-config.xml文件,mybatis的基本配置就在这里面完成。
简单介绍Mybatis:
MyBatis作为持久层框架,其主要思想是将程序中的大量sql语句剥离出来,配置在配置文件中,实现sql的灵活配置。

这样做的好处是将sql与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改sql。
顺便提提Hibernate:
对于hibernate框架来说,他极大的方便了我们编程人员,大多数不需要手动写sql,它直接给我们提供了完整的dao。
也就是MyBatis是把实体类和sql语句之间建立了映射关系,而Hibernate在实体类和数据库之间建立了映射关系。
昨天去面试了,面试官也问到了Hibernate与Mybatis的区别,至于他们的区别,网上很多,自己看,我就不赘述了。

MyBatis的工作:
根据 JDBC 规范建立与数据库的连接;
通过Annotaion/XML+JAVA反射技术,实现 Java 对象与关系数据库之间相互转化。

MyBatis 核心XML配置文件:

configuration 配置
  properties 属性
  settings 设置
  typeAliases 类型命名
  typeHandlers 类型处理器
  objectFactory 对象工厂
  plugins 插件
  environments 环境
  environment 环境变量
  transactionManager 事务管理器
  dataSource 数据源
  databaseIdProvider  如果配置了 databaseIdProvider,MyBatis 会加载所有的不带 databaseId 或匹配当前     

databaseId 的语句;如果带或者不带的语句都有,则不带的会被忽略。新增,修改和删除都有这个属性。    例

如MySQL的获取系统时间函数 NOW() 和Oracle的获取系统时间to_char(sysdate,’yyyy-mm-dd     hh24:mi:ss

’) 是不同的。那么我们可以针对同一个修改可以写两个update语句,他们的databaseId属性不    一样。
 mappers 映射器
<mappers>
        <mapper resource="加载其他的mapper xml文件资源" />
</mappers>

这些语句简单告诉了 MyBatis 去哪里找映射文件
settings :

typeAliases:

environments:

以一个配置数据库环境的为例

<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED"> 
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mydb" />
				<property name="username" value="root" />
				<property name="password" value="java" />
			</dataSource>
		</environment>
</environments>
•一个很重要的问题要记得:可以配置多种环境,但只能为每个 SqlSessionFactory 实例选择一个。也就是说每个数据库对应一个 SqlSessionFactory
• dataSource 元素使用基本的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
•有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
POOLED:使用数据库连接池。
UNPOOLED:这个数据源的实现是每次被请求时简单打开和关闭连接。
 
接下来介绍Mybatis Mapper xml文件:
在这个文件中主要包含了:
  cache -  配置给定命名空间的缓存。
  cache-ref –  从其他命名空间引用缓存配置。
  resultMap  –  最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。
  parameterMap  –  已经被废弃了!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除。
  sql –  可以重用的 SQL 块,也可以被其他语句引用。
  insert –  映射插入语句
  update –  映射更新语句
  delete –  映射删除语句
  select –  映射查询语句
例如下面的代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper  namespace="com.mapper.IStudentMapper">
	<!-- 编写clazz的返回结果映射类型 -->
	<resultMap type="com.bean.Clazz" id="clazzResultMap">
		<id  property="cid" column="cid"></id>	
		<result  property="cname" column="cname"></result>    
	    <!-- 1对多关联 -->
	    <collection property="students" column="cid"
	        ofType="com.bean.Student" select="findByClassId"
	    >
	    </collection>
	</resultMap>
	
	<!-- Student返回类型映射声明 -->
	<resultMap type="com.bean.Student" id="studentResultMap">
	    <id property="sid"  column="sid"></id>
	    <result  property="sname" column="sname"></result> 	
	    <result  property="sex" column="sex"></result> 	
	    <result  property="address" column="address"></result> 	
	    <result  property="birthday" column="birthday"></result> 	
	    <!-- 多对一关联 -->
	    <association property="clazz" javaType="com.bean.Clazz" column="classid"
	         select="selectClazz"></association>		    
	</resultMap>
	
	<insert id="save" parameterType="com.bean.Student">
	    insert into student(sname,sex,address,birthday,classid) values(#{sname},#{sex},#{address},#{birthday},#{clazz.cid})
	</insert>
	
	<update id="update" parameterType="com.bean.Student">
	    update student 
	    <set>
	        <if test="sname!=null">sname=#{sname},</if>
	        <if test="sex!=null">sex=#{sex},</if>
	        <if test="address!=null">address=#{address},</if>
	        <if test="birthday!=null">birthday=#{birthday}</if>	        
	        <if test="classid!=null">classid=#{clazz.cid}</if>	        
	    </set>
	    where sid=#{sid}
	</update>
	
	<delete id="delById" parameterType="java.lang.Integer">
	    delete from student where sid=#{sid}
	</delete>
	
	<select id="findById" parameterType="java.lang.Integer" resultType="com.bean.Student">
		select * from student where sid=#{aid} 
	</select>
	<select id="selectClazz" parameterType="java.lang.Integer" resultType="com.bean.Clazz">
		select * from clazz where cid=#{cid} 
	</select>
	<select id="findByClassId" parameterType="java.lang.Integer" resultType="com.bean.Student">
		select * from student where classid=#{cid} 
	</select>
	
	<select id="findAll" parameterType="java.lang.Integer" resultMap="studentResultMap">
		select * from student where 1=1 order by sid
	</select>
</mapper>

然后在介绍Mybatis的核心对象:

每 一 个 MyBatis 的 应 用 程 序 都 以 一 个 SqlSessionFactory 对 象 的 实 例 为 核 心 。

SqlSessionFactory 对 象 的 实 例 可 以 通 过 SqlSessionFactoryBuilder 对 象 来 获 得 。
//获取资源文件的流
InputStream in=Resources.getResourceAsStream("mybatis-config.xml");
            
//获取SqlSessionFactory
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
一旦被创建,SqlSessionFactory 应该在你的应用执行期间都存在。没有理由来处理或重 新创建它。 使用

SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次。 这样的 操作将被视为是非常糟糕的。 因此

SqlSessionFactory 的最佳范围是应用范围。 有很多方法可 以做到, 最简单的就是使用单例模式或者静态单例模式。


//SqlSessionFactoryBuilder类:
这个类可以被实例化,使用和丢弃。一旦你创建了 SqlSessionFactory 后,这个类就不需 要存在了。 因此

SqlSessionFactoryBuilder 实例的最佳范围是方法范围 (也就是本地方法变量)。 你可以重用

SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例。

//获取sqlSession
SqlSession session=sqlSessionFactory.openSession();

SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的 方法。你可以用 SqlSession 实例来直接执行已

映射的 SQL 语句  
SqlSession 的实例不能被共享,也是线程 不安全的。因此最佳的范围是请求或方法范围。
关闭 SqlSession很重要,你应该确保使 用 finally 块来关闭它。

 
 

 

posted @ 2017-05-16 16:10  懒得烧蛇吃  阅读(186)  评论(0编辑  收藏  举报