环境
Db2
$ db2level
DB21085I This instance or install (instance name, where applicable:
"db2inst1") uses "64" bits and DB2 code release "SQL11050" with level
identifier "0601010F".
Informational tokens are "DB2 v11.5.0.0", "s1906061700", "DYN1906061700AMD64",
and Fix Pack "0".
Product is installed at "/opt/ibm/db2/V11.5".
Db2 JCC driver
- db2jcc_license_cu.jar
- db2jcc4.jar
- db2java.zip //没用
- db2jcc.jar //不仅没用,而且会导致出错
注意,不能用 db2jcc.jar
,而要用 db2jcc4.jar
。当二者同时存在时,貌似就会用前者,从而报错: Method com/ibm/db2/jcc/am/hp.isClosed()Z is absstract
网上搜了一下,说是driver版本问题。
Anyway,只用 db2jcc4.jar
和 db2jcc_license_cu.jar
就OK,同时不能有 db2jcc.jar
。
MyBatis
登录MyBatis官网(http://www.mybatis.org),下载最新的release。
注:该网址会自动重定向到 https://blog.mybatis.org 。
我下载的是mybatis-3.5.9.zip。
解压后,得到mybatis-3.5.9.jar,以及lib目录下一堆jar包。
Database
SAMPLE
$ db2 connect to sample
Database Connection Information
Database server = DB2/LINUXX8664 11.5.0.0
SQL authorization ID = DB2INST1
Local database alias = SAMPLE
Table
T6
$ db2 describe table t6
Data type Column
Column name schema Data type name Length Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
C1 SYSIBM INTEGER 4 0 Yes
C2 SYSIBM VARCHAR 8 0 Yes
2 record(s) selected.
代码
在Eclipse里新建一个Java project(本例中project name是 TestProject0209
),在project上点击右键,属性,Java Build Path -> Libraries -> Add external JARs…,把Mybatis和jcc driver的jar包文件加进来,如下:
注:为了方便,我在project的根目录下创建了一个 lib
目录,并把3个jar文件都复制到这里了。
注:解压 mybatis-3.5.9.zip
后,在lib子目录下还有一堆jar文件,比如log4j-1.2.17.jar
,本例貌似用不上,所以都没加到project里。
在 src
目录下创建3个package:
- pojo
- dao
- service
在 pojo
下创建类 MyObject
,这是一个非常简单的POJO,对应DB里的table T6
:
c1
成员变量对应table的c1
列c2
成员变量对应table的c2
列
package pojo;
public class MyObject {
private int c1;
private String c2;
public int getC1() {
return c1;
}
public void setC1(int c1) {
this.c1 = c1;
}
public String getC2() {
return c2;
}
public void setC2(String c2) {
this.c2 = c2;
}
}
接下来我们来创建mapper,在 dao
下,创建 Test0209Mapper.java
和 Test0209Mapper.xml
文件。
Test0209Mapper.java
package dao;
import java.util.List;
import pojo.MyObject;
public interface Test0209Mapper {
int insert(MyObject obj);
List<MyObject> read();
}
Test0209Mapper.xml
<?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="dao.Test0209Mapper">
<insert id = "insert">
insert into t6 (c1, c2) values (#{c1}, #{c2})
</insert>
<select id = "read" resultType="pojo.MyObject">
select c1, c2 from t6
</select>
</mapper>
在 src
目录下新建 mybatis-config.xml
文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="db2">
<environment id="db2">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.ibm.db2.jcc.DB2Driver"/>
<!-- <property name="driver" value="com.mysql.jdbc.Driver"/> -->
<property name="url" value="jdbc:db2://9.30.251.58:50000/sample"/>
<property name="username" value="db2inst1"/>
<property name="password" value="N1cetest"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="dao.Test0209Mapper"/>
</mappers>
</configuration>
注:
- 注释的driver属性,是MySQL的配置,若要改用MySQL,则这里需要相应改一下
- 所有mapper都定义在最下面的mapper处,本例中只使用了一个mapper
dao.Test0209Mapper
,这是mapper类的全路径
最后,我们在 service
下创建 TestMybatis
类,来测试一下mapper:
package service;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import pojo.MyObject;
import dao.Test0209Mapper;
public class TestMybatis {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession(true);
try {
Test0209Mapper mapper = sqlSession.getMapper(Test0209Mapper.class);
System.out.println("Test 1: query t6");
List<MyObject> list = mapper.read();
list.forEach(e -> System.out.println("c1: " + e.getC1() + ", c2: " + e.getC2()));
System.out.println("Test 2: insert into t6");
MyObject obj = new MyObject();
obj.setC1(123);
obj.setC2("abc");
mapper.insert(obj);
System.out.println("Test 3: query t6 again");
list = mapper.read();
list.forEach(e -> System.out.println("c1: " + e.getC1() + ", c2: " + e.getC2()));
} finally {
sqlSession.close();
}
}
}
运行程序,结果如下:
Test 1: query t6
c1: 111, c2: xxx
Test 2: insert into t6
Test 3: query t6 again
c1: 111, c2: xxx
c1: 123, c2: abc