Mybatis3.2使用心得 中文API

http://wuxiangqian.iteye.com/blog/1987841

首先导入mybatis-3.2.3.jar包 还有连接数据库的驱动包,我用的是Sqls2005 所以导入sqljdbc.jar

工程中必须导入的三个包(对应的包附件中可以下载):

  • mybatis-3.2.3.jar

  • sqljdbc.jar

  • log4j-1.2.14.jar

  •  第一部分 配置MyBatis及经验之谈(我把类所在包的路径删了,如果要引用我代码的话自己新建一个合适的包路径)

  • 配置过程如下六个步骤缺一不可

  • 第一步:编写数据库连接文件sqlserver-jdbc-connection.properties,我的文件路径在com.mybatis.config包下

Xml代码   收藏代码
  1. #sqlserver connection  
  2. driver=com.microsoft.sqlserver.jdbc.SQLServerDriver  
  3. url=jdbc:sqlserver://192.168.1.31:1433; DatabaseName=dataBaseName  
  4. username=sa  
  5. password=sa  

 

  • 第二步:编写MyBatis配置文件Configuration.xml,我的文件路径在com.mybatis.config包下

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"   
  3. "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  4.   
  5. <!-- 注意:每个标签必须按顺序写,不然蛋疼的DTD会提示错误:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)". -->  
  6. <configuration>  
  7.     <!-- 属性配置 -->  
  8.     <properties resource="com/mybatis/config/sqlserver-jdbc-connection.properties">  
  9.         <!-- 相同属性:最高优先级的属性是那些作为方法参数的,然后是资源/url 属性,最后是 properties元素中指定的属性 -->  
  10. <!--         <property name="username" value="sa"/> -->  
  11. <!--         <property name="password" value="phoenix"/> -->  
  12.     </properties>  
  13.       
  14.     <!-- 设置缓存和延迟加载等等重要的运行时的行为方式 -->  
  15.     <settings>  
  16.         <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间  -->  
  17.         <setting name="defaultStatementTimeout" value="25000"/>  
  18.         <!-- 这个配置使全局的映射器启用或禁用缓存  -->  
  19.         <setting name="cacheEnabled" value="true"/>  
  20.           
  21.         <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载  -->  
  22. <!--         <setting name="lazyLoadingEnabled" value="true"/> -->  
  23.         <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载  -->  
  24.         <setting name="aggressiveLazyLoading" value="true"/>  
  25.           
  26.         <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)  -->  
  27.         <setting name="multipleResultSetsEnabled" value="true"/>  
  28.         <!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动  -->  
  29.         <setting name="useColumnLabel" value="true"/>  
  30.         <!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby)  -->  
  31.         <setting name="useGeneratedKeys" value="false"/>  
  32.         <!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况)  -->  
  33.         <setting name="autoMappingBehavior" value="PARTIAL"/>  
  34.         <!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新  -->  
  35.         <setting name="defaultExecutorType" value="SIMPLE"/>  
  36.     </settings>  
  37.       
  38.     <!-- 别名 -->  
  39.     <typeAliases>  
  40.         <!-- 用户bean-用户登录时映射使用  -->  
  41.         <typeAlias alias="UserBean" type="com.restservice.bean.UserBean"/>  
  42.       
  43.       
  44.     <environments default="development">  
  45.         <!-- environment 元素体中包含对事务管理和连接池的环境配置 -->  
  46.         <environment id="development">  
  47.             <transactionManager type="JDBC" />  
  48.             <!-- type分三种:  
  49.                     UNPOOLED是每次被请求时简单打开和关闭连接   
  50.                     UNPOOLED的数据源仅仅用来配置以下 4 种属性driver,url,username,password  
  51.                     POOLED :JDBC连接对象的数据源连接池的实现,不直接支持第三方数据库连接池  
  52.             -->  
  53.             <dataSource type="POOLED">  
  54.                 <property name="driver" value="${driver}" />  
  55.                 <property name="url" value="${url}" />  
  56.                 <property name="username" value="${username}" />  
  57.                 <property name="password" value="${password}" />  
  58.             </dataSource>  
  59.         </environment>  
  60.     </environments>  
  61.       
  62.     <!-- ORM映射文件 -->  
  63.     <mappers>  
  64.         <!-- 用户测试XML -->  
  65.         <mapper resource="com/restservice/bean/UserBean.xml" />  
  66.     </mappers>      
  67. </configuration>   

 

  • 第三步:编写对应的用户bean及xml

