Spring+MyBatis纯注解零XML整合(4)

不得不说,利用XML作为配置文件是一个非常好的想法,它可以轻松地实现配置集中化,而且修改之后无需再次编译。然而,由于大多数情况下开发者基本都会拿到程序的源码,加之对于各种XML配置文件一般情况下也只有开发者会去动,可以说XML在一定程度上也相当于程序代码,只是不用编译而已。因此很多人并不是很喜欢XML这种东西。早在Spring 2.5之前就有很多人对满天飞的XML配置叫苦不迭。从Spring 3开始,Java config开始出现,这一特性使得Spring能够摆脱XML配置文件。但是大多数人仍然通过XML文件配置注解,这样的用法并未完全摆脱XML。实际上,从这时候开始就完全可以通过Java Config而非XML来对Spring进行配置了。加上MyBatis也完全可以通过注解来配置mapper,因此对于不喜欢XML配置的读者,这篇文章可以说是值得一看。本文以Spring 4为例介绍Spring与MyBatis纯注解整合。

首先你需要:

  • 了解传统的通过XML配置Spring+MyBatis的方法
  • Spring 4 + MyBatis 3
  • Servlet 3.0
  • Java 8
  • 20分钟的时间

对于传统的Web项目自然少不了web.xml。然而从Servlet 3.0开始,这个东西已经被WebApplicationInitializer取代。顾名思义,WebApplicationInitializer是对Web应用进行初始化的一个东东。不过WebApplicationInitializer是一个接口,所以你需要提供一个WebApplicationInitializer的实现类。当你把实现类写好之后,Servlet 3.0可以自动发现它并对servlet进行初始化(当然也可以是多个实现类),可以说这个接口的实现类一定程度上等价于web.xml的配置。下面的WebApplicationInitializer实现类为Servlet的根配置,并指定该配置的加载顺序为所有配置之前(由@Order注解控制,数值越小优先级越高)。本例中该配置为空,可通过清单1中的方式来配置Filter、Listener和Servlet。

清单1 配置根WebApplicationInitializer

package org.fhp.springmybatis.config;  

import org.springframework.core.annotation.Order;
import org.springframework.web.WebApplicationInitializer;  

import javax.servlet.*;  

@Order(1)
public class BasicWebInitializer implements WebApplicationInitializer {  

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
//        servletContext.addFilter("filterName", AFilter.class).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/");
//    servletContext.addListener(EventListener.class);
//        servletContext.addServlet("servletName", AServlet.class);
    }
}  
接下来需要进行Spring的Servlet配置。Spring提供了AbstractAnnotationConfigDispatcherServletInitializer类(也是WebApplicationInitializer的子类),实现之即可进行Spring的servlet配置。这里需要把加载顺序放在BasicWebInitializer之后。

清单2 配置Spring的WebApplicationInitializer

package org.fhp.springmybatis.config;  

import org.springframework.core.annotation.Order;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;  

import javax.servlet.Filter;  

@Order(3)
public class SpringInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {  

    //配置Spring根上下文配置类
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SpringRootConfig.class};
    }  

    //配置Spring Web上下文配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {SpringWebConfig.class};
    }  

    //配置在什么路径下使用Spring的DispatcherServlet。等价于给DispatchServlet指定对应的url-mapping
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }  

    //配置与Spring相关的Filter。这里规定Spring MVC的编码为UTF-8。
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        return new Filter[] { characterEncodingFilter };
    }
}  

这里Servlet的配置,等价于XML配置中的web.xml就完成了。下面开始Spring的ApplicationContext配置。

首先进行Web的上下文配置。进行Web的上下文配置需要继承WebMvcConfigurerAdapter类,同时配置类也要有@Configuration,@EnableWebMvc和@ComponentScan注解。这里配置一个对静态文件访问的支持,在WebMvcConfigurerAdapter可以看到其他的配置,这里就不多说了。

清单3 Spring Web ApplicationContext配置

package org.fhp.springmybatis.config;  

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;  

import java.util.List;  

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "org.fhp.springmybatis")
public class SpringWebConfig extends WebMvcConfigurerAdapter {  

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
        registry.addResourceHandler("*.html").addResourceLocations("/");
    }
}

  

其次进行根上下文的配置。这里通过@Bean注解来取代XML中的<bean>标签。

清单4 Spring Root ApplicationContext配置

package org.fhp.springmybatis.config;  

import org.springframework.context.annotation.*;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;  

