mybatisとspringの統合(sql Sessionを使ってcrud)

56994 ワード

前回紹介しましたが、インタフェースを使う方法によって、dao層が大幅に節約されました.ファイルの配置とインタフェースだけで実現できます.今回紹介したのはsplsessionを通じてdaoを実現する方法です.
先に言わないでください.上のプロファイル:
1、web.xml
<?xml version="1.0" encoding="UTF-8"?>

<web-app  xmlns="http://xmlns.jcp.org/xml/ns/javaee"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

          version="3.1">



  <display-name>Archetype Created Web Application</display-name>





    <!--  spring-->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>classpath:application.xml</param-value>

    </context-param>



    <!--springmvc DispathcherServlet-->

    <servlet>

        <servlet-name>action</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>classpath:spring-mvc.xml</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>

        <servlet-name>action</servlet-name>

        <url-pattern>*.action</url-pattern>

    </servlet-mapping>



</web-app>
 
2、appication.xml
<?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:tx="http://www.springframework.org/schema/tx"

       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/tx  http://www.springframework.org/schema/tx/spring-tx.xsd

                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">



    <!--spring  -->

    <context:component-scan base-package="com.seven"/>



    <!--           -->

    <context:property-placeholder location="classpath:jdbc.properties"/>



    <!--   -->

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

        <property name="jdbcUrl" value="${jdbcUrl}"/>

        <property name="driverClass" value="${driverClass}"/>

        <property name="user" value="${user}"/>

        <property name="password" value="${password}"/>

    </bean>



    <!--mybatis   sqlsessionFactoryNean-->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <property name="dataSource" ref="dataSource"/>

      <!--  <property name="configLocation" value="classpath:conf.xml"/>-->

        <property name="mapperLocations" value="classpath:com/seven/dao/*.xml"/>

        <property name="typeAliasesPackage" value="com.seven.domain"/><!---->

    </bean>



    <!--                  -->

   <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">

        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>

        <property name="mapperInterface" value="com.seven.dao.UserMapper"/>

    </bean>-->



    <!--mybatis          :mapperScannerConfigurer-->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

        <property name="basePackage" value="com.seven.dao"/><!--          -->

       <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory"/>-->

        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

     </bean>





    <!--     -->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource"/>

    </bean>





   <!-- <context:component-scan base-package="com.seven.*">

        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

    </context:component-scan>-->



    <!--    -->

    <tx:annotation-driven transaction-manager="transactionManager"/>



</beans>
3.sprin-mvc.xml
<?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:mvc="http://www.springframework.org/schema/mvc"

       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

                            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">





    <!--spring     -->

    <context:component-scan base-package="com.seven"/>



    <!--springmvc    -->

    <mvc:annotation-driven/>





    <!--      -->

    <mvc:resources location="/resources/" mapping="/resources/**"/>

    <mvc:resources location="/upload/" mapping="/upload/**"/>



    <!--         -->

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <property name="maxUploadSize" value="10485670"/> <!-- 10M -->

    </bean>



    <mvc:interceptors>

        <mvc:interceptor>

            <mvc:mapping path="/admin/**"/>

            <mvc:exclude-mapping path="/admin/loginUI.action"/>

            <mvc:exclude-mapping path="/admin/managerLogin.action"/>

            <mvc:exclude-mapping path="/admin/validateManager.action"/>

            <bean class="com.seven.interceptor.CheckLoginInterceptor"/>

        </mvc:interceptor>

    </mvc:interceptors>



    <!--       -->

    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property name="prefix" value="/WEB-INF/views/"/>

        <property name="suffix" value=".html"/>

    </bean>



</beans>
4、関連配置ファイル
jdbc.properties
jdbcUrl=jdbc:mysql://localhost:3306/db_articlemanage

driverClass=com.mysql.jdbc.Driver

user=root

password=root
5、javabean
例えばUser
package com.seven.domain;





import org.apache.ibatis.type.Alias;



import java.io.Serializable;

import java.util.Set;



/**

 * Created by Seven on 2015/5/29.

 */



public class User implements Serializable{



    private Long id;

    private String loginname;

    private String username;

    private String password;

    private String intro;



    private Set<Role> roles;



    public Long getId() {

        return id;

    }



