Mybatis

  2019-6-19 


项目中,DAO是用mybatis来处理mysql数据库访问的,总结一下

思想

mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程

mybatis通过xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

ORM(Object Relation Mapping)对象关系映射:把数据库表和实体类的属性一一对应起来,使我们操作实体类即可操作数据库表

mybatis是mysql的ORM

Mybatis原理

参考链接:

【】mybatis工作原理https://blog.csdn.net/u014745069/article/details/80788127

【】Mybatis的sqlsession是如何做到线程隔离的:https://www.cnblogs.com/yougewe/p/10072740.html

Mybatis的SQLSession工具类使用ThreadLocal来对线程中的Session来进行管理

环境搭建(映射关系的XML配置)

  1. 导入

  2. 创建DAO接口和实体类(访问数据库的类)

  3. 创建Mybatis的主配置xml文件

    <configuration>里写上数据库环境、数据源、数据库配置信息、事务类型等

    主配置文件中要写上mapper映射配置xml文件

    <mappers>
    	<mapper resource="com.aisaka.myDaoMapper.xml"></mapper>
    </mappers>
  4. 创建映射配置xml文件

    注意:①mybatis的映射配置文件必须为之和dao接口的包结构相同

    ②映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名

    ③映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名

    遵循了这三点,以后开发中就无须在写dao的实现类(mybatis实现)

环境搭建(映射关系的注解配置)

  1. 导入

  2. 创建DAO接口和实体类(访问数据库的类)

  3. 创建Mybatis的主配置xml文件

    <configuration>里写上数据库环境、数据源、数据库配置信息、事务类型等

    主配置文件中使用class属性指定被注解的DAO接口全限定类名

    <mappers>
    	<mapper class="com.aisaka.myDao"></mapper>
    </mappers>
  4. 直接在DAO接口的方法中进行注解配置

    public interface myDao{
        //为DAO接口方法直接写Select注解,内容为sql语句
        @Select("select * from user")
        List<myObj> findAll();
    }

    不需要指定封装对象等东西了,很方便

环境搭建(Gradel导入Mybatis)

用mybatis-generator

https://blog.csdn.net/qq_36666651/article/details/79560228

然后就直接在gradel.build里的task里加载mybatis的配置文件(InputStream)

使用(No Spring)

  1. 读取配置文件到InputStream中

    InputStream in = Resources.getResourceAsStream("Mybatis主配置文件.xml");

  2. 根据配置文件和SqlSessionFactoryBuilder ,创建SqlSessionFactory工厂

    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

    SqlSessionFactory factory = builder.build(in);

  3. 使用工厂生产SqlSession对象

    SqlSession session = factory.openSession();

  4. 使用SqlSession创建Dao接口的代理对象

    MyDaoInterface MyDao = session.getMapper(MyDaoInterface.class);

    MyDaoInterface是我定义的DAO的接口,MyDao即为Mybatis帮我们创建的DAO代理对象

  5. 执行Dao代理对象的方法

    List<resObj> = myDao.findAll()返回查询结果

    findAll()是在mapper中定义的数据库操作方法,其中定义了具体的查询语句返回对象类型的全限定包名

    resObj即为数据库操作的返回值封装到的对象

  6. 释放资源

    session.close();

    in.close();

(注意,也可以自己写DAO实现类,这样就不用mybatis为我们创建代理对象,而是我们自己搞,但这样就比较复杂了。因为mybatis是自动用我们写的DAO接口和mapper中的方法对应的sql语句,给我们创建了DAO代理对象)

Spring整合Mybatis:mybatis-spring

mybatis-spring包:在 mybatis-spring 中 SqlSessionFactory 的创建交给了 SqlSessionFactoryBean

由 Spring 最终创建的 bean 不是 SqlSessionFactoryBean 本身,而是工厂类的 getObject()返回的方法的结果。也就是说,我们可以直接将与数据库操作的mapper类注入DAO

在Spring主配置文件中配置SqlSessionFactoryBean和MapperScannerConfigurer:

<!-- 这和mybatis无关,只是mybatis为我们生成的mapper实体类要注入这些提供给service业务层的实体类中-->
<context:component-scan base-package="com.appsec.system.persistence.mybatis.xdao">
    
<!-- 这和mybatis无关,配置数据源,数据源的内容可以单独写在db.propertipes里 -->    
<bean name="dataSource" class="org.apache.commons.dbcp.BasicDataSource" init-method="init" destroy-method="close">
	<property name="url" value="jdbc:mysql://localhost:3306/xx"></property>
	<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
	<property name="username" value="root"></property>
	<property name="password" value="1234"></property>
    <!--由于使用第三方的dbcp连接池获得DataSource,要写下这些连接池配置-->
    <property name="maxIdle" value="30"></property>  
    <property name="maxWait" value="10"></property>  
    <property name="defaultAutoCommit" value="false"></property> 
</bean>    
    
<!-- 配置 SqlSessionFactoryBean ,Spring为我们自动获取SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource" />
    <!-- mybatis 配置文件位置(默认配置的话,可以不用)-->
    <property name="configLocation" value="classpath:conf/mybatis/mybatis-config.xml"></bean>
    
<!-- DAO接口所在包名(映射接口扫描包),Spring会自动查找其下的DAO接口并创建mapper对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<property name="basePackage" value="com.appsec.system.persistence.mybatis.mapper" />
    <!-- 这里的需要配置sqlSessionFactoryBean属性,就是前面配置的那个,Spring为我们用它来自动获取sqlSession对象 -->
	<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>

然后就可以把mapper(DAO的数据库直接操作接口)写在com.appsec.system.persistence.mybatis.mapper目录下,然后在com.appsec.system.persistence.mybatis.xdao目录下,直接用@Autowired将mapper目录下的mapper注入进xdao的实体类里啦!这些实体类就提供给service层直接访问(在这些实体类中,可以加各种控制,比如数据校验等等,数据再处理等等)

mybatis工作流程

通过Reader对象读取Mybatis映射文件
通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象
获取当前线程的SQLSession
事务默认开启
通过SQLSession读取映射文件中的操作编号,从而读取SQL语句
提交事务
关闭资源

sqlsession用mapper接口生成mapper动态代理对象,再调用该对象对应的方法完成sql语句执行

Mybatis事务管理

mybatis可以不进行事务管理,直接用spring事务管理

也可以用mabatis的事务管理:https://blog.csdn.net/andamajing/article/details/72026693

几个注解

@result:在使用mybatis注解开发的时候,数据库返回的结果集和实体类字段不对应,我们就需要手动指定映射关系

@SelectProvider:可以不直接@Select(SQL语句),而是右Provider来提供SQL语句,做到SQL语句与DAO的分离

https://blog.csdn.net/qq_38353578/article/details/72621783

如果方法有@Param参数,那Provider指定的类的方法就要用Map来接受Param

@Param 用来在DAO层中声明方法参数

即select等语句注释某方法,该方法传入一个参数如@Param(“thisA”) int a,那么就可以在注释的sql语句中用${thisA}来将这个参数放入SQL语句里

3306mysql的默认端口


且听风吟