ERP如何集成MyBatis
一、下载jar包等相关文件
主要有三个jar包:
- mybatis-3.2.7.jar
- db2jcc_license_cu.jar
- db2jcc.jar
下载地址:
注意:此处链接点开如果显示页面不存在,则需要手动复制链接到浏览器地址栏里打开
https://pan.baidu.com/s/1kZ4wdbOW4yLV9BDCKsOlMw
下载完之后将下载的zip包中的mybatis-3.2.7.jar,db2jcc_license_cu.jar,db2jcc.jar文件拷贝出来放到ERP环境中的WEB-INF/lib下,然后右击jar包,Build Path->Add to Build Path,然后再复制一份mybatis-3.2.7.jar到tomcat下的tomcat6\tomcatCommon\lib_35下,自此jar包导入工作完毕。
注意:mybatis-3.2.7.jar中的源码为了适应ERP被本人修改过,切勿从其他地方下载jar包替换,否则必定会导致程序崩溃
二、应用mybatis
主要分为三个步骤
1. 编写mybatis的核心配置xml
xml文件名称由子系统别开头命名,比如wfjxMybatisConfig.xml,
wf代表在线审核系统,jx代表的是文件类型是xml,MybatisConfig是文件名称含义。文件放置目录如图下:
工程结构.png目录为wf/files/wfjxMybatisConfig.xml
wfjxMybatisConfig.xml文件内容为:
<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<!-- 设置数据库类型 -->
<property name="dialect" value="DB2"/>
</properties>
<settings>
<!-- 设置mybatis查询数据的时候null值也返回key-value -->
<setting name="callSettersOnNulls" value="true"/>
</settings>
<typeAliases>
<!-- 实体类所在package路径,这里根据各自系统而定,不要照抄 -->
<package name="com.icsc.xx.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jdbc/dsnjsteel"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper url="wf/files/mappers/*Mapper.xml" />
</mappers>
</configuration>
注意:需要将mappers下的mapper标签的url值改为各自系统的路径,以及实体类所在package路径需要改成自己系统的实体类路径,然后将上述代码直接复制使用。
2. 如何获取SqlSession
这里我编写了一个工具类来获取SqlSession,因为ERP下每个子系统的配置文件路径名不同,所以需要将工具类中的路径修改下既可应用到自己系统中,代码如下:
//注意,这里拷贝过去的时候需要将包路径修改下!
package com.icsc.wf.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class wfjcSqlSessionUtil {
public static SqlSessionFactory getSqlSessionFactory() {
try {
String classPath = wfjcSqlSessionUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath();
if (classPath.contains("WEB-INF")) {
classPath = classPath.substring(1, classPath.indexOf("WEB-INF"));
System.setProperty("rootPath", classPath);
}
classPath = "file:///" + classPath + "wf/files/wfjxMybatisConfig.xml";
InputStream inputStream = Resources.getUrlAsStream(classPath);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
注意:此处代码,需要将类名与加载的mybatisConfig配置的文件的文件名与路径改成自己系统的
3. DAO层编写
注意:此处DAO类编写与以往ERP的开发很不一样。
示例代码如下:
package com.icsc.wf.dao;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.icsc.wf.entity.wfjcGroupEntity;
import com.icsc.wf.entity.wfjcPageEntity;
import com.icsc.wf.util.wfjcSqlSessionUtil;
/**
* @desc 分组管理
* @author WangWeiWei
* @date 2018年5月16日 上午9:13:26
*/
public class wfjcGroupDao {
SqlSessionFactory sqlSessionFactory = wfjcSqlSessionUtil.getSqlSessionFactory();
public List<Map<String, Object>> findAll(Map<String, Object> keyMap, wfjcPageEntity page) {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
int totalCount = sqlSession.selectOne("wfjcGroupDao.getNum", keyMap);
if (page != null) {
list = sqlSession.selectList("wfjcGroupDao.findAll", keyMap, new RowBounds(page.getPageBeginCount(), page.getNumPerPage()));
page.setTotalCount(totalCount);
} else {
list = sqlSession.selectList("wfjcGroupDao.findAll", keyMap);
}
sqlSession.close();
return list;
}
/**
* @desc 创建分组
* @author WangWeiWei 020463
* @date 2018年5月16日 上午9:22:45
* @param group
* @return
* @throws Exception
*/
public int create(wfjcGroupEntity group) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
int lines = sqlSession.insert("wfjcGroupDao.create", group);
sqlSession.close();
return lines;
}
/**
* @desc 根据Id获取分组信息
* @author WangWeiWei 020463
* @date 2018年5月16日 上午11:06:09
* @param id
* @return
*/
public wfjcGroupEntity findOneById(String id) {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
try {
wfjcGroupEntity group = sqlSession.selectOne("wfjcGroupDao.findOneById", id);
return group;
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
return null;
}
/**
* @desc 更新分组信息
* @author WangWeiWei 020463
* @date 2018年5月16日 上午11:13:39
* @param group
* @return
* @throws Exception
*/
public int update(wfjcGroupEntity group) throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
int lines = sqlSession.update("wfjcGroupDao.update", group);
sqlSession.close();
return lines;
}
/**
* @desc 根据Id删除一条分组信息
* @author WangWeiWei 020463
* @date 2018年5月16日 下午4:45:14
* @param id
* @return
* @throws Exception
* @throws SQLException
*/
public int delete(String id) throws SQLException, Exception {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
int lines = sqlSession.delete("wfjcGroupDao.delete", id);
sqlSession.close();
return lines;
}
}
dao类不需要继承dejcCommonDAO这个类了!
每次执行一个数据库操作,都需要先SqlSession sqlSession = sqlSessionFactory.openSession(true);生成一个sqlSession,然后操作完之后,都必须关闭SqlSession
sqlSession.insert("wfjcGroupDao.delete", id);//新增
sqlSession.update("wfjcGroupDao.update", group);//编辑
sqlSession.selectOne("wfjcGroupDao.findOneById", id);//查询一条数据
sqlSession.selectList("wfjcGroupDao.findAll", keyMap);//查询多条数据
sqlSession.delete("wfjcGroupDao.delete", id);//删除
wfjcGroupDao.delete,wfjcGroupDao.update...等等名称是mapper文件中的mapper总节点的namespace名称加上子节点的id名称拼接映射而成,SqlSession会根据该条件查找出sql命令并将参数根据占位符预编译的带入进去然后执行sql命令,并返回值。
三、总结
引入mybatis可以大大提高开发效率,摒弃字符串拼接的方式来组成SQL命令,并防止了SQL注入的风险与特殊字符的影响,DB2繁琐的分页命令也无需由开发人员编写,是由mybatis来完成。测试机和正式机都已经将mybatis集成完毕,开发人员正常上代码即可。
作者:研究院-解决方案部-王玮玮
网友评论