ibator的安装及配置,ibatis简单实现与配置

图片 1

ibator生成的代码方便我们快速编写j2ee代码,但生成的代码有很多不必要的冗余代码,如java
bean不必要的注释,sqlmap很多冗余项,
java
bean根据表字段名称生成的属性是大写的,带主键的表会把主键字段放在generatorKey中然后java
bean去继承…这些代码在我的
项目里至少是冗余的,看了下网上的文章改了些源代码,定制生成出公司代码规范要求的代码,但是还不是很满意,同事因为局限性不能
生成jsp代码。

您可能感兴趣的文章:

  • Mybatis报错:
    org.apache.ibatis.exceptions.PersistenceException解决办法
  • Mybatis与Ibatis的区别
  • Ibatis.net结合oracle批量删除实现代码
  • ibatis学习之搭建Java项目
1 LEFT JOIN sys_user        u ON u.id = a.create_by
2 LEFT JOIN sys_office      o ON u.office_id = o.id

通过myeclipse的software updates不作说明
现在来说下怎么用links文件链接安装
解压插件包,放到任意路径下,最好放在myeclipse的安装目录下,在dropins文件夹下创建ibator.link文件,文件里设置path=F:\\program\\java\\myeclipse8.5\\ibator,
path的路径就是解压的插件路径。重启后就安装好了。

