1. 程式人生 > >idea下用maven建立並搭建dubbox微服務環境專案(四)——整理spring+mybaties(註解)

idea下用maven建立並搭建dubbox微服務環境專案(四)——整理spring+mybaties(註解)

 

目錄

1. jar包依賴 smbms-user-provider模組

2. 編寫dao及service實現類的修改(smbms-user-provider模組)

3. 配置spring(注入mybaties、dao、service)

4. 跨域訪問修改

5. 其他修改

6. 測試


第三篇連結地址:https://blog.csdn.net/gaofengyan/article/details/85238542

1. jar包依賴 smbms-user-provider模組

   spring+mybaties+整合包+資料庫驅動包

   1)mybaties jar 

        <!--mybaties  3.4 支援註解-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

   2)整合包

        <!--mybaties spring 整合包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

   3)資料庫驅動包

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.41</version>
        </dependency>

   4)dbcp資料庫緩衝池

        <!--dbcp資料庫緩衝池-->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.3</version>
        </dependency>

   5)spring-jdbc和spring事務的包

        <!--spring jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>3.2.9.RELEASE</version>
        </dependency>
        <!--spring 事務-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>3.2.9.RELEASE</version>
        </dependency>

2. 編寫dao及service實現類的修改(smbms-user-provider模組)

         UserMapper.java介面,這裡採用的時mybaties註解方式,即加如@Repository 註解就表示注入一個dao實現類,跟之前的SSM框架的dao介面加mapper.xml配置檔案相同效果,只是減少了程式碼量的編寫,但是這樣一來有一個弊端,就是在維護方面不靈活,修改程式碼很不容易。接下來看一下我們這種模式:

package cn.kgc1803.smbms_user_provider.dao;

import cn.kgc1803.smbms_common.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

/**
 * @Mapper 表示該介面是一個註解mybaties介面
 * @Repository 表示注入一個dao實現類
 */
@Mapper
@Repository
public interface UserMapper {
    //登陸
    @Select("SELECT id,userCode,userName\n" +
            "FROM smbms_user\t\n" +
            "WHERE userCode=#{userCode} and password=#{password}")
    @Results(id="userMap",value = {
            @Result(property = "id",column = "id",javaType =Integer.class ),
            @Result(property = "userName",column = "userName",javaType =String.class),
            @Result(property = "userCode",column = "userCode",javaType =String.class)
    })
    User loginUser(User u);
}

為了方便後面測試與資料庫關聯,這裡將service更改如下:

   UserServiceImpl.java類:

package cn.kgc1803.smbms_user_provider.service;

import cn.kgc1803.smbms_common.pojo.User;
import cn.kgc1803.smbms_common.service.UserService;
import cn.kgc1803.smbms_user_provider.dao.UserMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service("userService")
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;
    public User loginUser(User u) {
        return userMapper.loginUser(u);
//        if (u.getUserCode().equals("zhangsan") && u.getPassword().equals("123")){
//            u.setUserName("張三");
//            return u;
//        }else {
//            return null;
//        }
    }
}

         OrderServiceImpl.java類,這裡暫時把引數去掉,公共模組的對應方法介面引數也要去掉引數,這裡不做程式碼展示了,因為smbms_order表沒有資料,這裡暫時給定值: 

package cn.kgc1803.smbms_user_provider.service;

import cn.kgc1803.smbms_common.pojo.Order;
import cn.kgc1803.smbms_common.service.OrderService;
import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import java.util.ArrayList;
import java.util.List;
//@Produces設定輸出結果集的 資料型別
@Path("/order")
@Produces(ContentType.APPLICATION_JSON_UTF_8)
public class OrderServiceImpl implements OrderService {
    //@Path訪問路徑
    //@GET請求方式
    @Path("/orderlist")
    @GET
    public List<Order> findList() {//@PathParam("userId") Integer userId
        List<Order> orders = new ArrayList<Order>();
        Order o = new Order();
        o.setId(10);
        o.setOwnerUserId(11);
        o.setAmount(33);
        o.setPrice(55.3);
        o.setProductName("華為p8");
        orders.add(o);
        return orders;
    }
}

3. 配置spring(注入mybaties、dao、service)

     3.1) 配置資料庫連線的配置檔案,database.properties

