对比:hibernate
hibernate
:sql语句自动生成,对SQL语句优化困难,需求变化不多
//离线方式查询 DetachedCriteria criteria=DetachedCriteria.forClass(AboutUs.class); return this.getHibernateTemplate().findByCriteria(criteria);
hibernate 的xml文件 根据表间关系进行一对一、一对多等的映射,单独一个文件
mybatis
:专注sql本身,自己编写SQL语句、修改、优化方便,不完全的ORM框架,可以实现(输入、输出)映射,需求变化比较多
//上面各种表字段和类属性,表间关系配置完(类 hibernate中的xml文件) 下面SQL语句 <select id="findOrdersUser" resultType="cn.itcast.mybatis.po.OrdersCustom"> SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id </select>
Dao:
mapper.xml实现:
根据xml文件写mapper.java (接口) 方法
xml文件中namespace等于mapper接口地址(class全路径 )
别名:配置文件中
<typeAliases>
<!-- 单个别名定义:type:类型路径 alias:别名 在xml中可以使用 -->
<typeAliases type="cn.itcast.mybatis.po.User" alias="user"/>
<!--mybatis 自动根据类名定义别名-->
<package name="cn.itcast.mybatis.po.User" />
</typeAliases>
类型处理器:TypeHandlers
java类 jdbc类转换
映射:
一对一:
resultType
扩展类:*Custom extend ***
resultMap
类中添加类属性,mapper.xml,高级映射,
一对多
比一类似 1 类中引用List<**> 2 .xml中用<collection> 3、继承:extends之后重复信息直接复用:extends=“ id ” 4 SQL语句变动
多对多:
多个表信息,resultType for循环——list
延迟加载:
按需查询
单表查询、需要时从关联表去关联查询——性能
resultMap:collection、association——延迟加载
使用association中的select指定延迟加载去执行的statement的id
<!-- 延迟加载的resultMap --> <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap"> <!--对订单信息进行映射配置 --> ……………… <!-- 实现对用户信息进行延迟加载 select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement) 要使用userMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询,如果findUserById不在本mapper中需要前边加namespace column:订单信息中关联用户信息查询的列,是user_id 关联查询的sql理解为: SELECT orders.*, (SELECT username FROM USER WHERE orders.user_id = user.id)username, (SELECT sex FROM USER WHERE orders.user_id = user.id)sex FROM orders --> <association property="user" javaType="cn.itcast.mybatis.po.User" select="cn.itcast.mybatis.mapper.UserMapper.findUserById" column="user_id"> <!-- 实现对用户信息进行延迟加载 --> </association> </resultMap>