    public void setId(Long id) {

        this.id = id;

    }



    public String getLoginname() {

        return loginname;

    }



    public void setLoginname(String loginname) {

        this.loginname = loginname;

    }



    public String getUsername() {

        return username;

    }



    public void setUsername(String username) {

        this.username = username;

    }



    public String getPassword() {

        return password;

    }



    public void setPassword(String password) {

        this.password = password;

    }



    public String getIntro() {

        return intro;

    }



    public void setIntro(String intro) {

        this.intro = intro;

    }



    public Set<Role> getRoles() {

        return roles;

    }



    public void setRoles(Set<Role> roles) {

        this.roles = roles;

    }





}
User対応の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           -->

<mapper namespace="User">



    <!--user    -->

    <resultMap id="userResult" type="User">

        <result column="id" property="id"/>

        <result column="loginname" property="loginname"/>

        <result column="username" property="username"/>

        <result column="password" property="password"/>

        <result column="intro" property="intro"/>

  

    </resultMap>

   

    <!--         id -->

    <insert id="insert" parameterType="map">

        insert into tb_user(loginname,username,password,intro)

        values(#{loginname},#{username},#{password},#{intro})

    </insert>



    <update id="update">

        update tb_user

        set loginname = #{loginname},

        username = #{username},

        password = #{password},

        intro = #{intro}

        where id = #{id}

    </update>



    <delete id="delete">

        delete from tb_user

        where id = #{id}

    </delete>



    <select id="findById" resultMap="userResult">

        select *

        from tb_user

        where id = #{id}

    </select>



    <select id="findAll" resultMap="userResult">

        select *

        from tb_user

    </select>



    <select id="findByIds" resultMap="userResult">

        select *

        from tb_user

        where id IN (#{ids})

    </select>



    <select id="getPage" resultMap="userResult" parameterType="map">

        select *

        from tb_user

        LIMIT #{startIndex},#{pageSize}

    </select>



    <select id="findByloginnameAndPwd" resultMap="userResult">

        SELECT *

        FROM tb_user

        WHERE loginname=#{loginname}

        AND password=#{password}

    </select>



</mapper>
7.queryhepler
package com.seven.utils;





import java.util.HashMap;

import java.util.Map;



/**

 * Created by Seven on 2015/6/12.

 */

public class QueryHelper {



    private String nameSpace;

    private String methodId;

    private Object param;

    private Map<String,Object> params;



    /**

     *       .

     * @param nameSpace

     * @return

     */

    public QueryHelper setNameSpace(String nameSpace){

        this.nameSpace = nameSpace;

        return this;

    }



    /**

     *   dao   ID.

     * @param methodId

     * @return

     */

    public QueryHelper setMethodId(String methodId){

        this.methodId = methodId;

        return this;

    }



    /**

     *       .

     * @param param

     * @return

     */

    public QueryHelper setParam(Object param){

        this.param = param;

        return this;

    }



    /**

     *       .

     * @param key

     * @param value

     * @return

     */

    public QueryHelper setParams(String key,Object value){

        if(params == null){

            params = new HashMap<String, Object>();

        }

        params.put(key,value);

        return this;

    }



    /**

     *       .

     * @return

     */

    public Object getParam(){

        return param;

    }



    /**

     *       .

     * @return

     */

    public Map<String,Object> getParams(){

        return params;

    }



    /**

     *        .

     * @return

     */

    public Object getRealParams(){

        return param == null ? params : param;

    }





    /**

     *     .

     * @return

     */

    public String getMethod(){

        return nameSpace+"."+methodId;

    }







}
8、dao Supportとdao Support Impl
daosuport
package com.seven.base;







import com.seven.utils.QueryHelper;



import java.util.List;

import java.util.Map;



/**

 * Created by Seven on 2015/6/12.

 */

public interface DaoSupport {



    public void insert(QueryHelper queryHelper);



    public void insert(String method,Object param);



    public void delete(QueryHelper queryHelper);



    public void delete(String method,Object o);



    public void update(QueryHelper queryHelper);



    public void update(String method,Object o);



    public<T> T select(QueryHelper queryHelper);



    public<T> T select(String method,Object o);



    public<T> List<T> selectList(QueryHelper queryHelper);



    public<T> List<T> selectList(String method,Object o);



    public<T> List<T> getPageData(int pageNum,int pageSize,QueryHelper queryHelper);

}
daosuport Impl
package com.seven.base;



import com.seven.utils.QueryHelper;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.springframework.stereotype.Repository;

import org.springframework.transaction.annotation.Transactional;



import javax.annotation.Resource;

import java.lang.reflect.ParameterizedType;

import java.util.List;

import java.util.Map;



/**

 * Created by Seven on 2015/6/12.

 */



@Repository("daoSupport")

@Transactional

public class DaoSupportImpl implements DaoSupport{



    @Resource

    private SqlSessionFactory sqlSessionFactory;



    private SqlSession sqlSession = null;



    /**

     *   sqlSession.

     * @return

     */

    public SqlSession getSqlSession(){

        if(sqlSession==null){

            sqlSession = sqlSessionFactory.openSession();

        }

        return sqlSession;

    }





    /**

     *   .

     * @param queryHelper

     */

    public void insert(QueryHelper queryHelper) {

        getSqlSession().insert(queryHelper.getMethod(),queryHelper.getRealParams());

    }



    /**

     *   .

     * @param method

     * @param param

     */

    public void insert(String method, Object param) {

        getSqlSession().insert(method,param);

    }



    /**

     *   .

     * @param queryHelper

     */

    public void delete(QueryHelper queryHelper) {

        getSqlSession().delete(queryHelper.getMethod(),queryHelper.getRealParams());

    }



    /**

     *   .

     * @param method

     * @param o

     */

    public void delete(String method, Object o) {

        getSqlSession().delete(method,o);

    }



    /**

     *   .

     * @param queryHelper

     */

    public void update(QueryHelper queryHelper) {

        getSqlSession().update(queryHelper.getMethod(),queryHelper.getRealParams());

    }



    /**

     *   .

     * @param method

     * @param o

     */

    public void update(String method, Object o) {

        getSqlSession().update(method,o);

    }



    /**

     *     .

     * @param queryHelper

     * @param <T>

     * @return

     */

    public <T> T select(QueryHelper queryHelper) {

        return getSqlSession().selectOne(queryHelper.getMethod(),queryHelper.getRealParams());

    }



    /**

     *     .

     * @param method

     * @param o

     * @param <T>

     * @return

     */

    public <T> T select(String method, Object o) {

        return getSqlSession().selectOne(method,o);

    }



    /**

     *     .

     * @param queryHelper

     * @param <T>

     * @return

     */

    public <T> List<T> selectList(QueryHelper queryHelper) {

        return getSqlSession().selectList(queryHelper.getMethod(),queryHelper.getRealParams());

    }



    /**

     *     .

     * @param method

     * @param o

     * @param <T>

     * @return

     */

    public <T> List<T> selectList(String method, Object o) {

        return getSqlSession().selectList(method,o);

    }



    /**

     *     .

     * @param method

     * @param <T>

     * @return

     */

    public <T> List<T> selectWithoutParams(String method) {

        return getSqlSession().selectList(method);

    }



    /**

     *     .

     * @param pageNum

     * @param pageSize

     * @param queryHelper

     * @param <T>

     * @return

     */

    public <T> List<T> getPageData(int pageNum, int pageSize, QueryHelper queryHelper) {

        return null;

    }

}
9、以上の配置と実現によって、簡単にデータベースを操作できます.
この中で検索ヘルプクラスは検索を助けるために使われます.その原理は名前空間をつなぎ合わせてパラメータを設定し、検索しやすいです.
例えば、改ページデータを照会する
 /**

     *       .

     * @param pageNum

     * @return

     */

    public Page getPageData(int pageNum){

        int totleRecord = daoSupport.select("Article.getTotleRecord",null);

        Page page = new Page(pageNum, Configuration.pageSize,totleRecord);

        QueryHelper helper = new QueryHelper();

        helper.setNameSpace("Article")

                .setMethodId("getPageData")

                .setParams("startIndex",page.getStartIndex())

                .setParams("pageSize",page.getPageSize());

        List list = daoSupport.selectList(helper);

        page.setList(list);

        return page;

    }
生まれつき書くことができませんが、皆さんに共有したいです.何か問題がありましたら、ご指摘ください.