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的管理,更不需要我们去操作简单的事务。
网友评论