对MyBites总结,让你快速了解MyBites并且喜欢它。

1.概述,什么是MyBites,作用是什么?

它是一个半自动的ORM框架,可以自定义SQL,所以是半自动。
ORM叫对象关系模型,作用是把数据映射成程序中的POJO(entity),也可以把程序中的对象映射成数据库中的数据行。就不需要程序员编写烦琐的JDBC,可重用。简化工作。
缺点:MyBites的缺点是因为自定义SQL。所以数据库兼容性不好。如果要更改数据库,则要改:驱动,数据库连接字符串(driver,url),还有部分SQL指令。

2.使用步骤:

1.导入MyBites的Jar包,
2.添加主配置文件。文件名建议用:mybatis-config.xml。
3.添加映射文件。
4.创建MyBites的相关API对象。
5.通过这些对象来操作数据。

3.主配置文件的节点

主配置文件常用的节点有:属性文件,自身的配置节点,别名,环境,映射文件配置,节点名是固定的,顺序也是固定的。

<?xml version="1.0" encoding="UTF-8" ?>
      <!-- 如果用到连接池,还可以做连接池的配置,通常不在此处配置,...... -->
      
    </dataSource>
  </environment>
</environments>
<!-- 对映射文件的配置,映射来管理SQL指令 -->	
<mappers>		  
  <!-- 当映射文件与数据访问接口不在同目录下的处理方法 
  <mapper resource="mapping/ProviderDao.xml"/> -->
  <!-- 在同一目录下的方式,通过包来引入 -->
  <package name="cn.smbms.dao.provider"/> 
  <package name="cn.smbms.dao.user"/>
  <package name="cn.smbms.dao.role"/>
  <package name="cn.smbms.dao.bill"/>
</mappers>

4.DTD文件与XSD文

这两种文件都可以来约束xml文件的节点(名称,属性名,顺序,数量,数据类型).
XSD是DTD替代者的原因,一是据将来的条件可扩展,二是比DTD丰富和有用,三是用XML书写,四是支持数据类型,五是支持命名空间。

5.映射文件配置

映射文件的作用是:封装SQL指令,这些指令根据它们的作用写在 insert,update,delete,select顶级元素里面。
Namespace:命名空间,给这个映射文件中的元素做区分。需要与数据持久层接口一致。
Id:每个元素都有一个ID值,这些值与数据持久层接口的方法名一致。
parameterType:此属性表示传递进去的参数,类型是别名,int,string,list,map, 或实体.
resultType:表示指令执行完毕之后的返回类型,如果是对象,则自动封装成实体对象。
resultMap:如果数据行中的列名与对象属性名不一同,则需要resultMap来映射。

<?xml version="1.0" encoding="UTF-8" ?>
	<!-- 外键角色的处理方式, 方法一:表连接查询,一次性查询所有的数据 property:表示把数据封装到哪个属性中进行存储, JavaType:把数据封装成某个实体对象 -->
	<!-- <association property="role" javaType="Role"> <id column="userrole" 
		property="id" /> <result column="roleName" property="roleName" /> </association> -->

	<!-- 外键对象查询的方法二:推荐使用 根据Select中的方法调用,传递Column中的值,返回一个对象存储在Property属性中 -->
	<association property="role" column="userrole"
		select="cn.smbms.dao.role.RoleDao.getRoleById">
	</association>
</resultMap>

<select id="getLoginUser" parameterType="string" resultType="User">
	select * from smbms_user where userCode=#{userCode}
</select>
<select id="search" parameterType="map" resultMap="userMap">
	select * from smbms_user u inner join
	smbms_role r on u.userRole = r.id
	<where>
		<if test="userName!=null">
			and u.userName like #{userName}
		</if>
		<if test="userRole!=null">
			and u.userRole=#{userRole}
		</if>
	</where>
</select>

<select id="getUserList" parameterType="map" resultMap="userMap">
	select *
	from smbms_user u limit #{currentPageNo},#{pageSize}
</select>
<select id="getUserCount" resultType="int">
	select count(1) as count
	from smbms_user u,smbms_role r where u.userRole =
	r.id
</select>
<select id="getUserById" parameterType="string" resultType="User">
	select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r
	where u.id=#{id} and u.userRole = r.id
