美文网首页
SpringMyBatis解析1-使用示例

SpringMyBatis解析1-使用示例

作者: 小陈阿飞 | 来源:发表于2018-12-07 17:11 被阅读7次

MyBatis使用介绍

建立DO OrderDO 、User

public class OrderDO {

    private Integer id;
    private Integer user_id;
    private String number;
    private Date createtime;
    private String note;
    //用户信息,新增了一个User属性,为了保存查询得到的关联的User表的信息(一对一)
    private User user;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getUser_id() {
        return user_id;
    }
    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }
    public String getNumber() {
        return number;
    }
    public void setNumber(String number) {
        this.number = number;
    }
    public Date getCreatetime() {
        return createtime;
    }
    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }
    public String getNote() {
        return note;
    }
    public void setNote(String note) {
        this.note = note;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

User

public class User {

    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

建立Mapper
mapper是数据库操作的映射文件,也就是我们常说的dao文件。

public interface OrderDao {

    List<OrderDO> findOrdersUserLazyLoading();
}

建立映射文件

<?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="price.dao.OrderDao">
    <resultMap type="price.entity.OrderDO" id="OrdersUserLazyLoadingResultMap">
        <id column="id" property="id"/>
        <result column="user_id" property="user_id"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>

        <association property="user" javaType="price.entity.User"
                     select="finduserByid" column="user_id" fetchType="lazy"
        >
        </association>
    </resultMap>
    <select id="finduserByid" parameterType="int" resultType="price.entity.User">
         SELECT * FROM USER WHERE ID=#{id}
     </select>

    <select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
          Select * from orders
      </select>
</mapper>

建立配置文件

配置文件主要用于程序中可变性高的设置,Mybatis的配置文件主要存在于configuration.xml中,当然configuration.xml中省略了其他mybatis的配置,例如settings里面的配置等等。
configuration:根元素。
properties:定义配置外在化。
settings:一些全局性的配置。
typeAliases:为一些类定义别名。
typeHandlers:定义类型处理,也就是定义Java类型与数据库中的数据类型之间的转换关系。
objectFactory:用于指定结果集对象的实例是如何创建的。
plugins:MyBatis的插件,插件可以修改MyBatis内部的运行规则。
environments:环境。
environment:配置MyBatis的环境。
transactionManager:事务管理器。
dataSource:数据源。

<?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">
<configuration>
    <!-- 全局参数 -->
    <settings>
        <!-- 使全局的映射器启用或禁用缓存。 -->
        <setting name="cacheEnabled" value="true"/>
        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
        <setting name="aggressiveLazyLoading" value="false"/>
        <setting name="lazyLoadTriggerMethods" value=""/>
        <!-- 是否允许单条sql 返回多个数据集 (取决于驱动的兼容性) default:true -->
        <setting name="multipleResultSetsEnabled" value="true"/>
        <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false -->
        <setting name="useGeneratedKeys" value="false"/>
        <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分 FULL:全部 -->
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        <!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) -->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!-- 使用驼峰命名法转换字段。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->
        <setting name="localCacheScope" value="SESSION"/>
        <!-- 设置当JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->
        <setting name="jdbcTypeForNull" value="NULL"/>
        <!--设定Mapper文件SQL打印日志前缀-->
        <setting name="logPrefix" value="mapper."/>
        <setting name="logImpl" value="SLF4J"/>
    </settings>
    <plugins>
</configuration>

建立spring 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:annotation-config/>
    <aop:aspectj-autoproxy />
    <!--<bean id="logAspect" class="xmlbeanfactory.LogAspect" />-->
    <!--<bean id="s2" class="xmlbeanfactory.ApplicationContextAwareTest" />-->
    <bean id="baseDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"
          abstract="true">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="initialSize" value="100"/>
        <property name="minIdle" value="2"/>
        <property name="maxActive" value="200"/>
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <property name="minEvictableIdleTimeMillis" value="300000"/>
        <property name="validationQuery" value="SELECT 'x' FROM DUAL"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="false"/>
        <property name="filters" value="stat"/>
    </bean>
    <!--数据源-->
    <bean id="masterDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"
          parent="baseDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/hotel_price"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>

    <!--事务-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="masterDataSource"/>
    </bean>

    <!-- 事务管理器的注解解析器 -->
    <tx:annotation-driven mode="proxy" transaction-manager="transactionManager"/>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="masterDataSource"/>
        <property name="typeAliasesPackage" value="price.entity"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath*:price/mapper/*Dao.xml"/>
    </bean>


    <bean id="mapperScannerConfig" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="price.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>

测试

public static void main(String[] args) {
        //当前路径加载单个配置文
        ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 
        OrderDao  orderDao = (OrderDao) ctx.getBean("orderDao");
        List<OrderDO> list= orderDao.findOrdersUserLazyLoading();
        System.out.println(list.size());
        for(OrderDO orders : list){//只有执行了这一步才会执行延迟加载。
            User user=orders.getUser();
            System.out.println(user);
        }
    }
}

在Spring中使用MyBatis是相当方便的,不需要我们去管理sqlSessionFactory以及SqlSession的管理,更不需要我们去操作简单的事务。

相关文章

网友评论

      本文标题:SpringMyBatis解析1-使用示例

      本文链接:https://www.haomeiwen.com/subject/nrfxhqtx.html