jdbc.driver=com.mysql.jdbc.Driver
#在和mysql傳遞資料的過程中,使用unicode編碼格式,並且字符集設定為utf-8
jdbc.url=jdbc:mysql://localhost:3306/dubbo-smbms?useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=******

      3.2)新建一個spring 配置檔案  spring-service.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"
       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">

    <!--引入配置檔案-->
    <context:property-placeholder location="classpath:database.properties"/>

    <!--注入dataSource-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--注入sessionFactory-->
     <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         <property name="dataSource" ref="dataSource"/>
     </bean>

    <!--注入dao mapper-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
        <property name="basePackage" value="cn.kgc1803.smbms_user_provider.dao"/>
    </bean>

    <!--注入service-->
    <context:component-scan base-package="cn.kgc1803.smbms_user_provider.service"/>

</beans>

     3.3)dubbo_user_provider.xml配置檔案修改釋出服務的延遲時間timeout="10000",避免再發布後執行資料庫造成時間超過1秒斷接:

    <!-- 釋出服務 -->
    <dubbo:service protocol="dubbo" interface="cn.kgc1803.smbms_common.service.UserService" ref="userService" timeout="10000" />
    <dubbo:service protocol="rest" interface="cn.kgc1803.smbms_common.service.OrderService" ref="orderService" timeout="10000"/>

4. 跨域訪問修改

昨天的工程在測試的時候頁面跑不出資料,出現的錯誤是跨域問題,為了相容,可以通過中間層controller進行對接,如下修改:

order.js----->url:"http://localhost:8081/order/orderlist.html",

$(function () {
    $.ajax({
        url:"http://localhost:8081/order/orderlist.html",
        dataType:"json",
        data:"userId=10",
        success:function (orderList) {
            var ul=$('ul');
            $.each(orderList,function (index,item) {
                ul.append('<li>'+item.productName+'</li>');
            });
        }
    });
});

smbms-user-consume模組的controller新建OrderController.java類:

package cn.kgc1803.smbms_user_consume.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

@Controller
@RequestMapping("/order")
public class OrderController {

    @RequestMapping("/orderlist.html")
    public void getOrderListJson(HttpServletResponse response){
        response.setCharacterEncoding("UTF-8");//字元編碼處理
        try {
            //請求輸出流
            OutputStream out = response.getOutputStream();
            //獲取遠端的dubbo rest資料
            //請求地址
            URL url = new URL("http://localhost:20888/order/orderlist");
            //建立連線
            URLConnection conn = url.openConnection();
            //輸入流,獲取請求結果集對應的輸入流
            InputStream in = conn.getInputStream();
            //以陣列方式讀取資料
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            while (len != -1){ //讀完為止
                //迴圈讀取檔案內容
                out.write(buf,0,len);
                len = in.read(buf);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

       以上這種rest風格的承接,對多方面的使用都比較安全,我們的service服務放到了dubbo容器作為提供者往註冊中心注入服務為消費者controller提供消費對接,外界訪問service層的時候用Ajax通過controller層再轉接到service層,這樣的訪問提高了安全效率。使用諸如:手機獲取的天氣預報(隨時接收更新);做社保局的資料訪問方面的業務等,都適合。


5. 其他修改

    5.1)完善三個模組的日誌補充,以便執行的時候查詢問題,直接將之前的log4j.properties檔案複製使用即可。

    5.2)smbms-user-provider模組需要載入兩個配置檔案:dubbo_user_provider.xml 和 spring-service.xml 。因為我們用的是直接測試類TestProvider.java,因此夾在兩個配置檔案需要用陣列的方式更好,修改如下:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestProvider {
    public static void main(String[] args){
        //以陣列的方式載入配置檔案
        String[] xmls = {"dubbo_user_provider.xml","spring-service.xml"};
        //載入spring配置檔案
        ApplicationContext ctx = new ClassPathXmlApplicationContext(xmls);
        try {
            //執行緒休眠10分鐘,保證測試啟動後,dubbo服務可使用的時間
            Thread.sleep(60*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

6. 測試

資料庫表:

連線服務後進行頁面測試:

登陸頁面:

登陸後的首頁:

今天就到此了吧,明天繼續,希望不會犯糊塗,這幾天也是搞的不容易。很多地方沒有寫的很明白,後面再繼續更新完善!