Tagged: MyBatis

Spring/SpringMVC/MyBatis注解备忘录

Spring


@Autowired

自动装配,其作用是为了消除java代码里面的getter/setter与bean属性中的property。@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

@Qualifier(指定注入Bean的名称)

如果一个容器有一个以上匹配的Bean,则可以使用@Qualifier注解限定Bean的名称。

@Resource

与@Autowired类似,默认通过name属性去匹配Bean,找不到再按type去匹配,指定了name或者type则根据指定类型去匹配Bean

@Service

标注业务层组件

@Controller

标注控制层组件

@Repository

标注数据访问层组件(即Dao组件)

@Component

泛指组件,当组件不好归类的时候,可以使用这个组件进行标注

@Configuration

把这个类作为一个Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。

@Scope

作用域(常用来设置该类是否为单例或多例)

@Lazy

表示延迟初始化(Spring默认是延迟加载,如果是工具类,则可以使用它来进行标注容器启动即实例化)

@PostConstruct

用于指定初始化方法(用在方法上)

@PreDestory

用于指定销毁方法(用在方法上)

@DependsOn

定义Bean初始化及销毁时的顺序

@Primary

自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

@Async

异步方法调用

@EnableScheduling

开启对计划任务的支持

@EnableAspectJAutoProxy

激活Aspect自动代理

@EnableAsync

开启异步方法的支持

@EnableWebMVC

用来开启Web MVC的配置支持

@EnableConfigurationProperties

用来开启对@ConfigurationProperties注解配置Bean的支持

@EnableJpaRepositories

开启对Spring Data JPA Repostory的支持

@EnableTransactionManagement

注解开启注解式事务的支持

@EnableCaching

开启注解式的缓存支持

SpringMVC


@RequestMapping

处理请求地址映射,可用于类或者方法上

@PathVariable

获取Url中的动态参数

@RequestParam

将请求参数绑定到方法参数上

@RequestBody

将HTTP请求正文转换为适合的HttpMessageConverter对象

@ResponseBody

将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流

@RestController

这个注解的类会被看作一个controller。controller中使用@RequestMapping的方法有一个默认的@ResponseBody注解。@ResponseBody也可以加到类一级,通过继承方法一级不需要添加。

@ModelAttribute

标明该方法的目的是添加一个或多个模型属性(Model attributes)。@ModelAttribute标注的方法会在@RequestMapping方法调用之前而调用

@SessionAttributes

将值放到Session作用域中,写在Class上面

@CookieValue

cookie 数据到处理器功能处理方法的方法参数上的绑定

@RequestHeader

请求头(header)数据到处理器功能处理方法的方法参数上的绑定

@ResponseStatus

定义处理器功能处理方法/异常处理器返回的状态码和原因

@ExceptionHandler

注解式声明异常处理器

MyBatis


@Insert

插入sql , 和xml insert sql语法完全一样

@Select

查询sql, 和xml select sql语法完全一样

@Update

更新sql, 和xml update sql语法完全一样

@Delete

删除sql, 和xml delete sql语法完全一样

@Param

入参

@Results

结果集合

@Result

结果

Spring整合Mybatis的集成方式