@Configuration
@ComponentScan("org.fhp.springmybatis")
@EnableAspectJAutoProxy(proxyTargetClass=true)
@EnableTransactionManagement
@Import(DaoConfig.class)
public class SpringRootConfig {  

    @Bean
    public PropertyPlaceholderConfigurer getTestPpc() {
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        ppc.setLocations(new ClassPathResource("jdbc.properties"));
        return ppc;
    }
}  

其中jdbc.properties内容如下:

清单5 jdbc.properties配置

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test_mysql
jdbc.user=root
jdbc.password=root  

然后是DAO层的上下文。

清单6 DAO上下文配置

package org.fhp.springmybatis.config;  

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.DriverManagerDataSource;  

import javax.sql.DataSource;  

@Configuration
@MapperScan(value="org.fhp.springmybatis.dao")
public class DaoConfig {  

    @Value("${jdbc.driverClass}")
    private String driverClass;  

    @Value("${jdbc.user}")
    private String user;  

    @Value("${jdbc.password}")
    private String password;  

    @Value("${jdbc.jdbcUrl}")
    private String jdbcUrl;  

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setUrl(jdbcUrl);
        return dataSource;
    }  

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }  

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        return sessionFactory.getObject();
    }
}  

至此Spring的配置完成。
现在,我们假设有如下实体类。

清单7 实体类定义

[java] view plain copy
package org.fhp.springmybatis.entity;  

public class Person {
    private long id;
    private String name;
    private String nick;  

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getNick() {
        return nick;
    }
    public void setNick(String nick) {
        this.nick = nick;
    }
}  

由于在清单6中@MapperScan规定了扫描Mapper的包为org.fhp.springmybatis.dao,因此我们只要将mapper配置类放在这个包下,MyBatis即可自动识别。

清单8 Mapper的配置

package org.fhp.springmybatis.dao;  

import java.util.List;  

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.Update;
import org.fhp.springmybatis.entity.Person;  

public interface PersonDao {  

    @Insert(value="insert into t_person(name, nick) values (#{name}, #{nick})")
    void add(Person person);  

    @Delete(value="delete from t_person where id=#{id}")
    void delete(long id);  

    @Update(value="update t_person set name=#{name}, nick=#{nick} where id=#{id}")
    void update(Person person);  

    @Select(value="select * from t_person where id=#{id}")
    Person select(long id);
}  

可以看到,通过@Insert,@Delete,@Update,@Select注解加SQL语句的配置,即可实现MyBatis对数据库的增删改查操作。

那么假如需要动态地生成SQL语句,该怎么办呢?答案是使用MyBatis提供的@InsertProvider,@DeleteProvider,@UpdateProvider,@SelectProvider注解,当然也是对应数据库的增删改查。这里以@SelectProvider为例。

首先定义一个Provider类。

清单9 Provider类

public class PersonSqlProvider {
    public String selectByNameAndNick(@Param("name") String name, @Param("nick") String nick) {
        StringBuffer sb = new StringBuffer();
        sb.append("select * from t_person where ");
        sb.append("name=#{name}");
        sb.append(" and ");
        sb.append("nick=#{nick}");
        return sb.toString();
    }
}  

然后就要有请我们的@SelectProvider出场了。

清单10 使用@SelectProvider

@SelectProvider(type=PersonSqlProvider.class, method="selectByNameAndNick")
List<Person> selectByNameAndNick(@Param("name") String name, @Param("nick") String nick);  

当然,在本例当中即使不用Provider也是能够实现的,这里只是为了演示Provider的效果。我们可以看到,SQL语句由程序拼接,自然可以实现动态SQL中if条件判断以及SQL当中in语句等复杂语句的拼接,而且一定程度上比用XML更灵活。

综上,本文介绍了Spring与MyBatis整合的另一种思路——纯注解无XML的配置方法。随着越来越多的框架都逐渐采用注解进行配置,可以说无XML配置已经成为一种趋势。如果你已经用上了Spring 4,不妨尝试一下这样的方法,你一定会感到很满意的。

/**
 * 城市 DAO 接口类
 * Created by wanglu-jf on 17/6/27.
 * @Mapper 标志接口为 MyBatis Mapper 接口
 * @Select 是 Select 操作语句
 * @Results 标志结果集,以及与库表字段的映射关系
 */
@Mapper
public interface CityDao {
    /**
     * 查询城市信息
     */
    @Select(" SELECT * FROM city WHERE id = #{id}")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "provinceId", column = "province_id"),
            @Result(property = "cityName", column = "city_name"),
            @Result(property = "description", column = "description")
    })
    public City queryCityById(@Param("id") int id);
}

