idea下用maven建立並搭建dubbox微服務環境專案(四)——整理spring+mybaties(註解)
目錄
1. jar包依賴 smbms-user-provider模組
2. 編寫dao及service實現類的修改(smbms-user-provider模組)
3. 配置spring(注入mybaties、dao、service)
第三篇連結地址: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. 測試
資料庫表:
連線服務後進行頁面測試:
登陸頁面:
登陸後的首頁:
今天就到此了吧,明天繼續,希望不會犯糊塗,這幾天也是搞的不容易。很多地方沒有寫的很明白,後面再繼續更新完善!