1、采用MapperScannerConfigurer,它将会查找类路径下的映射器并自动将它们创建成MapperFactoryBean。

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

	<!-- 自动扫描注解,管理bean -->
	<context:component-scan base-package="com.pay.service">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
	</context:component-scan>

	<context:component-scan base-package="com.pay.model,com.pay.dto">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
	</context:component-scan>

	<!-- 1.1 加载数据库配置文件 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>

	<!--开启注解方式-->
	<context:annotation-config/>

	<!-- 1.2 配置Druid数据源 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
		<!-- 配置连接池属性 -->
		<property name="driverClassName" value="${jdbc.driver}"/>
		<property name="url" value="${jdbc.url}"/>
		<property name="username" value="${jdbc.username}"/>
		<property name="password" value="${jdbc.password}"/>

		<!-- 配置初始化大小、最小、最大 -->
		<property name="initialSize" value="${initialSize}"/>
		<property name="minIdle" value="${minIdle}"/>
		<property name="maxActive" value="${maxActive}"/>

		<!-- 配置获取连接等待超时的时间 -->
		<property name="maxWait" value="60000"/>

		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="60000"/>

		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="300000"/>
		<property name="validationQuery" value="SELECT 'x'"/>
		<property name="testWhileIdle" value="true"/>
		<property name="testOnBorrow" value="false"/>
		<property name="testOnReturn" value="false"/>

		<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
		<property name="poolPreparedStatements" value="true"/>
		<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>

		<!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->
		<property name="filters" value="stat"/>
	</bean>

	<!-- 1.3 Spring和MyBatis整合,配置sqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 数据库连接池 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- 配置 Mybatis 全局配置文件 -->
		<property name="configLocation" value="classpath:/config/mybatis-config.xml"/>
		<!-- 自动扫描mapping.xml文件 -->
		<property name="mapperLocations" value="classpath:/mapper/*.xml"/>
		<!--<property name="typeAliasesPackage" value="com.pay.model"/>-->
	</bean>

	<!-- 1.4 扫描Dao接口,Spring会自动查找其下的类,注入到spring容器中 包下的类需要使用@MapperScan注解-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号分割 -->
		<property name="basePackage" value="com.pay.dao"/>
		<property name="sqlSessionTemplateBeanName" value="sqlSessionTemplate"/>
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
	</bean>

	<!-- 启用sqlSessionTemplate来执行session的执行操作 -->
	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactory"/>
	</bean>

	<!-- 工具类 -->
	<bean id="beanFactoryUtil" class="com.pay.util.BeanFactoryUtil" lazy-init="false"/>

	<!-- druid 日志 -->
	<bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">
		<property name="statementExecutableSqlLogEnable" value="true"/>
	</bean>

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

	<!-- 配置事务的注解方式注入,开启对Class的动态代理功能 -->
	<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

	<!-- 通知 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<!-- 传播行为 -->
			<tx:method name="save*" propagation="REQUIRED"/>
			<tx:method name="insert*" propagation="REQUIRED"/>
			<tx:method name="add*" propagation="REQUIRED"/>
			<tx:method name="create*" propagation="REQUIRED"/>
			<tx:method name="delete*" propagation="REQUIRED"/>
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
			<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
			<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	<!-- 切面 -->
	<aop:config>
		<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.pay.service.*.*(..))"/>
	</aop:config>

</beans>
<?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="com.pay.dao.IManagerDao">

  <!-- 缓存配置 -->
  <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

  <resultMap id="ManagerResultMap" type="com.pay.model.Manager">
    <constructor>
      <idArg column="id" javaType="java.lang.Integer" jdbcType="INTEGER" />
      <arg column="userName" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="userPwd" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="email" javaType="java.lang.String" jdbcType="VARCHAR" />
    </constructor>
  </resultMap>
  <sql id="ManagerList">
    id, userName, userPwd, email
  </sql>

  <!-- 添加管理员 -->
  <insert id="add" parameterType="com.pay.model.Manager">
    insert into manager (userName, userPwd, email)
    values (#{username,jdbcType=VARCHAR}, #{userpwd,jdbcType=VARCHAR},
      #{email,jdbcType=VARCHAR})
  </insert>

  <!-- 删除管理员 -->
  <delete id="del" parameterType="Integer">
    DELETE from manager where id = #{id}
  </delete>

  <!-- 查询管理员 -->
  <select id="findUser" resultMap="ManagerResultMap">
    select <include refid="ManagerList"/> from manager where userName = #{userName} and userPwd = #{userPwd}
  </select>

  <select id="findAll" resultMap="ManagerResultMap" >
    SELECT * from manager
  </select>

  <!-- 更改管理员密码 -->
  <update id="updatePwd" parameterType="com.pay.model.Manager">
    UPDATE manager SET userPwd = #{userPwd} where userName = #{userName} and id = #{id}
  </update>

</mapper>
package com.pay.dao;

import com.pay.model.Manager;
import org.apache.ibatis.annotations.Param;
import org.mybatis.spring.annotation.MapperScan;

import java.util.List;

@MapperScan
public interface IManagerDao {
    /**
     * 添加一个管理员
     * @param bean 管理实体类
     */
    int add(Manager bean);

    /**
     * 查询管理用户
     * @param userName 用户名
     * @param userPwd 用户密码
     * @return 一个管理角色对象
     */
    Manager findUser(@Param("userName") String userName, @Param("userPwd") String userPwd);

    /**
     * 更改管理员密码
     * @param userName 用户名
     * @param newPwd 用户新密码
     */
    void updatePwd(String userName, String newPwd);

    /**
     * 查询所有管理员用户
     * @return 管理员集合
     */
    List<Manager> findAll();
}
package com.pay.service;

import com.pay.model.Manager;

import java.util.List;

/**
 * 管理员业务层
 * @author jalena
 *
 */
public interface IManagerService {
	/**
	 * 添加一个管理员
	 * @param bean 管理实体类
	 */
	int add(Manager bean);
	
	/**
	 * 查询管理用户
	 * @param userName 用户名
	 * @param userPwd 用户密码
	 * @return 一个管理角色对象
	 */
	Manager findUser(String userName, String userPwd);
	
	/**
	 * 更改管理员密码
	 * @param userName 用户名
	 * @param newPwd 用户新密码
	 */
	void updatePwd(String userName, String newPwd);
	
	/**
	 * 查询所有管理员用户
	 * @return 管理员集合
	 */
	List<Manager> findAll();
}
package com.pay.service.impl;

import com.pay.dao.IManagerDao;
import com.pay.model.Manager;
import com.pay.service.IManagerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author Jalena
 * @create 2017-04-09 23:20
 */
@Service
@Transactional
public class IManagerServiceImpl implements IManagerService {

	@Autowired
	private IManagerDao dao;

	public int add(Manager bean) {
		return dao.add(bean);
	}

	public Manager findUser(String userName, String userPwd) {
		return dao.findUser(userName,userPwd);
	}

	public void updatePwd(String userName, String newPwd) {
		dao.updatePwd(userName,newPwd);
	}

	public List<Manager> findAll() {
		return dao.findAll();
	}
}

这种方式最好!

Read more

MyBatis 使用详解

什么是 MyBatis ?

MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

配置Mybatis

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.4.2</version>
</dependency>

定义实体Bean

package com.pay.entity;

public class Manager {
    private Integer id;

    private String username;

    private String userpwd;

    private String email;

    public Manager(Integer id, String username, String userpwd, String email) {
        this.id = id;
        this.username = username;
        this.userpwd = userpwd;
        this.email = email;
    }

    public Manager() {
        super();
    }

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }

    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd == null ? null : userpwd.trim();
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email == null ? null : email.trim();
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", id=").append(id);
        sb.append(", username=").append(username);
        sb.append(", userpwd=").append(userpwd);
        sb.append(", email=").append(email);
        sb.append("]");
        return sb.toString();
    }
}
package com.pay.entity;

