下面的代码只是个人在练习ibatis的使用,如果发现有什么错误,请指出,不胜感激。
1、数据库,我这里使用的是MySQL数据库,首先在数据库中新建一个表,并插入适当的数据。
#新建表 DROP TABLE IF EXISTS SYSTEM_USER; CREATE TABLE SYSTEM_USER ( #创建一个带自增长的ID列 SYSUSER_ID INT UNSIGNED NOT NULL AUTO_INCREMENT, CONSTRAINT SYSTEM_USER_PK PRIMARY KEY(SYSUSER_ID), SYSUSER_NAME VARCHAR(50), CONSTRAINT SYSTEM_USER_UK UNIQUE(SYSUSER_NAME), SYSUSER_PASSWORD VARCHAR(50) NOT NULL, EFFECTIVE_DATE TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, EXPIRE_DATE TIMESTAMP DEFAULT '2037-01-01 00:00:00' ); #设置自增长的开始值 ALTER TABLE SYSTEM_USER AUTO_INCREMENT = 10001; #插入数据 INSERT INTO SYSTEM_USER(SYSUSER_NAME, SYSUSER_PASSWORD) VALUES( 'USER1', 'USER11'); INSERT INTO SYSTEM_USER(SYSUSER_NAME, SYSUSER_PASSWORD) VALUES( 'USER2', 'USER22'); INSERT INTO SYSTEM_USER(SYSUSER_NAME, SYSUSER_PASSWORD) VALUES( 'USER3', 'USER33'); COMMIT;
2、新建一个java工程,将需要的jar包导入工程,我这里使用的两个jar包是:ibatis-2.3.0.677.jar,mysql-connector-java-5.1.6-bin.jar。
3、在工程src目录下(后面的配置文件我都放在这个目录下面),新建一个jdbc.properties文件,填写数据库的配置。
jdbc.driverClassName=com.mysql.jdbc.Driver #数据库的IP地址,端口号,数据库的名称 jdbc.url=jdbc:mysql://localhost:3306/laosan #用户名 jdbc.username=root #密码 jdbc.password=520
4、新建一个SqlMapConfig.xml文件,填写ibatis的主要配置,我上一篇文章中专门介绍了ibatis配置文件的写法,这里不再重复,有需要的朋友可以在我博客中找找。
<?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="jdbc.properties" /> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="20" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> <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="testSql.xml" /> </sqlMapConfig>
5、新建一个testSql.xml文件,填写在映射关系和SQL等等,关于这种文件的写法,在上一篇文章中同样有介绍。
<?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="TestSQL"> <typeAlias alias="test" type="com.zlc.model.TestModel" /> <resultMap id="testResult" class="test"> <result property="id" column="SYSUSER_ID" /> <result property="name" column="SYSUSER_NAME" /> <result property="password" column="SYSUSER_PASSWORD" /> <result property="effDate" column="EFFECTIVE_DATE" /> <result property="expDate" column="EXPIRE_DATE" /> <result property="rowCount" column="ROWCOUNT" /> </resultMap> <select id="testSelectAll" resultMap="testResult" parameterClass="test"> <![CDATA[ SELECT t.*, ]]> ( SELECT COUNT(*) FROM SYSTEM_USER ) AS ROWCOUNT FROM SYSTEM_USER t </select> <update id="testUpdate" parameterClass="test"> UPDATE SYSTEM_USER t <dynamic prepend="set"> <isNotEmpty prepend="and" property="name"> t.SYSUSER_NAME = #name# </isNotEmpty> <isNotEmpty prepend="," property="password"> t.SYSUSER_PASSWORD=#password# </isNotEmpty> <isNotEmpty prepend="," property="effDate"> t.effective_date=#effDate# </isNotEmpty> <isNotEmpty prepend="," property="expDate"> t.EXPIRE_DATE=#expDate# </isNotEmpty> </dynamic> <dynamic prepend="where"> <isNotEmpty prepend="and" property="id"> t.SYSUSER_ID = #id# </isNotEmpty> </dynamic> </update> <insert id="testInsert" parameterClass="test"> INSERT INTO SYSTEM_USER (SYSUSER_NAME, SYSUSER_PASSWORD, EFFECTIVE_DATE, EXPIRE_DATE) VALUES (#name#, #password#, #effDate#, #expDate#); </insert> <delete id="testDelete" parameterClass="int"> DELETE FROM SYSTEM_USER WHERE SYSUSER_ID = #id# </delete> <sql id="test_condition_sql"> <isNotEmpty prepend="and" property="effDate"> t.EFFECTIVE_DATE = #effDate# </isNotEmpty> <isNotEmpty prepend="and" property="expDate"> t.EXPIRE_DATE = #expDate# </isNotEmpty> </sql> <sql id="test_count_sql"> SELECT COUNT(1) FROM SYSTEM_USER t WHERE 1 = 1 <include refid="test_condition_sql" /> </sql> <select id="testSelectForPage" parameterClass="test" resultMap="testResult"> <![CDATA[ SELECT t.*, ]]> ( <include refid="test_count_sql" /> ) as rowCount FROM SYSTEM_USER t WHERE 1 = 1 <include refid="test_condition_sql" /> </select> </sqlMap>
6、写一个模型类。
/**================================================= * 版权:laosan版权所有 * 包名:com.zlc.model * 文件:TestModel.java * 日期:2014-12-22 下午2:16:08 * 作者:laosan * 说明:ibatis模型类 *==================================================*/ package com.zlc.model; import java.sql.Timestamp; /** * @ClassName TestModel * @Description ibatis模型类 * * @author laosan * @date 2014-12-22 下午2:16:08 */ public class TestModel { private Integer id; private String name; private String password; private Timestamp effDate; private Timestamp expDate; private Integer rowCount; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Timestamp getEffDate() { return effDate; } public void setEffDate(Timestamp effDate) { this.effDate = effDate; } public Timestamp getExpDate() { return expDate; } public void setExpDate(Timestamp expDate) { this.expDate = expDate; } public Integer getRowCount() { return rowCount; } public void setRowCount(Integer rowCount) { this.rowCount = rowCount; } @Override public String toString() { return "TestModel [id=" + id + ", name=" + name + ", password=" + password + ", effDate=" + effDate + ", expDate=" + expDate + ", rowCount=" + rowCount + "]"; } }
7、写一个接口,这里主要是为了接近项目中的一般写法为进行这些步骤,因为只是练习,所以没有将异常的处理考虑进来。
/**================================================= * 版权:laosan版权所有 * 包名:com.zlc.dao * 文件:TestDao.java * 日期:2014-12-22 下午2:14:34 * 作者:laosan * 说明:练习ibatis *==================================================*/ package com.zlc.dao; import java.util.List; import com.zlc.model.TestModel; /** * @ClassName TestDao * @Description DAO层接口 * * @author laosan * @date 2014-12-22 下午2:14:34 */ public interface TestDao { /** * @MethodName addData * @Description 增加数据 * * @author laosan * @date 2014-12-22 下午2:20:38 * @param model */ void addData(TestModel model); /** * @MethodName deleteById * @Description 删除数据 * * @author laosan * @date 2014-12-22 下午2:21:10 * @param id */ void deleteById(Integer id); /** * @MethodName updateDate * @Description 修改数据 * * @author laosan * @date 2014-12-22 下午2:22:03 * @param model */ void updateDate(TestModel model); /** * @MethodName queryAll * @Description 查询所有数据 * * @author laosan * @date 2014-12-22 下午2:24:00 * @return */ List<TestModel> queryAll(); /** * @MethodName queryByConditionAndPages * @Description 根据条件分页查询 * * @author laosan * @date 2014-12-22 下午2:25:25 * @param model * @param pages * @param pageSize * @return */ List<TestModel> queryByConditionAndPages(TestModel model, int pages, int pageSize); }
8、实现第7步的接口。
/**================================================= * 版权:laosan版权所有 * 包名:com.zlc.dao.ibatis * 文件:TestDaoIbatis.java * 日期:2014-12-22 下午2:28:31 * 作者:laosan * 说明:DAO实现层 *==================================================*/ package com.zlc.dao.ibatis; import java.io.IOException; import java.io.Reader; import java.sql.SQLException; import java.util.List; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; import com.zlc.dao.TestDao; import com.zlc.model.TestModel; /** * @ClassName TestDaoIbatis * @Description DAO实现层 * * @author laosan * @date 2014-12-22 下午2:28:31 */ public class TestDaoIbatis implements TestDao { private static SqlMapClient sqlMapClient = null; // 读取ibatis配置文件 // 其实使用ibatis,只要掌握了下面的这部分静态代码块,使用起来就非常简单。 static { try { Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml"); sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader); reader.close(); } catch (IOException e) { e.printStackTrace(); } } @Override public void addData(TestModel model) { try { sqlMapClient.insert("testInsert", model); } catch (SQLException e) { e.printStackTrace(); } } @Override public void deleteById(Integer id) { try { sqlMapClient.delete("testDelete", id); } catch (SQLException e) { e.printStackTrace(); } } @Override public void updateDate(TestModel model) { try { sqlMapClient.update("testUpdate", model); } catch (SQLException e) { e.printStackTrace(); } } @SuppressWarnings("unchecked") @Override public List<TestModel> queryAll() { List<TestModel> results = null; try { results = sqlMapClient.queryForList("testSelectAll"); } catch (SQLException e) { e.printStackTrace(); } return results; } @SuppressWarnings("unchecked") @Override public List<TestModel> queryByConditionAndPages(TestModel model, int pages, int pageSize) { List<TestModel> results = null; try { int skip = (pages - 1) * pageSize; results = sqlMapClient.queryForList("testSelectForPage", model, skip, pageSize); } catch (SQLException e) { e.printStackTrace(); } return results; } }
9、代码已经完成了,最后写一个测试类进行测试。
/**================================================= * 版权:laosan版权所有 * 包名:com.zlc.test * 文件:Test.java * 日期:2014-12-22 下午3:22:31 * 作者:laosan * 说明:测试类 *==================================================*/ package com.zlc.test; import java.sql.Timestamp; import java.util.Date; import java.util.List; import com.zlc.dao.TestDao; import com.zlc.dao.ibatis.TestDaoIbatis; import com.zlc.model.TestModel; /** * @ClassName Test * @Description 测试类 * * @author laosan * @date 2014-12-22 下午3:22:31 */ public class Test { public static void main(String[] args) { TestDao dao = new TestDaoIbatis(); // 插入数据 // TestModel model = new TestModel(); // model.setName("testName01"); // model.setPassword("TestName01"); // model.setEffDate(new Timestamp(new Date().getTime())); // dao.addData(model); // 删除数据 // dao.deleteById(Integer.valueOf(10001)); // 修改数据 // TestModel model = new TestModel(); // model.setId(Integer.valueOf(10002)); // model.setName("updateName"); // model.setExpDate(new Timestamp(new Date().getTime())); // dao.updateDate(model); // 查询全部数据 // List<TestModel> results = dao.queryAll(); // System.out.println(results); // 分页查询数据 TestModel model = new TestModel(); List<TestModel> resultsList = dao.queryByConditionAndPages(model, 2, 2); System.out.println(resultsList); } }