`
禹爸爸
  • 浏览: 87512 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Mybatis系列之实战篇(上)

阅读更多

Mybatis系列之实战篇(上)

引言

经过前面的学习(本文最后有前面文章的链接,小伙伴们可以根据需要自行阅读),我们需要一个实际的项目来练练手,对掌握的知识做进一步的巩固和沉淀。

 

术语介绍

本文以一个实际电商项目上中的客户管理模块作为讲解案例。在正文开始前,先约定一些术语,这些术语在后面的讲解中会频繁出现,所以希望小伙伴发用两分钟的时间看一下,这对后面的阅读会有很大帮助。

Party

我们将一个集团客户的主要信息抽象提取出来,称之为Party。每个Party下允许有多个Code。

Code

客户代码,每个集团客户允许有一个或多个Code。客户在系统中制作采购订单时,是以Code为实际操作者,也就是说每个采购订单必须有且仅有一个Code。每个Code对应着我们一个生产工厂。

Plant

生产工厂,每个生产工厂提供的产品不同,客户要购买某个工厂的商品,必须有一个与之对应的Code。

Location

客户地点,由Address和Purpose组合而成。每个Code下允许有多个用途不同的地点,限制如下:

  • 有且仅有一个用途为Legal的地点(营业执照上的地点)
  • 有一个或多个用途为Ship To的地点(收货地点)
  • 有一个或多个用途为Bill To的地点(发票寄送地点)

Address

地址。实际的物理地址,有省、市、区、街道等信息组成。一个Address可以有搭配不同的用途(Purpose)组成不同的客房地点Location。

Purpose

地址用途。这是一个附加的信息,用于标识出地点的用途,比如注册地、收货地、发票寄送地等。

 

数据库实体关系图

数据库DDL

CREATE TABLE `addr_province` (
  `province_id` int(4) NOT NULL AUTO_INCREMENT,
  `province_name` varchar(64) NOT NULL,
  `is_valid` tinyint(4) NOT NULL DEFAULT '1',
  `created_time` datetime NOT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`province_id`),
  KEY `province_name` (`province_name`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COMMENT='省份表';

CREATE TABLE `addr_city` (
  `city_id` int(4) NOT NULL AUTO_INCREMENT,
  `city_name` varchar(64) NOT NULL,
  `province_id` int(4) NOT NULL,
  `is_valid` tinyint(4) NOT NULL DEFAULT '1',
  `created_time` datetime NOT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`city_id`),
  KEY `province_id` (`province_id`),
  KEY `city_name` (`city_name`),
  CONSTRAINT `sys_city_ibfk_1` FOREIGN KEY (`province_id`) REFERENCES `addr_province` (`province_id`)
) ENGINE=InnoDB AUTO_INCREMENT=387 DEFAULT CHARSET=utf8 COMMENT='城市表';

CREATE TABLE `addr_area` (
  `area_id` int(4) NOT NULL AUTO_INCREMENT,
  `area_name` varchar(64) NOT NULL,
  `city_id` int(4) NOT NULL,
  `is_valid` tinyint(4) NOT NULL DEFAULT '1',
  `created_time` datetime NOT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`area_id`),
  KEY `city_id` (`city_id`),
  KEY `area_name` (`area_name`),
  CONSTRAINT `sys_area_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `addr_city` (`city_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3124 DEFAULT CHARSET=utf8 COMMENT='地区表';

CREATE TABLE `address` (
  `address_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `province_id` int(10) unsigned NOT NULL,
  `city_id` int(10) unsigned NOT NULL,
  `area_id` int(10) unsigned NOT NULL,
  `street` varchar(128) NOT NULL,
  `zip_code` varchar(16) DEFAULT NULL,
  `contact_person` varchar(32) DEFAULT NULL,
  `tel` varchar(32) DEFAULT NULL,
  `fax` varchar(32) DEFAULT NULL,
  `cell_phone` varchar(32) DEFAULT NULL,
  `email` varchar(128) DEFAULT NULL,
  `is_valid` tinyint(4) NOT NULL DEFAULT '1',
  `created_time` datetime NOT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`address_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='地址表';

CREATE TABLE `addr_purpose` (
  `purpose_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `purpose_name` varchar(255) NOT NULL,
  `is_valid` tinyint(4) NOT NULL DEFAULT '1',
  `created_time` datetime NOT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`purpose_id`),
  UNIQUE KEY `purpose_name` (`purpose_name`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='地址用途表';

CREATE TABLE `customer_party` (
  `party_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `party_name` varchar(128) DEFAULT NULL,
  `country` varchar(32) DEFAULT NULL,
  `area` varchar(32) DEFAULT NULL,
  `is_valid` tinyint(4) DEFAULT '1',
  `created_time` datetime DEFAULT NULL,
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`party_id`),
  UNIQUE KEY `party_name` (`party_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='客户Party主表';

CREATE TABLE `customer_code` (
  `code_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `customer_code` varchar(8) DEFAULT NULL COMMENT '客户代码',
  `plant_id` int(10) unsigned NOT NULL,
  `party_id` int(10) unsigned DEFAULT NULL,
  `is_valid` tinyint(4) DEFAULT '1',
  `created_time` datetime DEFAULT NULL,
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`code_id`),
  KEY `plant_id` (`plant_id`),
  KEY `party_id` (`party_id`),
  CONSTRAINT `customer_code_ibfk_1` FOREIGN KEY (`plant_id`) REFERENCES `plant` (`plant_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `customer_code_ibfk_2` FOREIGN KEY (`party_id`) REFERENCES `customer_party` (`party_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='客户代码表';

CREATE TABLE `customer_location` (
  `location_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `code_id` int(10) unsigned DEFAULT NULL,
  `address_id` int(10) unsigned DEFAULT NULL,
  `purpose_id` int(10) unsigned DEFAULT NULL,
  `is_valid` tinyint(4) DEFAULT '1',
  `created_time` datetime DEFAULT NULL,
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`location_id`),
  UNIQUE KEY `code_id` (`code_id`,`address_id`,`purpose_id`),
  KEY `address_id` (`address_id`),
  KEY `code_id_2` (`code_id`),
  KEY `purpose_id` (`purpose_id`),
  CONSTRAINT `customer_location_ibfk_1` FOREIGN KEY (`code_id`) REFERENCES `customer_code` (`code_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `customer_location_ibfk_2` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `customer_location_ibfk_3` FOREIGN KEY (`purpose_id`) REFERENCES `addr_purpose` (`purpose_id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='客户地址表';

 鉴于这是一个实际的项目,有些设计字段不方便公开,所以这里仅仅使用最基础的字段。

 

项目目录结构


包说明:

com.emerson.etao.controller: Spring MVC控制器包

com.emerson.etao.dao:数据访问层包,Mybatis映射文件对应的Dao接口存放在这个包中

com.emerson.etao.entity:数据实体类包,

com.emerson.etao.service:服务层包,服务层接口定义存放在这个包中

com.emerson.etao.service.impl:服务层实现包,服务层接口实现代码存放在这个包中

com.emerson.etao.security:项目安全包,用户认证、授权、许可等Shiro相关代码

com.emerson.etao.mapping:Mybatis映射文件存放在此包中

 

依赖Jar包

使用Maven对项目进行管理,只需要POM.xml文件中加入依赖的Jar包即可。

	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		
		<!-- Spring MVC -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<!-- Mysql & JDBC -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.36</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.2.1.RELEASE</version>
			<scope>compile</scope>
		</dependency>

		<!-- mybaits-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.3</version>
		</dependency>

		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.3.0</version>
		</dependency>

		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>

		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>

		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>

		<!-- Shiro -->
		<dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>1.2.3</version>
		</dependency>


		<!-- JSON -->
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>

	</dependencies>

 

Web.xml & Spring & Mybatis配置

以下是web文件,Spring和Mybatis的配置文件,以将所有与本文无关的配置删除掉了。

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

    <!-- 支持UTF-8编码 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>  
        <filter-name>encodingFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>

</web-app>

 

Spring配置文件

<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<!-- Root Context: defines shared resources visible to all other web components -->
	
	<context:component-scan base-package="com.emerson.etao" />
	
	<!-- dataSource -->
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://127.0.0.1:3306/DATABASE_NAME" />
		<property name="username" value="DB_USERNAME" />
		<property name="password" value="DB_PASSWORD" />
	</bean>

	<!-- Mybatis SqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!-- 自动扫描mapping.xml文件 -->
		<property name="mapperLocations" value="classpath:com/emerson/etao/mapping/**/*.xml"></property>
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
	</bean>

	<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
	<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="com.emerson.etao.dao" />
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
	</bean>
</beans>

 Mybatis配置

<?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>
        <!-- 将数据库字段命名规则A_COLUMN转换为Java使用的驼峰式命名规则aCloumn -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
</configuration>

Mybatis接口及映射文件模板

这里使用了接口式编程方式,为每一个映射文件指定一个映射接口。考虑到每种基础数据都会对应着CRUD的操作,所以这里对映射文件中的一些元素的命名规则进行统一设计,且提供了映射接口的基接口。

如果其他DAO接口需要增加额外的方法,只需要继承此接口并定义额外的方法签名即可。

基类接口

package com.emerson.etao.dao;

import java.util.List;

/**
 * DAO基类接口
 * 使用此接口规范Mybatis映射文件中相应元素的id命名,所有映射文件接口需继承此接口
 * 
 * @author Chris Mao(Zibing)
 *
 * @param <T>
 */
public interface IBaseDao<T> {
	
	/**
	 * 规则Id值查询相应的数据表记录
	 * 
	 * @param id
	 * @return T
	 */
	public T getById(int id);
	
	/**
	 * 获取数据表中所有记录
	 * 
	 * @return List
	 */
	public List<T> getAll();
	
	/**
	 * 将数据插入到数据表中
	 * 
	 * @param entity
	 * @return 写入成功的记录条数
	 */
	public int insert(T entity);
	
	/**
	 * 将数据批量插入到数据表中
	 * 
	 * @param entities
	 * @return 写入成功的记录条数
	 */
	public int batchInsert(List<T> entities);
	
	/**
	 * 更新数据表中记录
	 * 
	 * @param entity
	 * @return 更新成功的记录条数
	 */
	public int update(T entity);
	
	/**
	 * 删除指定id的数据表记录
	 * 
	 * @param id
	 * @return 删除的记录条数
	 */
	public int delete(int id);
	
	/**
	 * 批量删除数据表记录
	 * @param ids
	 * @return 删除的记录条数
	 */
	public int batchDelete(List<Integer> ids);
	
	/**
	 * 查找符合条件的记录
	 * 
	 * @param entity
	 * @return List
	 */
	public List<T> find(T entity);

}

接口中的每一个方法,分别对应着Mybatis映射文件中不同的元素的id值。

这里对find方法简单说明一下,因为Mybatis映射文件中只允许指定一个传入参数,而查询往往会用到多条件的查询的,所以使用了一个小技巧,只需使用set方法将查询条件赋值到相应的实体类对象属性中,然后将这个对象作为一个查询参数传入即可,在映射文件中根据传入实体类对象的属性值动态的生成SQL语句。

映射文件模板

需要在留空的属性处填写实际的内容。

<?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="Java接口全限定名">
    <sql id="selectColumns">FIELD LIST</sql>

    <sql id="insertColumns">FIELD LIST</sql>

    <select id="getById" parameterType="int" resultType="">
        SELECT
        <include refid="selectColumns"></include>
        FROM TABLENAME WHERE KEY_FIELD = #{id}
    </select>

    <select id="getAll" resultType="">
        SELECT
        <include refid="selectColumns"></include>
        FROM TABLENAME ORDER BY KEY_FIELD
    </select>

    <!-- 插入数据并返回主键值,注意,这里的KeyProperty应该是Java类里的属性名称,而非数据表中的字段名 -->
    <insert id="insert" parameterType="" useGeneratedKeys="true" keyProperty="">
        INSERT INTO
        TABLENAME(<include refid="insertColumns"></include>)
        VALUES()
    </insert>

    <!-- 批量新增 -->
    <insert id="batchInsert" parameterType="java.util.List">
        INSERT INTO TABLENAME(<include refid="insertColumns"></include>) VALUES
        <foreach collection="list" item="c" separator=",">
            ()
        </foreach>
    </insert>

    <!-- 更新数据 -->
    <update id="update" parameterType="">
        UPDATE TABLENAME
        <set>
        </set>
        WHERE KEY_FIELD = #{}
    </update>

    <!-- 根据传入的Id值,删除单条记录 -->
    <delete id="delete" parameterType="int">
        DELETE FROM TABLENAME WHERE KEY_FIELD = #{id}
    </delete>

    <!-- 根据传入的Id值列表,删除多条记录 -->
    <delete id="batchDelete" parameterType="java.util.List">
        DELETE FROM TABLENAME WHERE KEY_FIELD in
        <foreach collection="list" item="item" index="index" open="("
            close=")" separator=",">
            #{item}
        </foreach>
    </delete>
</mapper>

Service接口设计及实现

我们对映射文件及Dao接口都设计了一些规范,那么Service接口自然也不会例外了。这里将通用的方法提取出来,编写了Service的基础接口及实现,后面所有的接口都需继承自此接口和实现。

 

package com.emerson.etao.service;

import java.util.List;

/**
 * 服务层基础接口,所有服务接口需继承此接口
 * 
 * @author Chris Mao(Zibing)
 *
 */
public interface IBaseService<T> {

	/**
	 * 规则Id值查询相应的数据表记录
	 * 
	 * @param id
	 * @return T
	 */
	public T getById(int id);
	
	/**
	 * 获取数据表中所有记录,如果参数pageIndex不为0,则返回指定页面数据,否则返回所有数据
	 * 
	 * @param pageIndex 页面索引,0表示不分页
	 * @return
	 */
	public List<T> getAll(int pageIndex);
	
	/**
	 * 将数据插入到数据表中
	 * 
	 * @param entity
	 * @return 写入成功的记录条数
	 */
	public int insert(T entity);
	
	/**
	 * 将数据批量插入到数据表中
	 * 
	 * @param entities
	 * @return 写入成功的记录条数
	 */
	public int batchInsert(List<T> entities);
	
	/**
	 * 更新数据表中记录
	 * 
	 * @param entity
	 * @return 更新成功的记录条数
	 */
	public int update(T entity);
	
	/**
	 * 删除指定id的数据表记录
	 * 
	 * @param id
	 * @return 删除的记录条数
	 */
	public int delete(int id);
	
	/**
	 * 批量删除数据表记录
	 * @param ids
	 * @return 删除的记录条数
	 */
	public int batchDelete(List<Integer> ids);
	
	/**
	 * 查找符合条件的记录
	 * 
	 * @param entity
	 * @return List
	 */
	public List<T> find(T entity);
}

接口实现

 

 

package com.emerson.etao.service.impl;

import java.util.List;

import com.emerson.etao.dao.IBaseDao;
import com.emerson.etao.service.IBaseService;
import com.github.pagehelper.PageHelper;

/**
 * 服务层实现类基类
 * 
 * 所有务服层接口实现类须继承此类,且必须覆盖抽象方法getBaseDao(),以便在基础方法中获取与数据库交互的dao对象
 * 
 * 例子:
 * 
 * @Service("communicatorService") public class CommunicatorServiceImpl extends
 * IBaseServiceImpl<Communicator> implements ICommunicatorService {
 * 
 *     @Resource private ICommunicatorDao dao;
 *
 *     @Override protected IBaseDao<Communicator> getBaseDao() { return this.dao; }
 * }
 * 
 * @author Chris Mao(Zibing)
 *
 * @param <T>
 */
public abstract class BaseServiceImpl<T> implements IBaseService<T> {

	protected abstract IBaseDao<T> getBaseDao();

	@Override
	public T getById(int id) {
		return this.getBaseDao().getById(id);
	}

	@Override
	public List<T> getAll(int pageIndex) {
		if (pageIndex > 0) {
			int pageSize = (pageIndex == 0) ? 0 : 10;
			PageHelper.startPage(pageIndex, pageSize);
		}
		return this.getBaseDao().getAll();
	}

	@Override
	public int insert(T entity) {
		return this.getBaseDao().insert(entity);
	}

	@Override
	public int batchInsert(List<T> entities) {
		return this.getBaseDao().batchInsert(entities);
	}

	@Override
	public int update(T entity) {
		return this.getBaseDao().update(entity);
	}

	@Override
	public int delete(int id) {
		return this.getBaseDao().delete(id);
	}

	@Override
	public int batchDelete(List<Integer> ids) {
		return this.getBaseDao().batchDelete(ids);
	}

	@Override
	public List<T> find(T entity) {
		return this.getBaseDao().find(entity);
	}

}

 

附录

Mybatis系列(一)入门

Mybatis系列(二)配置

Mybatis系列(三)简单示例

Mybatis系列(四)映射文件

ybatis系列(五)动态SQL

Mybatis系列(六)接口式编程

Mybatis系列(七)关联映射

Mybatis系列(八)集合映射

Mybatis系列(九)Spring & Mybatis整合

 

  • 大小: 548.4 KB
  • 大小: 354.9 KB
分享到:
评论
2 楼 禹爸爸 2015-10-19  
despair1989 写道
请检查一下附录里的链接地址。链接地址错了

哪些错了?
1 楼 despair1989 2015-10-19  
请检查一下附录里的链接地址。链接地址错了

相关推荐

    springmybatis

    mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis实战教程mybatis in action之三实现数据的增删改查 mybatis实战教程mybatis in action之四实现...

    互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析

    《互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析》Spring 源码剖析篇基于Spring 4.3.2 版本,剖析了Spring 上下文、Spring AOP 和Spring 事务的实现,并通过实例展示了框架陷阱的隐蔽性及学习...

    Spring3MVC+MyBatis+ExtJs3整合开发系列之四:角色管理模块

    在本篇博文中,我们将深入探讨“Spring3MVC+MyBatis+ExtJs3整合开发系列之四:角色管理模块”。这个主题涉及到三个关键的技术栈:Spring MVC作为后端MVC框架,MyBatis作为持久层解决方案,以及Ext Js 3作为前端UI库...

    java,Javaweb开发,spring+springmvc+mybatis整合视频及maven使用及实战视频

    本篇将详细介绍 Java Web 开发的基础知识,包括 Java Web 的概念、常用框架(Spring、Spring MVC 和 MyBatis)以及构建工具 Maven 的使用。 ### Java Web 概念 Java Web 主要指通过 Java 技术来实现的 Web 应用...

    Mybatis由浅入深 - 02基础CRUD

    这是Mybatis系列的第2篇,重实战,说人话,讲干活,全部原创,不抄袭,博文地址:https://blog.csdn.net/scm_2008/article/details/126574504 欢迎各位下载学习

    jee、spring、spring mvc、mybatis 学习(五)

    在本篇【jee、spring、spring mvc、mybatis 学习(五)】中,我们将深入探讨四个关键的Java企业级开发技术:Java EE(Java Enterprise Edition)、Spring框架、Spring MVC以及MyBatis。这些技术是现代Java Web应用...

    jee、spring、spring mvc、mybatis 学习(十)

    在本篇博客“JEE、Spring、Spring MVC、MyBatis 学习(十)”中,作者深入探讨了这四个关键的Java企业级开发技术,它们是构建现代Web应用程序的基础。下面将对这些技术进行详细阐述。 1. JEE(Java Enterprise ...

    【疯狂软件】Spring+mybaits企业实战

    在本篇关于《疯狂软件》系列图书的内容介绍中,我们关注的是以Spring框架和MyBatis持久层框架为核心的Java企业级应用实战。Spring框架是一个开源的Java平台,主要负责简化企业级应用开发,它能够提供企业服务的抽象...

    JAVAWEB开发实战经典(李兴华)配套视频下载地址

    它包括了一系列的技术标准,如Servlet、JSP等,以及相关的API,用于构建动态网站或Web应用程序。 - **发展历程:** JavaWeb技术自1990年代末期开始发展,随着互联网技术的发展,经历了多个版本的更新和完善。 **2. ...

    javaweb开发实战1200例第二卷源码

    本书内容丰富,共分为7篇23章,包含了600个实例及相应的600个技巧,覆盖了从基础到高级的各个层次,旨在为开发者提供详尽的指导和实用的解决方案。 首先,让我们来看看Java Web开发的基础知识。Java Web开发主要...

    基于Java的大众点评项目实战设计源码

    本篇文章将对基于Java的大众点评项目实战设计源码进行深度剖析,帮助读者理解并掌握相关技术要点。 首先,项目采用Java作为主要开发语言,体现了Java在大型复杂系统中的应用能力。Java的面向对象特性使得代码结构...

    Android代码-java-bible

    java-bible 这里记录了一些技术摘要,部分文章来自网络,本项目的目的力求分享精品技术干货,以Java为主。 如果你喜欢,star 便是,持续...MyBatis中文指南 Apache Shiro 用户指南 Spring Boot参考指南 Netty4 用户指南

    J2EE高级框架实战

    本篇内容将深入探讨J2EE高级框架的实战应用。 1. **Spring框架**:作为J2EE最广泛使用的框架之一,Spring提供了一个全面的应用开发框架,包括依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)和数据访问。...

    SpringBoot与Shiro整合-权限管理实战视频+源码

    4. **自动配置Spring**:Spring Boot基于Spring框架进行了一定程度的封装,提供了一系列约定优于配置的设置,让Spring应用变得更加简单易用。 5. **应用监控**:提供了对应用状态的实时监控功能。 #### 二、Apache ...

    [轻量级Java_EE企业应用实战

    根据提供的标题、描述和标签,我们可以推断出这篇文章主要探讨的是“轻量级Java EE企业应用实战”的相关内容。虽然给出的部分内容仅为一个重复的链接,我们依然可以从标题和描述出发,构建一系列与轻量级Java EE企业...

    一个很有用的sturts实战项目

    通过这个实战项目,开发者可以学习到如何将 Struts 与 JDBC、Hibernate 或 MyBatis 等持久层框架集成,处理表单数据,实现动态导航,以及使用 AJAX 进行异步通信等。同时,也可以提升对 MVC 设计模式的理解,增强...

    GameStore.zip

    本篇文章将深入探讨如何利用Spring、SpringMVC、MyBatis三大主流Java框架,结合MySQL数据库,构建一个名为“GameStore”的游戏商店系统。该系统涵盖了游戏的上架、下架、价格调整、图片管理以及客户端的预览、购买和...

    24.1 SpringCloud电商实战2

    在本篇中,我们将深入探讨"24.1 SpringCloud电商实战2"的主题,这是对SpringCloud电商项目系列的延续,旨在提供一个基于Spring Cloud的实际应用案例。在上一部分"24.1 SpringCloud电商实战1"中,我们可能已经构建了...

    java自学路线图(超全超详细)

    * Redis:推荐《Redis 深度历险:核心原理与应用实战》,视频可以观看 B 站上的视频。 * MongoDB:推荐《MongoDB 权威指南》,视频可以观看 B 站上的视频。 框架大部分 框架大部分是 Java 学习的第三部分,包括 ...

    从0开始-大数据技术学习思路.docx

    推荐阅读《Spring 实战(第 4 版)》、《精通 SpringMVC(第四版)》、《MyBatis 从入门到精通》和《Spring Boot 编程思想(核心篇)》。 6. **分布式服务**:了解 Linux 基础,Maven 构建工具,以及 Apache Dubbo ...

Global site tag (gtag.js) - Google Analytics