思路
通过注解拦截到需要进行数据持久化操作的类,获取所所携带的注解信息,及dao层接口的请求路径,通过工厂创建实例注入到所需的类中
步骤
1构建所需的注解
mapper注解,用于注册dao层接口
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Mapper {
public String name() default "";
}
Dbsupport注解,用于注入mybatis实例
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Dbsupport {
public String mapperName() default "";
}
2在dao层中进行mapper注解将其注册到baen仓库
@Mapper(name="testMapper")
public interface testMapper {
public String getUser();
}
3在需要调用dao层的目标类中进行Dbsupport注解,注入依赖
@Service(name="testService")
public class testService {
@Dbsupport(mapperName="testMapper")
public testMapper mapper;
public String getUser(){
String user="";
try{
System.out.println("service="+mapper.getUser());
user=mapper.getUser();
}catch(Exception e
){
System.out.println(e);
}
return user;
}
}
4,核心,依赖注入操作
首先根据配置文件建立一个session对象
//mybatis的配置文件
String resource = "conf.xml";
//使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
InputStream is = SocketHandler.class.getClassLoader().getResourceAsStream(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sessionFactory.openSession();
然后根据拦截到的注解信息,生成session所需的映射类生成session类实例化后注入到目标类
//获取目标类的所有属性
Field[] field2 = class2.getDeclaredFields();
if(field2 != null&&field2.length>0){
for(Field fie2 : field2){
if(fie2.isAnnotationPresent(Dbsupport.class)){
Dbsupport dbsupport=fie2.getAnnotation(Dbsupport.class);
//获取mapperName
String dbame= dbsupport.mapperName();
String DbName="";
//通过mapperName在bean仓库获取到对应的mapper类名
DbName = (String) SummerBeanCreat.beanMap.get(dbame);
if(DbName!=null&&DbName.length()>0){
//通过mapper类名获取对应的mapper类
Class class3 = Class.forName(DbName);
Object obj=session.getMapper(class3);
//注入
try{
fie2.set(Injectobj , obj);}
catch(Exception e){
System.out.println(e);
}
}
}
}
}
5请求结束后关闭session
Method m = c.getMethod(methodName, Map.class);
String respondMsg= (String) m.invoke(class1, paramMap);
System.out.println("返回值"+respondMsg);
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(respondMsg
.getBytes()));
response.headers().set(CONTENT_TYPE, "text/plain");
response.headers().set(CONTENT_LENGTH, response.content().readableBytes());
response.headers().set(CONNECTION, Values.KEEP_ALIVE);
session.close();
ctx.writeAndFlush(response);
效果
通过ajax发送http请求
function sendhttp(){
$.ajax({
type: "GET",
url: "http://localhost:8989/testaction/testmethod",
data: {
param1:"123",
param2:"321"
},
dataType:'jsonp',
async: false,
success: function(data){
console.log(data)
}
});
}
对应的sql文
<mapper namespace="summer.mapper.testMapper" >
<select id="getUser" resultType="String">
select
passWord
from
userInfo
</select>
</mapper>