简单介绍MyBatis框架技术
MyBatis前身是iBatis,本是Apache的一个开源的项目 官方网站 http://mybatis.org
框架技术 是一个应用程序的半成品 提供可重用的公共结构 按一定规则组织的一组组件 分析优势 不用再考虑公共问题 专心在业务实现上 结构统一,易于学习、维护 新手也可写出好程序 半自动化的ORM实现 DAO层 动态SQL 小巧灵活、简单易学
优点与JDBC相比,减少了50%以上的代码量 最简单的持久化框架,小巧并简单易学 SQL代码从程序代码中彻底分离,可重用 提供XML标签,支持编写动态SQL 提供映射标签,支持对象与数据库的ORM字段映射
持久化与ORM
持久化是程序数据在瞬时状态和持久状态间转换的过程
ORM(Object Relational Mapping) 编写程序的时候,以面向对象的方式处理数据 保存数据的时候,却以关系型数据库的方式存储 ORM解决方案包含下面四个部分 在持久化对象上执行基本的增、删、改、查操作 对持久化对象提供一种查询语言或者API 对象关系映射工具 提供与事务对象交互、执行检查、延迟加载以及其他优化功能
一个简单的MyBatis搭建框架 如图
完整的包名有四块 com.hhb.kk.entity
- com.为域名 com是什么?
- hhb.一般为公司名称
- k k.编写的项目名称
- entity.包的用途名称
包名为什么这么长是因为它是有规范的以上规范当然也可以随意起名就如变量名一样只是为了方便记忆
MyBatis的核心对象
-
SqlSessionFactoryBuilder
用过即丢,其生命周期只存在于方法体内 可重用其来创建多个 SqlSessionFactory 实例 负责构建SqlSessionFactory,并提供多个build方法的重载
-
SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心 作用:创建SqlSession实例 作用域:Application 生命周期与应用的生命周期相同 单例 存在于整个应用运行时,并且同时只存在一个对象实例
-
SqlSession
包含了执行SQL所需的所有方法 对应一次数据库会话,会话结束必须关闭 线程级别,不能共享
在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建
SqlSessionFactory的创建代码如下
private static SqlSessionFactory factory;
static{
try {
Reader re=Resources.getResourceAsReader("mybatis-config.xml");
factory=new SqlSessionFactoryBuilder().build(re);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public SqlSession open(){
return factory.openSession(true);
}
public void close(SqlSession sqlSession){
if(null!=sqlSession){
sqlSession.close();
}
}
-
mybatis-config.xml 系统核心配置文件
configuration 配置
properties 可以配置在Java 属性配置文件中
settings 修改 MyBatis 在运行时的行为方式
typeAliases 为 Java 类型命名一个别名(简称)
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
mappers 映射器
mybatis-config.xml的配置文件图
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 通过这个配置文件完成mybatis与数据库的连接 -->
<configuration>
<settings>
<!--
分别是:
打印执行的SQL语句跟踪
自动映射对应的列
二级缓冲
-->
<setting name="logImpl" value="LOG4J"/>
<setting name="autoMappingBehavior" value="FULL"/>
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 把前面的域名可以省略 -->
<typeAliases>
<package name="com.hhb.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<!--配置事务管理,采用JDBC的事务管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/smbms?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="ok"/>
</dataSource>
</environment>
</environments>
<!-- 将mapper文件加入到配置文件中 -->
<mappers>
<mapper resource="UserMapper.xml"/>
<mapper resource="RoleMapper.xml"/>
</mappers>
</configuration>
-
mapper.xml SQL映射文件
-
简单的说就是JDBC层写SQL语句的地方
-
具体解释要在MyBatis入门二
一个简单的Mapper.xml映射文件
里面有所学的模糊查询以及增改查
<?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.hhb.dao.UserMapper">
<!-- <select id="getUser" resultType="User">
select * from smbms_user where 1=1
<if test="userCode !=null or userCode!=''">
and userCode like concat('%',#{userCode},'%')
</if>
<if test="userName !=null or userName!=''">
and userName like concat('%',#{userName},'%')
</if>
</select> -->
<resultMap type="User" id="cha">
<association property="role" javaType="Role">
<result property="roleCode" column="roleCode"/>
<result property="roleName" column="roleName"/>
</association>
</resultMap>
<select id="getUser" parameterType="User" resultMap="cha">
SELECT u.*,s.* FROM smbms_user u,smbms_role s
<where>
<if test="userCode !=null or userCode!=''">
and u.userCode like concat('%',#{userCode},'%')
</if>
<if test="userName !=null or userName!=''">
and u.userName like concat('%',#{userName},'%')
</if>
</where>
and u.`userRole`=s.id
</select>
<update id="upda" parameterType="User">
update smbms_User
<set>
<if test="userCode !=null or userCode!=''">
userCode=#{userCode},
</if>
<if test="userName !=null or userName!=''">
userName=#{userName},
</if>
<if test="address !=null or address!=''">
address=#{address},
</if>
</set>
where id=#{id}
</update>
<select id="getUserName" resultType="User" parameterType="java.util.List">
select * from smbms_user where userCode in
<foreach collection="list" open="(" close=")" item="userCode" separator=",">
#{userCode}
</foreach>
</select>
<select id="getByUsers" resultType="User">
select * from smbms_user limit #{currpage},#{pagesize}
</select>
</mapper>