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. 测试

数据库表:

连接服务后进行页面测试:

登陆页面:

登陆后的首页:

今天就到此了吧,明天继续,希望不会犯糊涂,这几天也是搞的不容易。很多地方没有写的很明白,后面再继续更新完善!

猜你喜欢

转载自blog.csdn.net/gaofengyan/article/details/85252856