在上一篇的日志中讲到了iBatis HelloWorld。自己在写完以后发现有些问题
在FirstTest 类中的两个size的确是能显示出正确的记录数,但问题在于两个对象的属性无法取得
其实问题在于一个叫helloworld.map.xml的文件里需要做些修改
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD iBatis Mapper 3.0 //EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="basic.HelloWorld"> <select id="getHelloworlds" resultType="java.util.List" resultMap="helloWorldMap"> select hw_id, name, age from t_helloworld </select> <select id="getHelloworldsMapByHwId" resultType="HelloWorld" resultMap="helloWorldMap" parameterType="int" statementType="PREPARED"> select hw_id, name, age from t_helloworld where hw_id = #{hw_id} </select> <resultMap id="helloWorldMap" type="HelloWorld"> <id property="hwId" column="hw_id"/> <result property="name" column="name"/> <result property="age" column="age"/> </resultMap> </mapper>
在这里添加了个很重要的resultMap ,在这个之后我就能获得正确的值了
好了下面重新看下代码,为了节约时间写了个工具类
IBatisUtil.java
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
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 org.apache.ibatis.transaction.Transaction;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
/**
* ibatis工具类,仅用做测试
* @author Charles King
* IBatisUtil.class
*/
public class IBatisUtil {
private static final String IBATIS_CONFIG_XML = "/ibatis-config.xml";
private final static ThreadLocal<SqlSession> sessionThread = new ThreadLocal<SqlSession>();
private final static ThreadLocal<Transaction> transactionThread = new ThreadLocal<Transaction>();
private IBatisUtil(){
}
/**
* 获得已有sqlSession没有就创建
* @return
*/
public static SqlSession openSessionIfNotExist(){
if(isSessionNotNull())
return getSqlSession();
return createNewSqlSession();
}
/**
* 关闭sqlSession
*/
public static void closeSqlSession(){
if(isSessionNotNull()){
getSqlSession().close();
}
}
/**
* 创建新的sqlSession
* @return
*/
private static SqlSession createNewSqlSession(){
String configXml = "basic" + IBATIS_CONFIG_XML;
SqlSessionFactoryBuilder builder = null;
SqlSessionFactory factory = null;
SqlSession session = null;
Reader config;
try {
builder = new SqlSessionFactoryBuilder();
config = Resources.getResourceAsReader(configXml);
factory = builder.build(config);
session = factory.openSession();
setSessionInThread(session);
} catch (IOException e) {
e.printStackTrace();
}
return session;
}
public static Transaction getCurrentTransactionNotAutoCommit(){
return getCurrentTransaction(false);
}
public static Transaction getCurrentTransaction(boolean autoCommit){
//session为空,不需要transaction
if(!isSessionNotNull()) return null;
//session不为空
Transaction t = getCurrentTransaction();
//1. 已经有transaction
if(t!=null) return t;
//2. 没有transaction
TransactionFactory factory = new JdbcTransactionFactory();
t = factory.newTransaction(getSqlSession().getConnection(), autoCommit);
setTxInThread(t);
return t;
}
public static Transaction getCurrentTransactionWithNewSession(boolean autoCommit){
openSessionIfNotExist();
return getCurrentTransaction(autoCommit);
}
public static void rollback() throws SQLException{
if(isTransactionNotNull()){
getCurrentTransaction().rollback();
}
}
public static void commit() throws IBatisException{
if(isTransactionNotNull()){
try {
getCurrentTransaction().commit();
} catch (SQLException e) {
throw new IBatisException(e.getNextException());
}
}
}
public static void commitAndClose() throws IBatisException{
try {
commit();
getCurrentTransaction().close();
} catch (SQLException e) {
throw new IBatisException(e.getNextException());
}
sessionThread.remove();
transactionThread.remove();
}
/**
* 存入LocalThread
* @param session
*/
private static void setSessionInThread(SqlSession session){
sessionThread.set(session);
}
/**
* 从LocalThread中获得sqlSession
* @return
*/
private static SqlSession getSqlSession() {
return sessionThread.get();
}
/**
* 判断LocalThread中sqlSession是否为空
* @return
*/
private static boolean isSessionNotNull(){
if(getSqlSession()==null)
return false;
return true;
}
private static void setTxInThread(Transaction tx){
transactionThread.set(tx);
}
private static Transaction getCurrentTransaction(){
Transaction transaction = transactionThread.get();
return transaction;
}
private static boolean isTransactionNotNull(){
if(getCurrentTransaction() != null) return true;
return false;
}
public static int insert(String statement, Object parameter) throws IBatisException{
IBatisAssert.assertSqlSessionNotNull(getSqlSession());
return getSqlSession().insert(statement, parameter);
}
public static int insert(String statement) throws IBatisException{
IBatisAssert.assertSqlSessionNotNull(getSqlSession());
return getSqlSession().insert(statement);
}
public static int update(String statement, Object parameter) throws IBatisException{
IBatisAssert.assertSqlSessionNotNull(getSqlSession());
return getSqlSession().update(statement, parameter);
}
public static int update(String statement) throws IBatisException{
IBatisAssert.assertSqlSessionNotNull(getSqlSession());
return getSqlSession().update(statement);
}
}
引入自定义异常类
IBatisException.java
public class IBatisException extends Exception {
private static final long serialVersionUID = -8341903249485894181L;
public IBatisException(String errorMsg){
super(errorMsg);
}
public IBatisException(Exception e) {
super(e);
}
public IBatisException(Throwable t) {
super(t);
}
}
之后看下重新改过的测试类吧
FirstTest.java
import java.util.List;
import util.IBatisException;
import util.IBatisManager;
import util.IBatisUtil;
public class FirstTest {
public static void main(String[] args) throws IBatisException {
IBatisUtil.getCurrentTransactionWithNewSession(false);
IBatisManager<HelloWorld> manager = null;
List<HelloWorld> list = null;
HelloWorld helloworld = null;
try {
manager = new IBatisManager<HelloWorld>();
list = manager.selectList("getHelloworlds");
System.out.println(list.size());
System.out.println(manager.selectList("getHelloworlds").get(0));
helloworld = manager.selectOne("getHelloworldsMapByHwId", 1);
System.out.println(helloworld.toString());
} finally {
IBatisUtil.commitAndClose();
}
}
}
同样复下HelloWorld.java
import java.io.Serializable;
@SuppressWarnings("serial")
public class HelloWorld implements Serializable {
private Integer hwId;
private String name;
private Integer age;
//setters & getters...
@Override
public String toString() {
String str = "hw_id:" + hwId + "\n"
+ "name: " + name + "\n"
+ "age: " + age +"\n";
return str;
}
}