myibats知识理解

本文详细介绍了MyBatis框架的基本概念、核心组件、基本SQL文件编写方式,包括如何通过XML配置文件和注解进行配置、映射实体类与数据库表,以及如何与Spring框架无缝集成,利用SqlSessionTemplate简化数据库操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.MyBatis是一个支持普通SQL查询、存储过程和高级映射的优秀的持久层框架,它消除了几乎所有的JDBC代 码、对参数的手工设置以及对结果集繁琐的处理,使用简单的XML或注解(annotation)用于配置和映射,将接口和POJO(Plain Old Java Object)映射成数据库中的记录。
2.mybatis以一个SqlSessionFactory对象的实例为核心,SqlSessionFactory对象可以通过 SqlSessionFactoryBuilder对象来获得,SqlSessionFactoryBuilder可以根据XML配置文件创建出 SqlSessionFactory对象。
3.基本的sql文件:
<?xmlversion="1.0"encoding="UTF-8"?> 
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 
   
<mappernamespace="com.lovo.dao.UserDao"
    
<     resultMaptype="User"id="User"
        <idproperty="id"column="id"/> 
        <resultproperty="content"column="content"/> 
        <resultproperty="pubdate"column="pubdate"/> 
        <associationproperty="user"javaType="User"
            <idproperty="username"column="username"/> 
            <resultproperty="email"column="email"/> 
        </association
    </resultMap
    <selectid="findByUsername"parameterType="String"resultType="User"
        select * from tb_user where username=#{username} 
    </select
       
    <selectid="findAll"resultType="User"
        select * from tb_user 
    </select
       
    <insertid="save"parameterType="User"keyProperty="username"
        insert into tb_user (username, password, email) values (#{username}, #{password}, #{email}) 
    </insert
     
<!-- 这个批量删除数据    -->
    <delete id="bathDelete" parameterType="java.util.List">
        delete from tb_user where id in
        <foreach collection="list" index="index" item="l" open="(" close=")" separator=",">
            #{l}
        </foreach>
    </delete>
     
 <!-- 有选择性的修改数据  -->(使用条件判断)
    <update id="updateSet" parameterType="com.test.entity.User">
        update tb_user 
        <set>
            <if test="name != null">
                name=#{name},
            </if>
            <if test="address !=null ">
                address=#{address},
            </if>
            <if test="createTime !=null ">
                create_time=#{createTime}
            </if>
        </set>
        where id=#{id}
    </update>

<!-- 分页功能 -->

  <select id="getUserArticles" parameterType="Your_params" resultMap="resultUserArticleList">

              select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article

              where user.id=article.userid and user.id=#{id} limit #{offset},#{pagesize}

       </select>


</mapper>

4.需要指出的是 SqlSessionFactoryBuilder类的对象一旦创建出SqlSessionFactory后就没有用了,可以被丢弃;而 SqlSessionFactory对象一旦被创建,应该在整个应用程序执行期间都是存在的,最好是做成被其他程序共享的单例。对于 SqlSession,每 个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,因为它是线程不安全的,它的最佳作用范围是请求或方法范围。绝 对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中,也绝不能SqlSession实例的引用放在任何类型的管理范围中。

5.MyBatis支持声明式数据缓存(declarative data caching)。当一条SQL语句被标记为“可缓存”后,首次执行它时从数据库获取的所有数据会被存储在一段高速缓存中,今后执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库。MyBatis提供了默认下基于Java HashMap的缓存实现。MyBatis一级缓存,一级缓存的作用域scope是SqlSession。MyBatis同时还提供了一种全局作用域global scope的缓存,这也叫做二级缓存,也称作全局缓存。在同个SqlSession中,查询语句相同的sql会被缓存,但是一旦执行新增或更新或删除操作,缓存就会被清除。

6.orm工具基本思想: 从配置文件(通常是XML配置文件中)得到 sessionfactory.由sessionfactory 产生 session,在session 中完成对数据的增删改查和事务提交等.在用完之后关闭session 。在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。

7.MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。MyBatis的自身判断是把查询的field或其对应的别名与返回对象的属性进行比较,如果相匹配且类型也相匹配,MyBatis则会对其进行赋值。

8.spring与myibats融合
1)采用接口org.apache.ibatis.session.SqlSession的实现类org.mybatis.spring.SqlSessionTemplate。
mybatis中, sessionFactory可由SqlSessionFactoryBuilder.来创建。MyBatis-Spring 中,使用了SqlSessionFactoryBean来替代。
SqlSessionFactoryBean有一个必须属性dataSource,另外其还有一个通用属性configLocation(用来指定mybatis的xml配置文件路径)。
<!-- 创建SqlSessionFactory,同时指定数据源-->  
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">     
 <property name="dataSource" ref="dataSource" />     
 <!-- 指定sqlMapConfig总配置文件,订制的environment在spring容器中不在生效-->   
 <property  name="configLocation"  value="classpath:sqlMapConfig.xml"/>   
 <!--指定实体类映射文件,可以指定同时指定某一包以及子包下面的所有配置文件,mapperLocations和configLocation有一个即可,当需要为实体类指定别名时,可指定configLocation属性,再在mybatis总配置文件中采用mapper引入实体类映射文件 -->  
  <!- - <property  name="mapperLocations"  value="classpath*:com/xxt/ibatis/dbcp/**/*.xml"/>  -->
 <bean>
mybatis总配置文件sqlMapConfig.xml:
<configuration>    
 <typeAliases>     
  <typeAlias type="com.xxt.ibatis.dbcp.domain.User" alias="User" />   
 </typeAliases>     
<mappers>      
  <mapper resource="com/xxt/ibatis/dbcp/domain/user.map.xml" />      
 </mappers>  
 </configuration> 
实体类映射文件user.map.xml,包含具体的sql语句。

2)采用抽象类org.mybatis.spring.support.SqlSessionDaoSupport提供SqlSession。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">      
 <property name="dataSource" ref="dataSource" />     
 <property  name="configLocation"  value="classpath:sqlMapConfig.xml"/>     
 <!-- <property  name="mapperLocations"  value="classpath*:com/xxt/ibatis/dbcp/domain/user.map.xml"/   >  -->   
</bean>    
  <bean id="sqlSession"     class="org.mybatis.spring.SqlSessionTemplate">         
 <constructor-arg index="0" ref="sqlSessionFactory" />   
 </bean>    
 <bean id="userDaoImpl3" class="com.xxt.ibatis.dbcp.dao.impl.UserDaoImpl3">     
 <!--注入SqlSessionTemplate实例 -->      
<property name="sqlSessionTemplate" ref="sqlSession" />     
  <!--也可直接注入SqlSessionFactory实例,二者都指定时,SqlSessionFactory失效 -->     
 <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" />    -->  
 </bean>  
 
public class UserDaoImpl3 extends SqlSessionDaoSupport implements UserDao {  
   public User getUserById(User user) {     
   return (User) getSqlSession().selectOne("com.xxt.ibatis.dbcp.domain.User.getUser", user);     
  }  














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值