</select>
<insert id="add" parameterType="User">
	insert into smbms_user
	(userCode,userName,userPassword,
	userRole,gender,birthday,phone,address,creationDate,createdBy)
	values(#{userCode},#{userName},#{userPassword},#{role.id}
	,#{gender},#{birthday},#{phone},#{address},#{creationDate},#{createdBy})
</insert>
<delete id="deleteUserById" parameterType="int">
	delete from smbms_user
	where id=#{delId}
</delete>
<update id="modify" parameterType="User">
	<!--  原来的修改SQL语句,替换成了动态SQL
	update smbms_user set userName=#{userName},
	gender=#{gender},birthday=#{birthday},phone=#{phone},
	address=#{address},userRole=#{user.id},modifyBy=#{modifyBy},
	modifyDate=#{modifyDate} where id = #{id} -->

	update smbms_user
	<set>
		<if test="userName!=null">
			userName=#{userName},
		</if>
		<if test="gender!=null">
			gender=#{gender},
		</if>
		<if test="birthday!=null">
			birthday=#{birthday},
		</if>
		<if test="phone!=null">
			phone=#{phone},
		</if>
		<if test="address!=null">
			address=#{address},
		</if>
		<if test="userRole!=null">
			userRole=#{user.id},
		</if>
		<if test="modifyBy!=null">
			modifyBy=#{modifyBy},
		</if>
		<if test="modifyDate!=null">
			modifyDate=#{modifyDate},
		</if>
	</set>
	where id = #{id}
</update>
<update id="updatePwd">
	update smbms_user set userPassword= #{pwd} where id =
	#{id}
</update> <!-- 1,2,7,8 -->
<delete id="deleteAll" parameterType="list">
  delete from smbms_user where id in (1,2,7,8)
  <foreach collection="list" open="(" close=")" 
       separator="," item="i">
    #{i}
  </foreach>	  
</delete>

6.相关API

SqlSessionFactoryBuild对象:此对象会根据主配置文件的流来创建SqlSessionFactory工厂对象。它只需要加载一次就行了。
SqlSessionFactory:此对象可以创建SqlSession对象。因为是工厂,在应用程序中只需要一个就行,所以,我们把做成单例模式。
SqlSession:此对象是一个会话对象,类似于Servlet中的Session内置对象。是一个连接,它的作用就是操作数据了。注意,此对象占资源,必须在操作结束后关闭此对象。数据操作时,查询不需要提交事务,而增,删,改必须提交事务 : sqlSession.commit();
这些对象太多的地方需要使用,所有把它们写在一个工具类中。
package cn.smbms.tools;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**

  • MyBatis的工具类,用于创建MyBatis相关的API SqlSessionFactory对象

  • @author Administrator *
    /
    public class MybatisUtil {
    static SqlSessionFactory factory = null;
    /
    *

    • 懒汉式单例模式,用于创建SqlSessionFactory工厂对象,单例模式。
      *目前这种写法还有线程同步的缺陷,后期再来处理。
      */
      private static SqlSessionFactory getSessionFactory() {
      if (factory == null) {
      try {
      // 把主配置文件形成一个输入流
      InputStream is = Resources.getResourceAsStream(“config/mybatis-config.xml”);
      // 创建工厂
      factory = new SqlSessionFactoryBuilder().build(is);
      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      return factory;
      }

    // 返回一个会话对象
    public static SqlSession getSqlSession() {
    return getSessionFactory().openSession();
    }
    }

业务层处理操作数据:
@Override
public boolean deleteUserById(Integer delId) {
//调用工具类获取会话对象。
SqlSession session = MybatisUtil.getSqlSession();
boolean flag = false;
try {
//getMapper表示创建此接口的代理对象,代理对象的创建采用了反射机制。
//对象存储在父类的类型中,运用里氏替换原则。
UserDao dao = session.getMapper(UserDao.class);
//调用代理的对象的方法时,则自动找到映射文件对应的元素。
if(dao.deleteUserById(delId) > 0)
flag = true;
session.commit(); //增,删,改 必须提交事务
} catch (Exception e) {
e.printStackTrace();
}finally{
session.close();//关闭会话,释放资源。
}
return flag;
}

7.动态SQL

动态SQL是MyBites最强大的地方,可以简化复杂的SQL指令的拼接工作。
If :如果条件,则把里面的SQL指令拼接外部的SQL指令中。
Where:会自动在SQL上添加where关键字,并去掉最前面的多余的and或or。
Set:用于修改的语句上,自动加上set关键字,并把最后多余的逗号去掉。
Trim
Foreach:当传入的参数是list时,则用它把list中的元素一个个迭代出来,拼接到SQL指令中,通常用于in这种模糊查询中。
Choose -> when ->otherwise:如果只有一个when,则表示一个if->else结构块,如果有多个,则是一个多重if结构块。
这些与JSTL中的标签使用方式非常类似。

8.缓存

MyBites中有一级缓存和二级缓存。
一级缓存是基于SQLSession 级别,默认已经开启。
二级缓存是超出 SqlSession级别,需要在settings配置添加配置,并在映射文件中添加,
并且要求缓存的对象必须要可以序列化。
public class Role implements Serializable

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值