之所以把这个放在最前面... 是因为这两天参考网上文章, 还有文档教程时, 由于忽略版本问题, 吃了不少亏.
之前, iBATIS的官网一直进不去, 都是到网上乱找的文档.下载来参考, 或者是看别人的博客. 照着敲代码练习,
一边敲着, 就一边郁闷着... 怎么照上面打的... 还是报错呢...
都是版本惹的祸... 还有自己瞎眼没有认真看... 才白白浪费了 一个晚上+一个上午 的时间查错...
同时也对iBATIS表示汗颜... 怎么第一版. 第二版. 还有新出的第三版, 里面语法格式差这么多呢???
OK, 正题>>>
概念:
iBATIS , 又是一个O/R Mapping的解决方案(例如 hibernate的ORM 也是解决方案之一.)
网上很多人便将其称为ORM , 但是用过的人, 应该都会觉得并不恰当.
与其称之为一个OR Mapping , 倒不如叫它SQL Mapping...
iBATIS 的特点是小巧, 简单. 但是要求需要熟悉SQL , 不像hibernate那样, 可以让你一句sql 都不用写
同时, 我觉得要写挺多的配置文件的. 可能会比较繁琐.
sample
还是拿最简单的 User 类来测试. User.java
- public class User {
-
- private int id;
- private String username;
- private String userpwd;
- private String userdesc;
-
-
- }
public class User {
private int id;
private String username;
private String userpwd;
private String userdesc;
//Sets and Gets...
}
接下来... 马上看看... dao里面的一个方法有多简单~~ UserDao.java
- public static List getAllUsers() throws SQLException {
-
- SqlMapClient sqlMap = Utils.getSqlmap();
- try {
- List li = sqlMap.queryForList("getAllUsers" );
-
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return li;
- }
public static List getAllUsers() throws SQLException {
SqlMapClient sqlMap = Utils.getSqlmap();
try {
List li = sqlMap.queryForList("getAllUsers");
} catch (SQLException e) {
e.printStackTrace();
}
return li;
}
是的, dao里面的一个方法只需要这么几句话.
看看怎么实现的吧...
首先, 我们需要一个跟 User 类对应的 配置文件 User.xml (名字相同并不是硬性规定, 只是方便管理)
- <? xml version = "1.0" encoding = "UTF-8" ?>
- <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
- "http://ibatis.apache.org/dtd/sql-map-2.dtd">
- < sqlMap namespace = "User" >
-
- < typeAlias alias = "user" type = "pojo.User" />
-
- < select id = "getAllUsers" resultClass = "user" >
- select * from user order by id;
- </ select >
-
- </ sqlMap >
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="user" type="pojo.User"/>
<select id="getAllUsers" resultClass="user">
select * from user order by id;
</select>
</sqlMap>
接下来, 需要一个另一个配置文件, 将User.xml 加入 其中, 同时还要在里面配置数据源---- 即数据库的连接等等... SqlMapConfig.xml
- <? xml version = "1.0" encoding = "UTF-8" ?>
-
- <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
- "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
-
- < sqlMapConfig >
-
- < properties resource = "sqlmap.properties" />
-
- < transactionManager type = "JDBC" >
- < dataSource type = "SIMPLE" >
- < property name = "JDBC.Driver" value = "${jdbc.driverClassName}" />
- < property name = "JDBC.ConnectionURL" value = "${jdbc.url}" />
- < property name = "JDBC.Username" value = "${jdbc.username}" />
- < property name = "JDBC.Password" value = "${jdbc.password}" />
- </ dataSource >
- </ transactionManager >
- < sqlMap resource = "sql/User.xml" />
-
- </ sqlMapConfig >
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="sqlmap.properties"/>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${jdbc.driverClassName}" />
<property name="JDBC.ConnectionURL" value="${jdbc.url}" />
<property name="JDBC.Username" value="${jdbc.username}" />
<property name="JDBC.Password" value="${jdbc.password}" />
</dataSource>
</transactionManager>
<sqlMap resource="sql/User.xml" />
</sqlMapConfig>
在这里, 我们把数据库的相关参数保存在了另一个文件中, sqlmap.properties
- jdbc.driverClassName=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql:
- jdbc.username=root
- jdbc.password=netjava
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/myblog
jdbc.username=root
jdbc.password=netjava
这样做的好处, 相信大家也明白.. 下次我们再写一个项目的时候, 只需要把这个文件copy 过去, 改掉其中的数据库连接就ok啦 , 也算是资源的充分利用吧..
至此, 所有的配置文件 都已经上场, 当然上面写的都是最简单的测试, 看起来比较没有那么繁琐, 实际应用时候, 可能最麻烦的地方就是在 配置文件的 sqlmap 的编写...
前面 UserDao.java 的方法中, 有这么一句
- SqlMapClient sqlMap = Utils.getSqlmap();
SqlMapClient sqlMap = Utils.getSqlmap();
Utils 类 就是我们抽取其中的初始化的代码, 单独写成一个类, 当然还是方便重用哈.同时采用的是单实例模式, 相当环保.
Utils.java
- public class Utils{
-
- private static SqlMapClient sqlMapper;
- public static synchronized SqlMapClient getSqlmap()
- {
- if (sqlMapper== null )
- {
- try {
- Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml" );
- sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return sqlMapper;
- }
- }
public class Utils{
private static SqlMapClient sqlMapper;
public static synchronized SqlMapClient getSqlmap()
{
if(sqlMapper==null)
{
try {
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sqlMapper;
}
}
好了, 所有的相关文件都已经上场.. 当然, 加上 iBATIS的 jar包是前提 , 还是提醒下, 要注意版本问题...
项目的结构如下图所示:
最后 , 整理一下思路吧!
UserDao 是怎样操作数据库的???
首先 , Utils 通过SqlMapConfig.xml里面的配置, 连接到数据库, 取得SqlMap , 同时User.xml 将Sql查询映射成java中可以调用的bean, 通过SqlMap 调用这些bean 就是在执行想对应的sql语句...