贴一下xml代码,需要自己写一下bean哦,(不会可以留言。大笑

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper       
  3. PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"       
  4. "<a href="http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd</a>">       
  5.      
  6. <!-- namespace用于java代码调用时识别指定xml的mapper文件 -->  
  7. <mapper namespace="userinfo">  
  8.  <!-- 开启Mabatis二级缓存 -->  
  9.  <cache/>  
  10.  <!-- 配置ORM映射 -->  
  11.  <resultMap type="UserInfo" id="user_orm">  
  12.   <id property="id" column="id"/>  
  13.   <result property="code" column="code"/>  
  14.   <result property="name" column="name"/>  
  15.   <result property="sex" column="sex"/>  
  16.   <result property="phone" column="phone"/>  
  17.   <result property="money" column="money"/>  
  18.  </resultMap>  
  19.    
  20.  <!-- 用来定义可重用的SQL代码段 -->  
  21.  <sql id="demo_sql">  
  22.   code,name,sex,phone,money  
  23.  </sql>  
  24.    
  25.  <insert id="inser_userInfo" parameterType="UserInfo">  
  26.   <!-- include 引用可重用的SQL代码段 -->  
  27.   INSERT INTO USERINFO(<include refid="demo_sql"/>) VALUES(#{code},#{name},#{sex},#{phone},#{money})  
  28.  </insert>  
  29.    
  30.  <update id="update_userInfo" parameterType="UserInfo">  
  31.   UPDATE USERINFO SET code=#{code} ,name=#{name} ,sex=#{sex} ,phone=#{phone} ,money=#{money} WHERE id=#{id}  
  32.  </update>  
  33.     
  34.     <select id="selectAll_userInfo"  resultMap="user_orm">  
  35.      SELECT * FROM USERINFO  
  36.    </select>  
  37.      
  38.    <select id="selectById_userInfo" parameterType="int" resultType="UserInfo">  
  39.      SELECT * FROM USERINFO WHERE id= #{id}  
  40.    </select>  
  41. </mapper>    

 

 sql语句中常用的特殊处理

如:需要in查询

 

Xml代码   收藏代码
  1. <select id="findWellsInfo" useCache="false" flushCache="true" resultType="hashmap">  
  2.   SELECT ID AS FIELDCODE,NAME AS DATACATEGORYNAME,'' COLOR FROM IMS_WELL WHERE ID IN   
  3.   <foreach item="wellIds" index="index" collection="wellIds"  
  4.   open="(" separator="," close=")">  
  5.   #{wellIds}  
  6.   </foreach>  
  7.    </select>  

我这里传入的参数是一个map ,map中有一个参数是数组wellIds,所以我写成collection="wellIds";

可以直接传入数组,写法:只需要把collection="wellIds"改成collection="array";

也可以传入List ,写法:只需要把collection="wellIds"改成collection="list";

 还有很多特殊情况就不一一举例了,具体请详细阅读附件MyBatis3.2中文API

 

  •  第四步:创建SessionFactoryUtil.java工具类

Java代码   收藏代码
  1. import java.io.IOException;  
  2. import java.io.Reader;  
  3.   
  4. import org.apache.ibatis.io.Resources;  
  5. import org.apache.ibatis.session.SqlSession;  
  6. import org.apache.ibatis.session.SqlSessionFactory;  
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  8. import org.apache.log4j.Logger;  
  9. /** 
  10.  *  
  11.  * MyBatis会话工厂类. 
  12.  *  
  13.  * @version 1.0 2013-12-1 
  14.  * @author xqwu 
  15.  */  
  16. public class SessionFactoryUtil {  
  17.       
  18.     protected static final Logger log = Logger.getLogger(SessionFactoryUtil.class);  
  19.     //MyBatis配置路径  
  20.     private static final String RESOURCE = "com/mybatis/config/Configuration.xml";  
  21.     //sql会话工厂  
  22.     private static SqlSessionFactory sqlSessionFactory = null;  
  23.     //所有sqlSession  
  24.     private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();  
  25.       
  26.     /** 
  27.      * 静态代码块 用于获得sqlSessionFactory 
  28.      * 不执行 由SessionFactoryListener调用初始化方法 
  29.      */  
  30.     /*static { 
  31.         Reader reader = null; 
  32.         try { 
  33.             reader = Resources.getResourceAsReader(RESOURCE); 
  34.         } catch (IOException ioex) { 
  35.             throw new RuntimeException("Get resource error:"+RESOURCE, ioex); 
  36.         } 
  37.         //获得sqlSessionFactory 
  38.         sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); 
  39.     }*/  
  40.       
  41.     /** 
  42.      *  
  43.      * 获得SqlSessionFactory 
  44.      * @author xqwu 
  45.      * @date 2013-12-1 下午2:08:59 
  46.      * 
  47.      * @return 
  48.      */  
  49.     public static SqlSessionFactory getSqlSessionFactory(){     
  50.         return sqlSessionFactory;     
  51.     }  
  52.   
  53.     /** 
  54.      *  
  55.      * 初始化SqlSessionFactory. 
  56.      * @author xqwu 
  57.      * @date 2013-12-1 下午2:08:39 
  58.      * 
  59.      */  
  60.     public static void initSqlSessionFactory() throws RuntimeException,Exception{  
  61.         try {  
  62.               
  63.             if(sqlSessionFactory == null){  
  64.                 Reader reader = Resources.getResourceAsReader(RESOURCE);  
  65.                 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);  
  66.                 log.debug("init sqlSessionFactory success");  
  67.             }  
  68.               
  69.         } catch (IOException ioex) {  
  70.               
  71.             throw new RuntimeException("Get resource error:"+RESOURCE, ioex);  
  72.               
  73.         }  
  74.     }  
  75.       
  76.     /** 
  77.      *  
  78.      * 获取sqlSession. 
  79.      * @author xqwu 
  80.      * @date 2013-12-1 上午11:27:38 
  81.      * 
  82.      * @return 
  83.      */  
  84.     public static SqlSession getSession(){  
  85.         SqlSession sqlsession = threadLocal.get();  
  86.           
  87.         if(sqlsession!=null){  
  88.             if(sqlSessionFactory == null){  
  89.                 getSqlSessionFactory();  
  90.             }  
  91.             //如果sqlSessionFactory不为空则获取sqlSession,否则返回null  
  92.             sqlsession = (sqlSessionFactory!=null) ? sqlSessionFactory.openSession(): null;  
  93.         }  
  94.           
  95.         return sqlsession;  
  96.     }  
  97.       
  98.     /** 
  99.      *  
  100.      * 关闭sqlSession 
  101.      * @author xqwu 
  102.      * @date 2013-12-1 上午11:26:23 
  103.      * 
  104.      */  
  105.     public static void closeSqlSession() throws Exception{  
  106.         //获得sqlsession  
  107.         SqlSession sqlsession = threadLocal.get();  
  108.         threadLocal.set(null);  
  109.         if(sqlsession!=null){//验证关闭sqlsession  
  110.             sqlsession.close();  
  111.             log.debug("close sqlsession success");  
  112.         }  
  113.           
  114.         log.debug("sqlsession is null");  
  115.     }  
  116. }  

 

  •  第五步:创建tomcat启动监听器类SessionFactoryListener,用于管理sqlSessionFactory生命周期(我用的是tomcat6.0)

Java代码   收藏代码
  1. import javax.servlet.ServletContextEvent;  
  2. import javax.servlet.ServletContextListener;  
  3.   
  4. import org.apache.log4j.Logger;  
  5.   
  6. import com.opro.ims.i.restservice.utils.SessionFactoryUtil;  
  7.   
  8. /** 
  9.  * Class description goes here. 
  10.  *  
  11.  * @version 1.0 2013-12-6 
  12.  * @author xqwu 
  13.  */  
  14. public class SessionFactoryListener implements ServletContextListener {  
  15.   
  16.     protected static final Logger log = Logger.getLogger(SessionFactoryListener.class);  
  17.     /* (non-Javadoc) 
  18.      * <p>Title: contextDestroyed</p> 
  19.      * <p>Description: </p> 
  20.      * @param arg0 
  21.      * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。 
  22.      * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) 
  23.      */  
  24.     @Override  
  25.     public void contextDestroyed(ServletContextEvent arg0) {  
  26.         try {  
  27.               
  28.             SessionFactoryUtil.closeSqlSession();  
  29.               
  30.         } catch (Exception ex) {  
  31.               
  32.             log.error(ex.getMessage());  
  33.               
  34.         }  
  35.     }  
  36.   
  37.     /* (non-Javadoc) 
  38.      * <p>Title: contextInitialized</p> 
  39.      * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,  
  40.      * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。  
  41.      * @param arg0 
  42.      * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent) 
  43.      */  
  44.     @Override  
  45.     public void contextInitialized(ServletContextEvent arg0) {  
  46.           
  47.         try {  
  48.               
  49.             SessionFactoryUtil.initSqlSessionFactory();  
  50.               
  51.         } catch (RuntimeException rex) {  
  52.   
  53.             log.error(rex.getMessage());  
  54.               
  55.         } catch (Exception ex) {  
  56.   
  57.             log.error(ex.getMessage());  
  58.               
  59.         }  
  60.           
  61.     }  
  62.   
  63. }  

 

  •  第六步:web.xml 配置文件中加入如下内容

Xml代码   收藏代码
  1. <!-- 初始化SessionFactory监听器 -->  
  2. <listener>     
  3.     <listener-class>com.opro.ims.i.restservice.listener.SessionFactoryListener</listener-class>     
  4. </listener>   

 

 

  • 第二部分,自己写的扩展接口,项目中所有的dao都继承该接口,个人觉得是可以方便许多。(我把类所在包的路径删了,如果要引用我代码的话自己新建一个合适的包路径)放在自定义包下,如:package com.gool.core

 

编写接口BaseDao

Java代码   收藏代码
  1. import java.sql.SQLException;  
  2. import java.util.List;  
  3.   
  4. import org.apache.ibatis.session.SqlSession;  
  5. import org.apache.ibatis.type.TypeException;  
  6.   
  7. /** 
  8.  * Class description goes here. 
  9.  *  
  10.  * @version 1.0 2013-11-29 
  11.  * @author xqwu 
  12.  */  
  13. public interface BaseDao {  
  14.       
  15.     /** 
  16.      *  
  17.      * 获得sqlSession对象. 
  18.      * @author xqwu 
  19.      * @date 2013-11-29 下午4:17:11 
  20.      * 
  21.      * @return 
  22.      */  
  23.     public SqlSession getSqlSession() throws TypeException,SQLException,Exception;  
  24.       
  25.     /** 
  26.      *  
  27.      * 插入数据. 
  28.      * @author xqwu 
  29.      * @date 2013-12-6 上午09:56:00 
  30.      * 
  31.      * @param s 
  32.      * @param obj 
  33.      * @throws TypeException 
  34.      * @throws SQLException 
  35.      * @throws Exception 
  36.      */  
  37.     public void insert(String s, Object obj) throws TypeException,SQLException,Exception;  
  38.       
  39.     /** 
  40.      *  
  41.      * 查询所有数据. 
  42.      * @author xqwu 
  43.      * @date 2013-11-29 下午3:52:21 
  44.      * 
  45.      * @return 
  46.      */  
  47.     public List<?> findAll(String s, Object obj) throws TypeException,SQLException,Exception;  
  48.       
  49.     /** 
  50.      *  
  51.      * 查询指定页数大小. 
  52.      * @author xqwu 
  53.      * @date 2013-11-29 下午3:54:06 
  54.      * 
  55.      * @param s      namespace用于java代码调用时识别指定xml的mapper文件 
  56.      * @param pageNo 页码 
  57.      * @param pageSize 大小 
  58.      * @return 
  59.      */  
  60.     public List<?> findList(String s, Object obj, int pageNo, int pageSize) throws TypeException,SQLException,Exception;  
  61.       
  62.     /** 
  63.      *  
  64.      * 查询返回对象. 
  65.      * @author xqwu 
  66.      * @date 2013-12-2 下午02:58:41 
  67.      * 
  68.      * @param s 
  69.      * @param param 
  70.      * @return 
  71.      */  
  72.     public Object selectOne(String s, Object param) throws TypeException,SQLException,Exception;  
  73.       
  74.     /** 
  75.      *  
  76.      * 更新数据方法. 
  77.      * @author xqwu 
  78.      * @date 2013-12-4 下午05:59:16 
  79.      * 
  80.      * @param s 
  81.      * @param param 
  82.      * @throws TypeException 
  83.      * @throws SQLException 
  84.      * @throws Exception 
  85.      */  
  86.     public void update(String s, Object param) throws TypeException,SQLException,Exception;  
  87. }  

 

编写接口实现BaseDaoImpl

Java代码   收藏代码
  1. import java.sql.SQLException;  
  2. import java.util.List;  
  3.   
  4. import org.apache.ibatis.session.RowBounds;  
  5. import org.apache.ibatis.session.SqlSession;  
  6. import org.apache.ibatis.type.TypeException;  
  7.   
  8. import com.opro.ims.i.restservice.core.BaseDao;  
  9. import com.opro.ims.i.restservice.utils.SessionFactoryUtil;  
  10.   
  11. /** 
  12.  * Dao基类,所有Dao都继承该类. 
  13.  *  
  14.  * @version 1.0 2013-11-29 
  15.  * @author xqwu 
  16.  */  
  17. public class BaseDaoImpl implements BaseDao{  
  18.   
  19.     @Override  
  20.     public SqlSession getSqlSession() throws TypeException,SQLException,Exception {  
  21.         // TODO Auto-generated method stub  
  22.         return SessionFactoryUtil.getSqlSessionFactory().openSession();  
  23.     }  
  24.   
  25.     @Override  
  26.     public List<?> findAll(String s, Object obj) throws TypeException,SQLException,Exception {  
  27.         // TODO Auto-generated method stub  
  28.         SqlSession session = getSqlSession();  
  29.         try{  
  30.             List list = session.selectList(s, obj);  
  31.             return list;  
  32.         } finally{  
  33.             session.close();  
  34.         }  
  35.     }  
  36.       
  37.     @Override  
  38.     public List<?> findList(String s, Object obj, int pageNo, int pageSize) throws TypeException,SQLException,Exception {  
  39.         // TODO Auto-generated method stub  
  40.         SqlSession session = getSqlSession();  
  41.         try{  
  42.             List list = session.selectList(s, obj, new RowBounds((pageNo-1)*pageSize, pageSize));  
  43.             return list;  
  44.         } finally{  
  45.             session.close();  
  46.         }  
  47.     }  
  48.   
  49.     @Override  
  50.     public Object selectOne(String s, Object param) throws TypeException,SQLException,Exception {  
  51.         // TODO Auto-generated method stub  
  52.         SqlSession session = getSqlSession();  
  53.         try{  
  54.             Object object = session.selectOne(s, param);  
  55.             return object;  
  56.         } finally{  
  57.             session.close();  
  58.         }  
  59.     }  
  60.   
  61.     @Override  
  62.     public void update(String s, Object param) throws TypeException,SQLException, Exception {  
  63.         // TODO Auto-generated method stub  
  64.         SqlSession session = getSqlSession();  
  65.         try{  
  66.             session.update(s, param);  
  67.             session.commit();  
  68.         } finally{  
  69.             session.close();  
  70.         }  
  71.     }  
  72.   
  73.     /* (non-Javadoc) 
  74.      * <p>Title: insert</p> 
  75.      * <p>Description: </p> 
  76.      * @param s 
  77.      * @param obj 
  78.      * @throws TypeException 
  79.      * @throws SQLException 
  80.      * @throws Exception 
  81.      * @see com.opro.ims.i.restservice.core.BaseDao#insert(java.lang.String, java.lang.Object) 
  82.      */  
  83.     @Override  
  84.     public void insert(String s, Object param) throws TypeException, SQLException, Exception {  
  85.         // TODO Auto-generated method stub  
  86.         SqlSession session = getSqlSession();  
  87.         try{  
  88.             session.insert(s, param);  
  89.             session.commit();  
  90.         } finally{  
  91.             session.close();  
  92.         }  
  93.     }  
  94.       
  95. }  

 

在Dao层中调用示例

继承BaseDaoImpl后,写法就如此简单了

 

Java代码   收藏代码
  1. import java.sql.SQLException;  
  2. import java.util.List;  
  3. import java.util.Map;  
  4.   
  5. import org.apache.ibatis.type.TypeException;  
  6.   
  7. import com.opro.ims.i.restservice.core.impl.BaseDaoImpl;  
  8.   
  9. /** 
  10.  * 检索报警数据Dao. 
  11.  *  
  12.  * @version 1.0 2013-12-5 
  13.  * @author xqwu 
  14.  */  
  15. public class RetrieveWarningsDao extends BaseDaoImpl{  
  16.     @SuppressWarnings("unchecked")  
  17.     public List retrieveWarnings(Map param, int pageNo, int pageSize) throws TypeException,SQLException,Exception{  
  18.         return findList("retrievewarnings.retrieveWarnings", param, pageNo, pageSize);  
  19.     }  
  20. }  

 

你可能感兴趣的:(Mybatis3.2使用心得 中文API)