您的位置:首页 > 编程语言 > Java开发

idea下用maven创建并搭建dubbox微服务环境项目(四)——整理spring+mybaties(注解)

2018-12-25 21:26 645 查看
版权声明:转载请标明出处: https://blog.csdn.net/gaofengyan/article/details/85252856

 

目录

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 

[code]        <!--mybaties  3.4 支持注解-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>

   2)整合包

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

   3)数据库驱动包

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

   4)dbcp数据库缓冲池

[code]        <!--dbcp数据库缓冲池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.3</version>
</dependency>

   5)spring-jdbc和spring事务的包

[code]        <!--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配置文件相同效果,只是减少了代码量的编写,但是这样一来有一个弊端,就是在维护方面不灵活,修改代码很不容易。接下来看一下我们这种模式:

[code]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类:

[code]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表没有数据,这里暂时给定值: 

[code]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

[code]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并作配置:

[code]<?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秒断接:

[code]    <!-- 发布服务 -->
<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",

[code]$(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类:

[code]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,因此夹在两个配置文件需要用数组的方式更好,修改如下:

[code]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. 测试

数据库表:

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

登陆页面:

登陆后的首页:

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: