ibatis 代码实践

2010-01-09 14:28

这篇文章主要是用来讲解如何使用ibatis来开发程序,下面我们就结合代码来认识并开发我们的第一个ibatis程序.
首先我们创建一个数据库:mysql,再创建一个表:t_user:
SQL语句如下:
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`ID` int(11) NOT NULL auto_increment,
`NAME` varchar(255) default NULL,
`PASS` varchar(20) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=latin1;

-- Records
-- ----------------------------
INSERT INTO `t_user` VALUES ('7', 'zxx', 'xfmn123456');
INSERT INTO `t_user` VALUES ('9', 'lsw', '12645xxfff@#^%^');
INSERT INTO `t_user` VALUES ('10', 'bjs', '4232587845896');
3.新建一个项目,命名为:jibatis 2.3,导入所需要的jar包,在这个应用中我只导入了两个jar包:ibatis-2.3.0.677.jar,mysql-connector-java-5.1.6-bin.jar就足够了.
4.创建User的Bean类:
public class User {
private Integer id;
private String name;
private String pass;

//getter和setter方法
}
5.通过jdbc.properties来配置数据库连接:
#Fri Dec 05 12:04:48 CST 2009
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/mysql
username=root
password=123456
6.配置sqlmap-config.xml文件
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!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="com/ibatis/jdbc.properties" />
<transactionManager type="JDBC">
   <dataSource type="SIMPLE">
    <property value="${driver}" name="JDBC.Driver" />
    <property value="${url}" name="JDBC.ConnectionURL" />
    <property value="${username}" name="JDBC.Username" />
    <property value="${password}" name="JDBC.Password" />
   </dataSource>
</transactionManager>
<sqlMap resource="com/ibatis/dao/sqlmap/User.xml" />
</sqlMapConfig>
7.配置bean.xml文件,我们这里起名叫: 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="com.ibatis.dao.bean.User" />
……………//先列出基本的配置
</sqlMap>
8.新建我们的测试类: UserDaoTest:
import java.io.Reader;
………//其他jar自动导入即可
@SuppressWarnings("unchecked")
public class UserDaoTest {
private static SqlMapClient sqlMapClient = null;
static {
   try {
    String resource = "com/ibatis/sqlmap-config.xml";
    Reader reader = Resources.getResourceAsReader(resource);
    sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
   } catch (Exception e) {
    e.printStackTrace();
   }
}

public static void main(String[] args) throws Exception {
   …….//调用测试方法
}
}

做完上面的基本操作的一个大体框架,一个简单的ibatis应用下面就开始了:
在User.xml配置文件中加如下一段配置:
<!-- example 1: 无映射 -->
<select id="getUserByName1" resultClass="user" parameterClass="string">
   <![CDATA[
    SELECT * FROM t_user WHERE NAME=#name#
   ]]>
</select>
然后在UserDaoTest.java中增加如下一个方法:
public static void example1() throws Exception {
try {
   List<User> list = sqlMapClient.queryForList("getUserByName1", "zxx");
   for (User user : list) {
    System.out.println(user.getId() + "-" + user.getName() + "-" + user.getPass());
   }
} catch (Exception e) {
   e.printStackTrace();
}
}
// 注:当parameterClass="string"的时侯,sql语句中的参数没有限制, 如:SELECT * FROM t_user WHERE NAME=#name#,其中#name#中name可以是任何名称,不过通常情况下,我们习惯于只有一个参数的时候用#value#或者是#熟悉名#.

在User.xml配置文件中加如下一段配置:
<!-- example 2: 内联映射 -> 实体类 -->
<select id="getUserByName2" resultClass="user" parameterClass="string">
   <![CDATA[
    SELECT ID as id, NAME as name, PASS as pass FROM t_user WHERE NAME=#name#
   ]]>
</select>
然后在UserDaoTest.java中增加如下一个方法:
public static void example2() throws Exception {
   try {
    List<User> list = sqlMapClient.queryForList("getUserByName2", "zxx");
    for (User user : list) {
     System.out.println(user.getId() + "-" + user.getName() + "-" + user.getPass());
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
}
// 注:当使用内联映射 ->实体类的时侯,sql语句中的映射名可以没有限制, 如:SELECT ID as id, NAME as name, PASS as pass FROM t_user WHERE NAME=#name#,通常情况下映射名就是bean的属性的名字,如果改成这样
SELECT ID as iid, NAME as name, PASS as pass FROM t_user WHERE NAME=#name#,其中iid不是bean的属性,那么我们就无法获取id的值,其实这样写也是没意义的,所以通常情况下映射的名字就是bean的属性的名字。

3. 在User.xml配置文件中加如下一段配置:
<!-- example 3: 内联映射 -> MAP类 -->
<select id="getUserByName3" resultClass="hashmap" parameterClass="string">
   <![CDATA[
    SELECT * FROM t_user WHERE NAME=#name#
   ]]>
</select>
然后在UserDaoTest.java中增加如下一个方法:
public static void example3() throws Exception {
   try {
    List<User> list = sqlMapClient.queryForList("getUserByName3", "zxx");
    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
     Map map = (Map) iterator.next();
     System.out.println(map.get("ID") + ":" + map.get("NAME") + ":" + map.get("PASS"));
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
}
// 注:当使用内联映射 ->MAP类的时侯,即resultClass="hashmap"或者resultClass="java.util.Map"; 它会返回一个Map的集合,Map中的键对应的数据库中的字段名,非bean中的属性名,所以获取的时候get()中的应该是字段名。

4.在User.xml配置文件中加如下一段配置:
<!-- example 4: 显示映射 -> 实体类 -->
<resultMap id="userResult" class="user">
   <result property="id" column="Id" />
   <result property="name" column="NAME" />
   <result property="pass" column="PASS" />
</resultMap>
<select id="getUserByName4" resultMap="userResult" parameterClass="string">
   <![CDATA[
    SELECT * FROM t_user WHERE NAME=#name#
   ]]>
</select>
然后在UserDaoTest.java中增加如下一个方法:
public static void example4() throws Exception {
   try {
    List<User> list = sqlMapClient.queryForList("getUserByName4", "zxx");
    for (User user : list) {
     System.out.println(user.getId() + "-" + user.getName() + "-" + user.getPass());
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
  
}
// 注:当使用显示映射 ->实体类的时侯,即返回的结果在resultMap中,而非resultClass中,类如上面一个最简单的resultMap,column对应的是字段名,此时字段名不区分大小写, property对应的是bean中的属性名,与example2的内联映射 ->实体类不同的是,该属性必须在bean中存在,否则就会报错,它的检查更严格..

5.在User.xml配置文件中加如下一段配置:
<!-- example 5: 显示映射 -> MAP类 -->
<resultMap id="userMapResult" class="hashmap">
   <result property="id" column="ID" />
   <result property="name" column="NAME" />
   <result property="pass" column="PASS" />
</resultMap>
<select id="getUserByName5" resultMap="userMapResult" parameterClass="string">
   <![CDATA[
    SELECT * FROM t_user WHERE NAME=#name#
   ]]>
</select>
然后在UserDaoTest.java中增加如下一个方法:
public static void example5() throws Exception {
   try {
    List<User> list = sqlMapClient.queryForList("getUserByName5", "zxx");
    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
     Map map = (Map) iterator.next();
     System.out.println(map.get("id") + ":" + map.get("name") + ":" + map.get("pass"));
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
}
   // 注:当使用显示映射 ->MAP类的时侯,即resultMap的class不是我们定义的bean而是hashmap或者java.util.Map的时候,类如上面一个最简单的MAP类,column对应的是字段名,此时字段名不区分大小写, property对应的是bean中的属性名,与example3的内联映射 ->MAP类不同的是,它的键值是属性名而非字段名.

6.在User.xml配置文件中加如下一段配置:
<!-- example 6: XML -->
<select id="getUserByName6" parameterClass="string" resultClass="xml" xmlResultName="info">
   <![CDATA[
    SELECT * FROM t_user WHERE name=#name#
   ]]>
</select>
然后在UserDaoTest.java中增加如下一个方法:
public static void example6() throws Exception {
   try {
    List list = sqlMapClient.queryForList("getUserByName6", "zxx");
    System.out.println(list.get(0));
    // 输出: <?xml version="1.0" encoding="UTF-8"?><info><ID>7</ID><NAME>zxx</NAME><PASS>xfmn123456</PASS></info>
   } catch (Exception e) {
    e.printStackTrace();
   }
}
// 注:xmlResultName="info",xmlResultName定义返回的结果信息保存在xml的那个元素中,如果返回有多个xml对象那么就会产生多个<?Xml ,而不是整合在一个<?xml中。

7.在User.xml配置文件中加如下一段配置:
<!-- example 7: 自动参数映射 -->
<insert id="insertUser7" parameterClass="user">
   <![CDATA[
    INSERT INTO t_user ( ID, NAME, PASS )VALUES( #id#,#name#,#pass# )
   ]]>
</insert>
然后在UserDaoTest.java中增加如下一个方法:
public static void example7() throws Exception {
   try {
    User user = new User();
    user.setName("example7");
    sqlMapClient.insert("insertUser7", user);
   } catch (Exception e) {
    e.printStackTrace();
   }
}
// 注: 自动参数映射 插入操作

8.在User.xml配置文件中加如下一段配置:
<!-- example 8: 内联参数映射 -->
<insert id="insertUser8" parameterClass="user">
   <![CDATA[
    INSERT INTO t_user ( ID, NAME, PASS ) VALUES( #id:INT#, #name:VARCHAR#, #pass:VARCHAR# )
   ]]>
</insert>
然后在UserDaoTest.java中增加如下一个方法:
public static void example8() throws Exception {
   try {
    User user = new User();
    user.setName("example8");
    sqlMapClient.insert("insertUser8", user);
   } catch (Exception e) {
    e.printStackTrace();
   }
}
// 注:内联参数映射 插入操作

9.在User.xml配置文件中加如下一段配置:
<!-- example 9: 外联参数映射 -->
<parameterMap id="parameterMap" class="user">
   <parameter property="id" jdbcType="INTEGER" />
   <parameter property="name" jdbcType="VARCHAR" />
   <parameter property="pass" jdbcType="VARCHAR" />
</parameterMap>
<insert id="insertUser9" parameterMap="parameterMap">
   <![CDATA[
    INSERT INTO t_user ( ID, NAME, PASS )VALUES( ?,?,? )
   ]]>
</insert>
然后在UserDaoTest.java中增加如下一个方法:
public static void example9() throws Exception {
   try {
    User user = new User();
    user.setName("example9");
    user.setPass("123456");
    sqlMapClient.insert("insertUser9", user);
   } catch (Exception e) {
    e.printStackTrace();
   }
}
   // 注:外联参数映射 插入操作,如上述所示:SQL语句中有多少个参数,那么在parameterMap中必须定义多少个,而且要一一对应,参数定义顺序也不要错。

10.在User.xml配置文件中加如下一段配置:
<!-- example 10: 自动生成的键 -->
<insert id="insertUser10" parameterClass="user">
   <![CDATA[
    INSERT INTO t_user ( ID,NAME,PASS )VALUES( #id#, #name#, #pass# )
   ]]>
   <selectKey resultClass="int" keyProperty="id">
    <![CDATA[
    SELECT LAST_INSERT_ID()
   ]]>
   </selectKey>
</insert>
然后在UserDaoTest.java中增加如下一个方法:
public static void example10() throws Exception {
   try {
    User user = new User();
    user.setName("example10");
    user.setPass("123456");
    Integer returnValue = (Integer) sqlMapClient.insert("insertUser10", user);
    System.out.println(returnValue);
   } catch (Exception e) {
    e.printStackTrace();
   }
}
// 注:该方法插入数据,并返回id的值

11.在User.xml配置文件中加如下一段配置:
<!-- example 11: 存储过程 -->
<resultMap id="returnResultMap" class="user">
   <result property="id" column="ID" />
</resultMap>
<parameterMap id="paramUser" class="java.util.Map">
   <parameter property="name" jdbcType="VARCHAR" javaType="string" mode="IN" />
   <parameter property="pass" jdbcType="VARCHAR" javaType="string" mode="IN" />
   <parameter property="id" jdbcType="INT" javaType="Integer" mode="INOUT" resultMap="returnResultMap" />
</parameterMap>

<procedure id="pro_insertUser11" parameterMap="paramUser" resultClass="int">
   <![CDATA[
    {call proc_userinsert(?,?,?)}
   ]]>
</procedure>
然后在UserDaoTest.java中增加如下一个方法:
public static void example11() throws Exception {
   try {
    Map map = new HashMap();
    map.put("name", "procedure");
    map.put("pass", "123456");
    Integer returnValue = (Integer)sqlMapClient.insert("pro_insertUser11", map);
    System.out.println(returnValue);
   } catch (Exception e) {
    e.printStackTrace();
   }
}
//注:调用存储过程的参数个数必须和写存储过程的时候参数(输入和输出)个数相同.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值