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>
<?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 块来关闭它。