原文地址:https://www.cnblogs.com/a8457013/p/9074960.html

时间: 2024-08-02 00:22:40

Spring+MyBatis纯注解零XML整合(4)的相关文章

mybatis使用注解替代xml配置,动态生成Sql

mybatis使用注解替代xml配置时,遇到判断条件是否为null或者为空时,@Select很难搞定,不知道怎么办? mybatis3中增加了使用注解来配置Mapper的新特性,使用 SelectProvider来动态生成sql. 典型的使用场景 1. 无参数@SelectProvide方法在Mapper接口方法上和@SelectProvide指定类方法上,均无参数:UserMapper.java: 1     @SelectProvider(type = SqlProvider.class, 

springMVC,spring,mybatis全注解搭建框架--第一步,让框架跑起来

自己从事java开发工作也有一年多了,自己却没有亲手搭建一个完整的框架.于是今天自己动手搭建一个,过程中遇到一些问题,倒腾了大半天终于搞定了. 现在给大家分享一下过程,自己也记录下来,以后学习参考使用. 我采用全注解的方式去搭建springMVC,spring,mybatis框架,同时自己也可以去配置xml,但是主要还是通过注解的方式来实现.参考的网上其它大神分享的方法,多多少少有些地方写的不清楚,也并不是完全通过注解去实现的. springboot可以真正说是零配置吧,后面我将给大家演示spr

玩转SSH(五):Struts + Spring + MyBatis(注解版)

本文将在 玩转SSH(四):Struts + Spring + MyBatis 的基础上进行一些小的改动,将原本是 xml 配置方式的项目,改成注解的配置方式. 要将项目改成注解方式,一般是将在 Spring 中创建的对象通过注解的方式直接写在类中.下面我们看看如何进行配置. 一.修改 applicationContext.xml 文件 将原来的bean声明全部删除: <bean id="..." class="..."> <property ..

Spring MVC4 纯注解配置教程

阅读本文需要又一定的sping基础,最起码要成功的运行过一个SpringMvc项目. 在传统的Spring项目中,我们要写一堆的XML文件.而这些XML文件格式要求又很严格,很不便于开发.而网上所谓的0配置,并不是纯粹的0配置,还是要写一些xml配置,只是用了几个@Service,@Controller注解而已. 在这里,我讲介绍一种新的配置方式,一行XML代码都不需要,什么web.xml,Application-context.xml,Beans.xml,统统去死吧! 首先建立一个Maven项

Spring基于纯注解方式的使用

经过上篇xml与注解混合方式,对注解有了简单额了解,上篇的配置方式极大地简化了xml中配置,但仍有部分配置在xml中进行,接下来我们就通过注解的方式将xml中的配置用注解的方式实现,并最终去掉xml配置. 一.xml中遗留配置 注解扫描 <!-- 开启注解并扫描指定包中带有注解的类 --> <context:component-scan base-package="com.kkb.spring.service"/> 非自定义bean,如sqlsessionFac

阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制

新建项目 把之前项目src下的内容全部复制过来 pom.xml内复制过来 开始配置 新建一个config的包,然后再新建配置文件类SpringConfiguration @Configuration这个注解是可写可不写的. 这个类会做为字节码的参数传给ApplicationContext @ComponentScan配置要扫描的包 @Import 但是这个Import要导谁呢? 新建JdbcConfig类 这一就可以通过Import导入JdbcConfig这个类 xml里面扫描包的配置可以省略掉

spring 的纯注解配置

不写 bean.xml 文件,所有配置都用注解来实现 基于注解的 IoC 配置已经完成,但还是离不开 xml 配置文件,是因为有一句很关键的配置: <!-- 告知spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器中 --> <context:component-scan base-package="com.fgy"></context:component-scan> 另外,数据源和 QueryRunner(JdbcT

Spring+Mybatis @Transactional注解事务不生效

@Transactional声明式事务配置: <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 声明式事务配

springmvc学习总结(二) -- maven+springmvc+spring+mybatis+mysql详细搭建整合过程讲解

@[email protected] 写在最前 之前分享过下面这几篇: mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(上)(附demo和搭建过程遇到的问题解决方法) mybatis学习笔记(六) -- maven+spring+mybatis从零开始搭建整合详细过程(下) springmvc学习笔记(一) -- 从零搭建,基础入门 这一篇,在这些练习的基础上,将它们整合在一起! 搭建步骤如下 一.新建maven项目,配置环境,测试是否配置成