Java MyBatis框架配置详解
1. 简介
MyBatis是一个用Java编写的开源ORM(object relational mapping)框架。它通过XML或注解方式向数据库发送SQL语句,执行相应的操作,并将结果映射到Java对象中。
MyBatis具有以下优点:
- 灵活性较高,可以使用纯SQL,减少了ORM框架带来的性能压力。
- 可以进行批处理,进一步提高了性能。
- 易于学习和使用,对于用过Hibernate、JPA等ORM框架的开发者来说,学习曲线较小。
2. 配置
2.1 添加依赖
在Maven项目中,我们需要在pom.xml
中添加以下依赖:
<!-- MyBatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!-- MyBatis-Spring依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!-- Spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
2.2 配置数据源
在Spring中,我们使用DataSource
来连接数据库。可以使用DBCP、C3P0等常见数据源工具,也可以使用Spring自带的数据源-Druid
:
<!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="initialSize" value="2"/>
<property name="maxActive" value="10"/>
</bean>
2.3 配置SqlSession工厂
在MyBatis中,我们需要使用SqlSessionFactory
来创建SqlSession
。我们可以将两者结合在一起,使用MyBatis-Spring提供的SqlSessionFactoryBean
:
<!-- SqlSessionFactory配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
configLocation
属性指定了MyBatis的全局配置文件,mapperLocations
属性指定了Mapper(即DAO)接口所在的包路径。
2.4 配置Mapper扫描器
我们可以使用MapperScannerConfigurer
扫描Mapper所在的包,自动生成Mapper接口的实现类:
<!-- Mapper接口扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
2.5 配置事务
在Spring中,我们使用@Transactional
注解来开启事务。我们需要将MyBatis的事务管理交给Spring,我们需要一个DataSourceTransactionManager
:
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 开启事务 -->
<aop:config>
<aop:pointcut id="mybatisService" expression="execution(* com.example.service..*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="mybatisService"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
2.6 配置日志
在MyBatis的开发过程中,日志非常重要,可以帮助我们查看SQL语句是否正确、性能是否足够。我们可以将MyBatis的日志输出到控制台,也可以使用Log4j等日志框架:
<!-- 日志输出 -->
<bean id="logFactory" class="org.apache.ibatis.logging.stdout.StdOutImpl"/>
<!-- MyBatis日志 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
2.7 配置注解
在MyBatis中,我们可以使用注解方式来执行SQL语句。为了开启注解功能,我们需要在MyBatis全局配置文件中添加以下内容:
<!-- 开启注解 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
</settings>
<!-- 扫描Mapper接口 -->
<typeAliases>
<package name="com.example.mapper"/>
</typeAliases>
<!-- 注解方式 -->
<mappers>
<mapper class="org.mybatis.spring.annotation.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</mapper>
</mappers>
3. 示例
3.1 使用Mapper接口方式
在Mapper接口中定义SQL语句:
public interface UserMapper {
@Select("SELECT * FROM user WHERE id=#{id}")
User selectUserById(int id);
@Insert("INSERT INTO user(username,password) VALUES(#{username}, #{password})")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
int insertUser(User user);
}
在Service中使用Mapper接口:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User getUserById(int id) {
return userMapper.selectUserById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int addUser(User user) {
return userMapper.insertUser(user);
}
}
3.2 使用XML方式
在XML文件中定义SQL语句:
<mapper namespace="com.example.mapper.UserMapper">
<select id="selectUserById" parameterType="int" resultType="com.example.model.User">
SELECT * FROM user WHERE id=#{id}
</select>
<insert id="insertUser" parameterType="com.example.model.User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(username,password) VALUES(#{username}, #{password})
</insert>
</mapper>
在Mapper接口中使用SQL语句:
public interface UserMapper {
User selectUserById(int id);
int insertUser(User user);
}
在Service中使用Mapper接口:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User getUserById(int id) {
return userMapper.selectUserById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int addUser(User user) {
return userMapper.insertUser(user);
}
}
4. 总结
本文主要介绍了MyBatis的配置方式,包括数据源、SqlSession工厂、Mapper扫描器、事务、日志和注解。通过两个示例,分别介绍了使用Mapper接口方式和XML方式配置SQL语句。MyBatis作为ORM框架,能够使开发者快速地操作数据库,极大的提高了开发的效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java mybatis框架配置详解 - Python技术站