Spring Mybatis 整合

1.所需要的包:

1,spring发行包

2,mybatis 包和Mybatis-Spring 的jar包,maven可以使用:

<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.2.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.2.1</version>
      <scope>compile</scope>
    </dependency>

2.配置

spring applicationContent.xml 文件主要内容:

<!-- MyBatis配置 -->
	
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> ---------1
		<property name="dataSource" ref="dataSource" /> -------2
		<!-- 显式指定Mapper文件位置 -->
		<property name="mapperLocations" value="classpath:/mybatis/*Mapper.xml" />  -------3
		<property name="typeAliasesPackage" value="com.blueinfo.jee.entity" />      -------4
	</bean>
	<!-- scan for mappers and let them be autowired -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">	------5
		<property name="basePackage" value="com.blueinfo.jee.reposity.mybatis" />  --------6		
		<property name="annotationClass" value="com.blueinfo.jee.reposity.mybatis.MyBatisReposity"/> --------7
	</bean>

注释:

1,定义SqlSessionFactoryBean,在这个bean里面还是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。通过SqlSessionFactoryBean我们可以通过对其指定一些属性来提供Mybatis的一些配置信息。

2,datasource定义,不能缺少

3,显示指定Mapper.xml的位置

4,指定实体类的包位置

5,通过配置MapperScannerConfigurer,Mybatis-Spring会自动为我们注册Mapper对应的MapperFactoryBean对象,而不用使用类似下面的配置一个个指定

<bean id="myMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
      <property name="mapperInterface"  
          value="com.blueinfo.jee.BlogMapper" />  
      <property name="sqlSessionFactory" ref="sqlSessionFactory" />  
   </bean>
上述方式,有一个Mapper就要定义一个bean。

6,指定接口的包,MapperScannerConfigurer会扫面包下面的所有Mapper接口。并把它们注册为一个个MapperFactoryBean对象

7,通过注解过滤基本包下面的接口。使得MapperScannerConfigurer只扫描basePackage下面带注解MyBatisReposity的接口

有时候我们指定的基包下面的并不全是我们定义的Mapper接口,为此MapperScannerConfigurer还为我们提供了另外两个可以缩小搜索和注册范围的属性。一个是annotationClass,另一个是markerInterface。

  • annotationClass:当指定了annotationClass的时候,MapperScannerConfigurer将只注册使用了annotationClass注解标记的接口。

  • markerInterface:markerInterface是用于指定一个接口的,当指定了markerInterface之后,MapperScannerConfigurer将只注册继承自markerInterface的接口。 如果上述两个属性都指定了的话,那么MapperScannerConfigurer将取它们的并集,而不是交集。即使用了annotationClass进行标记或者继承自markerInterface的接口都将被注册为一个MapperFactoryBean。


3.源文件


实体类:

@Entity
@Table(name = "ss_user")
public class User extends IdEntity {

	private String loginName;
	private String plainPassword;
	private String password;
	private String salt;
	private String name;
	private String email;
	private String status;

	//.....

	

}

@MappedSuperclass
public abstract class IdEntity {

	protected Long id;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public Long getId() {
		return id;
	}

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


注解MyBatisReposity


/**
 * 标识MyBatis的DAO,方便{@link org.mybatis.spring.mapper.MapperScannerConfigurer}的扫描。
 * 
 * @author calvin
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Component
public @interface MyBatisReposity {
	String value() default "";
}

dao:

@MyBatisReposity
public interface UserMybatisDao {
	
	User get(Long id);

	List<User> search(Map<String, Object> parameters);

	void save(User user);

	void delete(Long id);

}


service:

@Service
public class AccountService implements IAccoutService{
	
	@Autowired
	private UserMybatisDao userMbDao;
	
	
	
	public void getUser(long id){
		User user = userMbDao.get(id);
		logger.info("user name:" + user.getLoginName());
	}
	
	Logger logger = LoggerFactory.getLogger(AccountService.class);

}

UserMapper.xml 与dao接口一一对应

<?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">
<!-- namespace必须指向Dao接口 -->
<mapper namespace="com.blueinfo.jee.reposity.mybatis.UserMybatisDao">
	<!--
		获取用户: 输出直接映射到对象, login_name列要"as loginName"以方便映射 ,team_id as "team.id"创建team对象并赋值
	-->
	<select id="get" parameterType="long" resultType="User">
		select id, name, email,
		login_name as loginName,
		team_id as "team.id"
		from ss_user
		where id=#{id}
	</select>
	
</mapper> 

test类

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:/applicationContext.xml"}) 
@Transactional 
public class AccountServiceTest {
	
	@Autowired
	private AccountService service;
	
	@Test
	public void testGetUser() {
		
		User user = service.getUser(1L);
		
		assertNotNull("User not found", user);
		assertEquals("test", user.getLoginName());
	}

}

文章内容参考开源项目SpringSide,地址:https://github.com/springside


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值