jfinal整合mybatis

今天闲余时间整合了下jfinal和mybatis,废话不多说,直接上代码

public class SysConfig extends JFinalConfig{

@Override
public void configConstant(Constants me) {
}

@Override
public void configRoute(Routes me) {
    me.add("/", IndexController.class);
}

@Override
public void configEngine(Engine me) {
}

@Override
public void configPlugin(Plugins me) {
    MyBatisPlugin myBatisPlugin = new               MyBatisPlugin("mybatis.xml");
    myBatisPlugin.addMapper(SystemAdminMapper.class);
    me.add(myBatisPlugin);
}

@Override
public void configInterceptor(Interceptors me) {
   me.add(new MapperBeanInterceptor());
}

@Override
public void configHandler(Handlers me) {
} 
}

public class SqlSessionManager {
	
	private static final SqlSessionManager sqlSessionManager = new SqlSessionManager();
	
	private SqlSession sqlSession;
	
	public SqlSession getSqlSession() {
		return sqlSession;
	}

	public void setSqlSession(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
	}
	
	public static SqlSessionManager getSqlsessionmanager() {
		return sqlSessionManager;
	}

	private SqlSessionManager(){
		
	}
	
	public <T> T getMapper(Class<T> clazz){
		return sqlSession.getMapper(clazz);
	}
}
public class MyBatisPlugin implements IPlugin{
    private static final Log LOG = Log.getLog(MyBatisPlugin.class);
    private String mybatisConfigXml;
    private List<Class<?>> mapperClass = new ArrayList<Class<?>>();
    private static final SqlSessionManager sqlSessionManager = SqlSessionManager.getSqlsessionmanager();
    public MyBatisPlugin(String mybatisConfigXml){
        this.mybatisConfigXml = mybatisConfigXml;
    }

    public boolean start() {
        SqlSession sqlSession = getSqlSession();
        sqlSessionManager.setSqlSession(sqlSession);
        return true;
    }
    public void addMapper(Class<?> type){
       mapperClass.add(type);
    }
/**
* 获取SqlSession
* @return
*/
private SqlSession getSqlSession(){
    Reader reader = null;
    try {
        reader = Resources.getResourceAsReader(mybatisConfigXml);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        Configuration configuration = sqlSessionFactory.getConfiguration();
        for (Class<?>  mapper: mapperClass) {//注册接口
        //不知道此处是什么原因,服务器停止之后
        configuration.getMapperRegistry()仍存在之前添加的mapper代理对象
				
        //暂时没办法,只能这样搞了,希望有大神帮忙解决下
        if(configuration.getMapperRegistry().hasMapper(mapper)){
        	continue;
        }
        configuration.addMapper(mapper);
    }
    // 通过sqlSessionFactory打开一个数据库会话
    SqlSession sqlSession = sqlSessionFactory.openSession();
    return sqlSession;
} catch (IOException e) {
    LOG.error("can not get sqlSession",e);
}
    return null;
}

    public boolean stop() {
        sqlSessionManager.getSqlSession().close();
	return true;
    }
}
/**
 * mappr接口代理类注入
 * @author zengjintao
 * @version 1.0
 * @createTime 2018年6月3日上午11:09:21
 */
public class MapperBeanInterceptor implements Interceptor{

   private SqlSession sqlSession = SqlSessionManager.getSqlsessionmanager().getSqlSession();
@Override
public void intercept(Invocation inv) {
    Controller controller = inv.getController();
    Field[] fields = controller.getClass().getDeclaredFields();
    for (Field field : fields) {
    Object bean = null;
    if (field.isAnnotationPresent(Inject.class)){
        try {
            if(field.getType().isInterface()){
                bean = sqlSession.getMapper(field.getType());
            }
        } catch (Exception e) {
            throw new NullPointerException("can not get proxy bean");
        }
    }
    try {
      if (bean != null) {
        field.setAccessible(true);
        field.set(controller, bean);
      }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
     inv.invoke();
}
}
好了,以上代码完成mybatis和jfinal整合,下面上使用实例,首先mybatis配置文件
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!-- 打印查询语句 -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    
    
    <typeAliases>
       <package name="com.jfinal.mybatis.entity"/>
    </typeAliases>
    <environments default="development">
  
    <environment id="development">
      <transactionManager type="JDBC">
        <property name="" value=""/>
      </transactionManager>
      
      <dataSource type="UNPOOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/information"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
     <mapper resource="SystemAdminMapper.xml"/>
  </mappers>

</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.jfinal.mybatis.mapper.SystemAdminMapper">
  
  <resultMap type="SystemAdmin" autoMapping="true" id="SystemAdminResult">
    <id column="id" jdbcType="INTEGER" property="id"/>
    <result column="login_name" jdbcType="VARCHAR" property="loginName"/>
  </resultMap>
  
  <select id="getSystemAdmin" resultMap="SystemAdminResult" >
    select * from system_admin where 1=1
    <if test="loginName != null and loginName !=''">
       and login_name=#{loginName}
    </if>
  </select>
</mapper>

public class IndexController extends Controller{
   @Inject
   private SystemAdminMapper systemAdminMapper;
public void index(){
    SystemAdmin systemAdmin = new SystemAdmin();
    systemAdmin.setLoginName("admin");
    renderJson(systemAdminMapper.getSystemAdmin(systemAdmin)          );
}

}


评论区

l745230

2018-06-03 20:11

大兄弟,讲道理,这个分享搁在去年很有用,现在的话,enjoy更好

冰雨

2018-06-03 21:26

很简洁,点赞

JFinal

2018-06-03 22:21

虽然在 jfinal 有了 SQL 管理功能后 mybatis 已没有了任何优势:
http://www.jfinal.com/doc/5-13

但分享还是要先点赞

穿越123

2018-06-04 11:02

@JFinal 服务器停止之后再启动,
configuration.getMapperRegistry()仍然存在之前添加的mapper,好奇怪,不知道波总知道什么原因并不,请指教

JFinal

2018-06-04 11:11

@穿越123 很久没用 mybatis,忘得差不多了

穿越123

2018-06-04 11:30

@JFinal 嘿嘿,虽然现在不用jfinal了,但是一直关注jfinal

袁小猴

2019-06-03 15:54

@穿越123 奇怪的问题,解决了嘛?

穿越123

2019-06-04 15:34

@袁小猴 不记得了,之前记得好像解决了

追梦人111111

2020-03-17 09:43

大佬,你之前说的问题解决了没