public class Manager {
    private Integer id;

    private String username;

    private String userpwd;

    private String email;

    public Manager(Integer id, String username, String userpwd, String email) {
        this.id = id;
        this.username = username;
        this.userpwd = userpwd;
        this.email = email;
    }

    public Manager() {
        super();
    }

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }

    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd == null ? null : userpwd.trim();
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email == null ? null : email.trim();
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", id=").append(id);
        sb.append(", username=").append(username);
        sb.append(", userpwd=").append(userpwd);
        sb.append(", email=").append(email);
        sb.append("]");
        return sb.toString();
    }
}

定义Dao接口

package com.pay.dao;

import com.pay.entity.Manager;

import java.util.List;

public interface IManagerDao {
    /**
     * 添加一个管理员
     * @param bean 管理实体类
     */
    public void add(Manager bean);

    /**
     * 查询管理用户
     * @param userName 用户名
     * @param userPwd 用户密码
     * @return 一个管理角色对象
     */
    public Manager findUser(String userName,String userPwd);

    /**
     * 更改管理员密码
     * @param userName 用户名
     * @param newPwd 用户新密码
     */
    public void updatePwd(String userName,String newPwd);

    /**
     * 查询所有管理员用户
     * @return 管理员集合
     */
    public List<Manager> findAll();
}

定义Mapper配置文件

<?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="com.pay.dao.IManagerDao">

  <!-- 缓存配置 -->
  <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

  <resultMap id="ManagerResultMap" type="com.pay.entity.Manager">
    <constructor>
      <idArg column="id" javaType="java.lang.Integer" jdbcType="INTEGER" />
      <arg column="userName" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="userPwd" javaType="java.lang.String" jdbcType="VARCHAR" />
      <arg column="email" javaType="java.lang.String" jdbcType="VARCHAR" />
    </constructor>
  </resultMap>
  <sql id="ManagerList">
    id, userName, userPwd, email
  </sql>

  <!-- 添加管理员 -->
  <insert id="add" parameterType="com.pay.entity.Manager">
    insert into manager (userName, userPwd,
      email)
    values (#{username,jdbcType=VARCHAR}, #{userpwd,jdbcType=VARCHAR},
      #{email,jdbcType=VARCHAR})
  </insert>

  <!-- 查询管理员 -->
  <select id="findUser" resultMap="ManagerResultMap">
    select <include refid="ManagerList"/> from manager where userName = #{userName} and userPwd = #{userPwd}
  </select>

  <!-- 更改管理员密码 -->
  <update id="updatePwd">
    UPDATE manager SET userPwd = #{userPwd} where userName = #{userName}
  </update>

</mapper>