那我们什么时候可以用到ibatis呢,我们用hibernate的时候会发现,有的时候hibernate不支持一些特别精确的查询,这个时候我们完全可以用到ibatis,因为他是半自动化的。一会我们可以看到,他的查询语句是我们在配置文件xml中写的。hibernate可以用到一些大型的项目当中,ibatis我们可以应用到一些小型的项目当中。
下面我们看下ibatis的具体实现,hibernate中,我们都知道有一个hibernate.cfg.xml配置文件,和另一个*.hbm.xml配置文件,在ibatis中,我们同样也有两个配置文件,一个为SqlMapConfig.xml另一个为*.xml下面我们具体的看下两个配置文件中的具体配置方法。
SqlMapConfig.xml配置方法
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE sqlMapConfig
PUBLIC “-//iBATIS.com//DTD SQL Map Config 2.0//EN”
“;
<sqlMapConfig>
<settings cacheModelsEnabled=”true”
enhancementEnabled=”true”
lazyLoadingEnabled=”true”
errorTracingEnabled=”true”
maxRequests=”32″
maxSessions=”10″
maxTransactions=”5″
useStatementNamespaces=”false” />
<!– maxrequest 同时执行sql语句的最大条数
最好至少是maxTransactions的10倍数 而且大于maxSession
maxTransactions 同时进入SqlMapClient.startTransaction()的 最大线程数
maxSession 同一时间段内 最大session数 大于maxTransactions
小于maxRequest
cacheModelsEnabled 全局性的启用或者禁用SqlMapClient的所有缓存model
true为启用 默认为启用
lazyLoadingEnabled
全局性的启用或者禁用SqlMapClient的所有延迟加载,调试程序使用 true为启用
默认为启用
enhancementEnabled 全局性的启用或者禁用运行时字节码增强 false为禁用
默认为禁用
useStatementNamespaces
如果启用本属性,必须使用权限定名来引用mappedstatement。
这是由sql-map的名称和mapped-statment的名称合成,默认为false 禁用。
–>
<transactionManager type=”JDBC”>
<dataSource type=”SIMPLE”>
<property name=”JDBC.Driver” value=”com.mysql.jdbc.Driver”/>
<property name=”JDBC.ConnectionURL”
value=”jdbc:mysql://localhost/sample”/>
<property name=”JDBC.Username” value=”root”/>
<property name=”JDBC.Password” value=”admin”/>
<!– transactionManager元素为SQL Map配置事务管理服务
type指定所使用的管理器类型可以为JDBC JTA EXTERNAL
datasource元素是transactionManager的一部分
为SQL Map数据源设置了一些列参数。
dataSource type为 是根据选择链接数据库的方式决定的
peoperty中的JDBC.Driver为 驱动
ConnectionURL为链接地址
Username为访问数据库的用户名
Password为访问数据库的密码
–>
<property name=”Pool.MaximumIdleConnections” value=”5″ />
<property name=”Pool.MaximumCheckoutTime” value=”120000″ />
<property name=”Pool.TimeToWait” value=”500″ />
<property name=”Pool.PingQuery” value=”select 1 from sample” />
<property name=”Pool.PingEnabled” value=”false” />
<property name=”Pool.PingConnectionsOlderThan” value=”1″ />
<property name=”Pool.PingConnectionsNotUsedFor” value=”1″ />
<!– MaximumIdleConnections数据库连接池中允许的挂起(idle)连接数
MaximumCheckoutTime数据库联接池中,连接被某个任务所允许占用的最大时间,
如果超过这个时间限定,连接将被强制收回。(毫秒)
TimeToWait当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,
此时线程将进入等待状态,直到池中出现空闲连接。
此参数设定了线程所允许等待的最长时间。(毫秒)
PingQuery数据库连接状态检测语句。某些数据库在连接在某段时间持续处于空闲
状态时会将其断开。而连接池管理器将通过此语句检测池中连接是否可用。
检测语句应该是一个最简化的无逻辑SQL。如“select 1 from t_user”,
如果执行此语句成功,连接池管理器将认为此连接处于可用状态
PingEnabled是否允许检测连接状态。
PingConnectionsOlderThan对持续连接时间超过设定值(毫秒)的连接进行检测。
Pool.PingConnectionsNotUsedFor对空闲超过设定值(毫秒)的连接进行检测。
–>
</dataSource>
</transactionManager>
<sqlMap resource=”com/kobe/map/User.xml” />
<!– sqlmap源的 位置”包名/ .xml注意包中间有.的时候用/代替” –>
</sqlMapConfig>
<!– 注意 1.0允许配置多个数据源,这引起了一些不好的实现,因此
2.0版本只允许一个数据源,要使用多个部署/配置参数,您最好使用多个属性文件,
不同的属性文件,或在创建SQL Map时传入不同的属性文件。 –>
里面的配置文件,对我们初级入门的人来说,主要的配置就是连接数据库的配置。
下面,我们在看下*.xml中的配置
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE sqlMap
PUBLIC “-//iBATIS.com//DTD SQL Map 2.0//EN”
“;
<sqlMap namespace=”User”> <!– 映射文件名称 –>
<typeAlias alias=”user” type=”com.kobe.map.User”/> <!–
给对应的类取别名 –>
<!– sql语句 <![CDATA[可以避免SQL 中与XML
规范相冲突的字符对XML映射文件的合法性造成影响。
–>
<select id=”getUser” parameterClass=”java.lang.String”
resultClass=”user”>
<!– parameterClass是参数类型
resultClass是结果的类型
如果sql语句包括参数, 那么格式是#id# –>
<![CDATA[ select name,sex from t_user where name =
#name#]]>
</select>
<select id=”getAllUser” resultClass=”user”>
<![CDATA[ select name, sex from t_user where name = #name#
]]>
</select>
<update id=”updateUser” parameterClass=”user”>
<![CDATA[ UPDATE t_user SET name=#name#, sex=#sex# WHERE id =
#id# ]]>
</update>
<delete id=”deleteUser” parameterClass=”user”>
delete from t_user where id=#id#
</delete>
<insert id=”insertUser” parameterClass=”user”>
<![CDATA[ insert into t_user (id,name,sex) values
(#id#,#name#,#sex#) ]]>
</insert>
</sqlMap>
这里面配置文件我们可以看出来了。这里体现了ibatis半自动化的体现,因为他的sql语句并不是自动生成,而是我们自己写的,所以这样我们可以执行更精确的查询。
下面我们在看下Test实现
import java.sql.SQLException;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class Test {
public static void main(String args[]){
//首先初始化iBatis获得一个SqlMapClient对象
String resource = “com/kobe/map/SqlMapConfig.xml”;
com.ibatis.sqlmap.client.SqlMapClient sqlMap = null;
try {
java.io.Reader reader = com.ibatis.common.resources.Resources
.getResourceAsReader(resource);
sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
} catch (Exception e) {
e.printStackTrace();
}
// sqlMap系统初始化完毕,开始执行update操作
try {
sqlMap.startTransaction();
User user = new User();
//user.setId(24);
//user.setName(“lzq”);
//user.setSex(24);
//sqlMap.insert(“insertUser”, user);
//user.setId(24);
//user.setName(“kobelzq”);
//user.setSex(24);
//sqlMap.update(“updateUser”, user); //key为User xml中配置的id名字
键为bean的名字
user.setId(2);
sqlMap.delete(“deleteUser”, user);
sqlMap.commitTransaction();
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
try {
sqlMap.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println(“操作成功”);
}
}
}
上面我加注释的地方,大家可以根据不同的需要,测试下不同的效果,我测试了三个效果,分别为增,删,改,查询大家要是感兴趣的话,可以自己写下。我这里少写了一个持久类,持久类的写法大家都熟悉,我就不在这里给大家展示了,无非就是get与set方法,大家可以自己实现一下。

  比如数据库中的表名是 xxx_yyy ,那么生成的 4 个 Java 文件分别是
XxxYyy.java、XxxYyyController.java、XxxYyyService.java 和
XxxYyyDao.java,生成 XML 文件名是 XxxYyyDao.xml,生成的两个 JSP
文件分别是 XxxYyyForm.jsp 和 XxxYyyList.jsp。

ibator配置文件详解
编写ibatorConfig.xml文件
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<!DOCTYPE ibatorConfiguration PUBLIC “-//Apache Software
Foundation//DTD Apache iBATIS Ibator Configuration 1.0//EN”
“” >
<ibatorConfiguration >
<!– 数据库jdbc驱动jar包的绝对路径 –>
<classPathEntry
location=”H:\\code\\work\\ydbmkwebservice\\WebRoot\\WEB-INF\\lib\\classes12.jar”
/>
<ibatorContext id=”context1″ >
<!– 配置数据库连接 –>
<jdbcConnection driverClass=”oracle.jdbc.driver.OracleDriver”
connectionURL=”jdbc:oracle:thin:@localhost:1521:orcl” userId=”test”
password=”test” />
<!–
targetPackage 生成Java Bean的所放目录
targetProject 生成Java Bean的所在工程名
–>
<javaModelGenerator targetPackage=”src” targetProject=”testJq”
/>
<!–
targetPackage 生成sqlMap.xml的所放目录
targetProject 生成sqlMap.xml的所在工程名
–>
<sqlMapGenerator targetPackage=”src” targetProject=”testJq” />
<!–
targetPackage 生成dao文件的所放目录
targetProject 生成dao文件的所在工程名
type 生成dao文件的类型,可选择IBATIS、SPRING、GENERIC-CI、GENERIC-SI
–>
<daoGenerator targetPackage=”src” targetProject=”testJq”
type=”IBATIS” />
<!–
tableName 表名
domainObjectName 生成java
bean的类名,如果不填是表名去下划线组合成的类名
–>
<table tableName=”T_INF_POINT_ACCT_HIS”
domainObjectName=”tinfpointaccthis”>
<!–
java bean
属性使用表字段名称,不设置默认是使用表字段去下划线组合成的属性
如 user_id –> userId
–>
<property name=”useActualColumnNames” value=”true”/>
</table>
</ibatorContext>
</ibatorConfiguration>
右击ibatorConfig.xml文件,点击Generate iBATIS Artifacts就可以生成代码

  使用 dataScopeFilter() 的实现在 BaseService.java
中,该方法存在两个,他们的定义也稍微有所差别,两个定义分别如下:

补充

  对于改造权限的重点,在于 XxxYyyService.java 文件和 XxxYyyDao.xml
文件中。

1 </where>
2     <!-- 数据范围过滤 -->
3     ${sqlMap.dsf}
4 <choose>

 

 1 /**
 2  * 数据范围过滤
 3  * @param user 当前用户对象,通过“entity.getCurrentUser()”获取
 4  * @param officeAlias 机构表别名,多个用“,”逗号隔开。
 5  * @param userAlias 用户表别名,多个用“,”逗号隔开,传递空,忽略此参数
 6  * @return 标准连接条件对象
 7  */
 8 public static String dataScopeFilter(User user, String officeAlias, String userAlias);
 9 
10 /**
11  * 数据范围过滤(符合业务表字段不同的时候使用,采用exists方法)
12  * @param entity 当前过滤的实体类
13  * @param sqlMapKey sqlMap的键值,例如设置“dsf”时,调用方法:${sqlMap.sdf}
14  * @param officeWheres office表条件,组成:部门表字段=业务表的部门字段
15  * @param userWheres user表条件,组成:用户表字段=业务表的用户字段
16  * @example
17  * dataScopeFilter(user, "dsf", "id=a.office_id", "id=a.create_by");
18  * dataScopeFilter(entity, "dsf", "code=a.jgdm", "no=a.cjr"); // 适应于业务表关联不同字段时使用,如果关联的不是机构id是code。
19  */
20 public static void dataScopeFilter(BaseEntity entity, String sqlMapKey, String officeWheres, String userWheres);
 1 if (Role.DATA_SCOPE_ALL.equals(r.getDataScope())){
 2 }
 3 else if (Role.DATA_SCOPE_COMPANY_AND_CHILD.equals(r.getDataScope())){
 4 }
 5 else if (Role.DATA_SCOPE_COMPANY.equals(r.getDataScope())){
 6 }
 7 else if (Role.DATA_SCOPE_OFFICE_AND_CHILD.equals(r.getDataScope())){
 8 }
 9 else if (Role.DATA_SCOPE_OFFICE.equals(r.getDataScope())){
10 }
11 else if (Role.DATA_SCOPE_CUSTOM.equals(r.getDataScope())){
12 }
13 //else if (Role.DATA_SCOPE_SELF.equals(r.getDataScope())){
14 dataScope.add(r.getDataScope());

  这里的 XML 文件是 MyBatis,只要在查询的 where
的结尾处引入即可,比如:

  到此,关于 JeeSite 中数据权限的基本介绍就到这里了。我本身不熟悉 Java
语言,对于 JeeSite 的二次开发也是我第一次接触 Java
语言,写在这里方便下次使用。有不正确的,请指正!

  从图中可以看出,在实现的部分通过 if / elseif 来实现了不同选项的 SQL
语句的拼接,拼接后的内容被引入到 MyBatis 中,从而实现了数据权限的管理。

 

实例演示

问题出发

  呵呵~!!言归正传……

  中午吃饭时看了一下陆毅版的《三国》,刚好看的是蜀军缺粮,诸葛亮让王平去劫司马懿的粮。司马懿看蜀军用木牛流马运量很方便,就抢了蜀军的木牛流马仿制了一批,结果司马懿用它运粮时,被王平冒充司马懿的人在验粮时,对木牛流马动了手脚,结果木牛流马不能动弹了,被蜀军把几十万担的粮食抢走了。看到这里的时候,我想到了我们的项目。网上有个开源项目,在不熟悉的情况下把源码下载下来部署了就敢用?胆子是不是有点大?真遇到类似“木牛流马”的问题,那真的就亏大了啊。难道要联系作者?  

  另外一部分则是要增加控制数据权限的代码,增加的方法在 JeeSite
的手册《内置组件的应用》中给出了关于数据权限的说明,说明如下:

1 public PagefindPage(Pagepage, XxxYyy xxxYyy) {
2     // 生成数据权限过滤条件(dsf为dataScopeFilter的简写,在xml中使用 ${sqlMap.dsf}调用权限SQL)
3     xxxYyy.getSqlMap().put("dsf", dataScopeFilter(UserUtils.getUser(), "o", "u"));
4     return super.findPage(page, xxxYyy);
5 }

数据权限
应用场景:某用户访问数据范围:公司及子公司,本公司,部门及子部门,本部门,当前用户,明细设置。
// 生成数据权限过滤条件(dsf为dataScopeFilter的简写,在xml中使用
${sqlMap.dsf}调用权限SQL)
user.getSqlMap().put(“dsf”, dataScopeFilter(user.getCurrentUser(),
“o”, “u”));

<!– 分页查询用户信息 –>
<select id=”findList” parameterType=”User”
resultMap=”userResult”>
SELECT
        <include refid=”userColumns”/>
FROM sys_user a
        <include refid=”userJoins”/>
WHERE a.del_flag = ‘0’
        <!– 数据范围过滤 –>
        ${sqlMap.dsf}
</select>

/**
 * 数据范围过滤
 * @param user 当前用户对象,通过“entity.getCurrentUser()”获取
 * @param officeAlias 机构表别名,多个用“,”逗号隔开。
 * @param userAlias
用户表别名,多个用“,”逗号隔开,传递空,忽略此参数
 * @return 标准连接条件对象
 */
String dataScopeFilter (User user, String officeAlias, String
userAlias)

  其中有一些如 DATA_SCOPE_ALL 等定义,如下所示:

图片 2

  在系统中每个信息录入人员之间的数据要求在显示时是分离的,即人员 A
录入的信息人员 B 是看不到的,同理人员 B 录入的信息人员 A
同样也是看不到的,人员 A 和人员 B 属于同一个部门。但是,人员 A 和人员 B
的部门负责人可以同时看到人员 A 和人员 B
录入的信息。在这种情况下,就需要使用到数据权限。

  上面就是 JeeSite
手册中介绍的方法,首先要增加“生成数据权限过滤条件”,其次就是要“在 xml
中使用 ${sqlMap.dsf} 调用权限 SQL ”,就是这样的两部分。至于
dataScopeFilter() 是 JeeSite 提供的方法。

  按照文档在 XxxYyyService.java
中添加“生成数据权限过滤条件”的代码,代码如下:

 

  首先使用 XxxYyy 的对象 xxxYyy 来调用 getSqlMap
方法,在手册中使用的是 user 作为示范的,这里需要替换成自己实际的对象。
  在 dataScopeFilter() 方法中, o 和 u
是数据表的别名,因为要按照用户或部门进行过滤,因此实际的表要进行左连接,左连接时一般会给表起一个别名,左连接的部分代码如下:

  要完成数据权限的功能,需要分为两部分,一部分是设置角色中对“数据范围”的控制,另一部分是在需要进行数据权限控制的地方增加相应的代码。

  也就是传入的 o 和 u 分别是 sys_office 表和 sys_user 表的别名,而
u.id=a.create_by 是表示 sys_user 的 id 和主表的 create_by
进行关联,而 u.office_id 和 o.id 进行关联。

  用以上数据对比角色中“数据范围”的部分,如图:

 

1 // 数据范围(1:所有数据;2:所在公司及以下数据;3:所在公司数据;4:所在部门及以下数据;5:所在部门数据;8:仅本人数据;9:按明细设置)
2 public static final String DATA_SCOPE_ALL = "1";
3 public static final String DATA_SCOPE_COMPANY_AND_CHILD = "2";
4 public static final String DATA_SCOPE_COMPANY = "3";
5 public static final String DATA_SCOPE_OFFICE_AND_CHILD = "4";
6 public static final String DATA_SCOPE_OFFICE = "5";
7 public static final String DATA_SCOPE_SELF = "8";
8 public static final String DATA_SCOPE_CUSTOM = "9";

JeeSite 对数据权限的支持

  在角色中设置“数据范围”比较简单,直接操作就可以了,如下图。

  JeeSite 支持根据数据库表生成代码的功能,生成的代码包含 4 个 Java
文件、1 个 XML 文件和 2 个 JSP 文件。

 

  基本到了这里第一步的“生成数据权限过滤条件”就完了,第二步需要在
XxxYyy.xml 中引用“ ${sqlMap.dsf} ”。

  前面介绍的是调用了它的第一种形式。第一种形式的实现中对应角色设置中“数据范围”的实现如下:

  在各种系统中,经常会涉及到数据权限的管理。在 JeeSite
开源系统中已经基本给出了一套解决数据权限管理的解决方案。下面来简单的进行说明一下我项目中涉及到的应用。

  这样就基本可以解决数据权限的问题,并且我用 A 用户录入一条信息,B
用户录入一条信息,A 和 B 用户只能查看自己录入的数据,但是作为 A 和 B
的部门负责人 C 可以同时查看他们录入的数据。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website