最近写一个web服务接口,用到了MyBatis3.2,把我配置的过程及自己的一些做法供大家参考,希望能帮助到刚入手MyBatis的技术人员;(如果您阅读文章时发现问题,希望留言指出)
首先导入mybatis-3.2.3.jar包 还有连接数据库的驱动包,我用的是SQL Server2005 所以导入sqljdbc.jar
工程中必须导入的三个包(对应的包附件中可以下载):
mybatis-3.2.3.jar
sqljdbc.jar
log4j-1.2.14.jar
第一部分 配置MyBatis及经验之谈(我把类所在包的路径删了,如果要引用我代码的话自己新建一个合适的包路径)
配置过程如下六个步骤缺一不可
第一步:编写数据库连接文件sqlserver-jdbc-connection.properties,我的文件路径在com.mybatis.config包下
Xml代码
#sqlserver connection driver=com.microsoft.sqlserver.jdbc.SQLServerDriver url=jdbc:sqlserver://192.168.1.31:1433; DatabaseName=dataBaseName username=sa password=sa
第二步:编写MyBatis配置文件Configuration.xml,我的文件路径在com.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> <properties resource="com/mybatis/config/sqlserver-jdbc-connection.properties"> </properties> <settings> <setting name="defaultStatementTimeout" value="25000"/> <setting name="cacheEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="true"/> <setting name="multipleResultSetsEnabled" value="true"/> <setting name="useColumnLabel" value="true"/> <setting name="useGeneratedKeys" value="false"/> <setting name="autoMappingBehavior" value="PARTIAL"/> <setting name="defaultExecutorType" value="SIMPLE"/> </settings> <typeAliases> <typeAlias alias="UserBean" type="com.restservice.bean.UserBean"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!-- type分三种: UNPOOLED是每次被请求时简单打开和关闭连接 UNPOOLED的数据源仅仅用来配置以下 4 种属性driver,url,username,password POOLED :JDBC连接对象的数据源连接池的实现,不直接支持第三方数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/restservice/bean/UserBean.xml" /> </mappers> </configuration>
第三步:编写对应的用户bean及xml
贴一下xml代码,需要自己写一下bean哦,(不会可以留言。)
Xml代码
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "<a href="http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd</a>"> <mapper namespace="userinfo"> <cache/> <resultMap type="UserInfo" id="user_orm"> <id property="id" column="id"/> <result property="code" column="code"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="phone" column="phone"/> <result property="money" column="money"/> </resultMap> <sql id="demo_sql"> code,name,sex,phone,money </sql> <insert id="inser_userInfo" parameterType="UserInfo"> INSERT INTO USERINFO(<include refid="demo_sql"/>) VALUES(#{code},#{name},#{sex},#{phone},#{money}) </insert> <update id="update_userInfo" parameterType="UserInfo"> UPDATE USERINFO SET code=#{code} ,name=#{name} ,sex=#{sex} ,phone=#{phone} ,money=#{money} WHERE id=#{id} </update> <select id="selectAll_userInfo" resultMap="user_orm"> SELECT * FROM USERINFO </select> <select id="selectById_userInfo" parameterType="int" resultType="UserInfo"> SELECT * FROM USERINFO WHERE id= #{id} </select> </mapper>
sql语句中常用的特殊处理
如:需要in查询
Xml代码
<select id="findWellsInfo" useCache="false" flushCache="true" resultType="hashmap"> SELECT ID AS FIELDCODE,NAME AS DATACATEGORYNAME,'' COLOR FROM IMS_WELL WHERE ID IN <foreach item="wellIds" index="index" collection="wellIds" open="(" separator="," close=")"> #{wellIds} </foreach> </select>
我这里传入的参数是一个map ,map中有一个参数是数组wellIds,所以我写成collection="wellIds";
可以直接传入数组,写法:只需要把collection="wellIds"改成collection="array";
也可以传入List ,写法:只需要把collection="wellIds"改成collection="list";
还有很多特殊情况就不一一举例了,具体请详细阅读附件MyBatis3.2中文API
第四步:创建SessionFactoryUtil.java工具类
Java代码
import java.io.IOException; import java.io.Reader; 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.log4j.Logger; public class SessionFactoryUtil { protected static final Logger log = Logger.getLogger(SessionFactoryUtil.class); private static final String RESOURCE = "com/mybatis/config/Configuration.xml"; private static SqlSessionFactory sqlSessionFactory = null; private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } public static void initSqlSessionFactory() throws RuntimeException,Exception{ try { if(sqlSessionFactory == null){ Reader reader = Resources.getResourceAsReader(RESOURCE); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); log.debug("init sqlSessionFactory success"); } } catch (IOException ioex) { throw new RuntimeException("Get resource error:"+RESOURCE, ioex); } } public static SqlSession getSession(){ SqlSession sqlsession = threadLocal.get(); if(sqlsession!=null){ if(sqlSessionFactory == null){ getSqlSessionFactory(); } sqlsession = (sqlSessionFactory!=null) ? sqlSessionFactory.openSession(): null; } return sqlsession; } public static void closeSqlSession() throws Exception{ SqlSession sqlsession = threadLocal.get(); threadLocal.set(null); if(sqlsession!=null){ sqlsession.close(); log.debug("close sqlsession success"); } log.debug("sqlsession is null"); } }
第五步:创建tomcat启动监听器类SessionFactoryListener,用于管理sqlSessionFactory生命周期(我用的是tomcat6.0)
Java代码
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.log4j.Logger; import com.opro.ims.i.restservice.utils.SessionFactoryUtil; public class SessionFactoryListener implements ServletContextListener { protected static final Logger log = Logger.getLogger(SessionFactoryListener.class); @Override public void contextDestroyed(ServletContextEvent arg0) { try { SessionFactoryUtil.closeSqlSession(); } catch (Exception ex) { log.error(ex.getMessage()); } } @Override public void contextInitialized(ServletContextEvent arg0) { try { SessionFactoryUtil.initSqlSessionFactory(); } catch (RuntimeException rex) { log.error(rex.getMessage()); } catch (Exception ex) { log.error(ex.getMessage()); } } }
第六步:web.xml 配置文件中加入如下内容
Xml代码
<listener> <listener-class>com.opro.ims.i.restservice.listener.SessionFactoryListener</listener-class> </listener>
第二部分,自己写的扩展接口,项目中所有的dao都继承该接口,个人觉得是可以方便许多。(我把类所在包的路径删了,如果要引用我代码的话自己新建一个合适的包路径)放在自定义包下,如:package com.gool.core
编写接口BaseDao
Java代码
import java.sql.SQLException; import java.util.List; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.type.TypeException; public interface BaseDao { public SqlSession getSqlSession() throws TypeException,SQLException,Exception; public void insert(String s, Object obj) throws TypeException,SQLException,Exception; public List<?> findAll(String s, Object obj) throws TypeException,SQLException,Exception; public List<?> findList(String s, Object obj, int pageNo, int pageSize) throws TypeException,SQLException,Exception; public Object selectOne(String s, Object param) throws TypeException,SQLException,Exception; public void update(String s, Object param) throws TypeException,SQLException,Exception; }
编写接口实现BaseDaoImpl
Java代码
import java.sql.SQLException; import java.util.List; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.type.TypeException; import com.opro.ims.i.restservice.core.BaseDao; import com.opro.ims.i.restservice.utils.SessionFactoryUtil; public class BaseDaoImpl implements BaseDao{ @Override public SqlSession getSqlSession() throws TypeException,SQLException,Exception { return SessionFactoryUtil.getSqlSessionFactory().openSession(); } @Override public List<?> findAll(String s, Object obj) throws TypeException,SQLException,Exception { SqlSession session = getSqlSession(); try{ List list = session.selectList(s, obj); return list; } finally{ session.close(); } } @Override public List<?> findList(String s, Object obj, int pageNo, int pageSize) throws TypeException,SQLException,Exception { SqlSession session = getSqlSession(); try{ List list = session.selectList(s, obj, new RowBounds((pageNo-1)*pageSize, pageSize)); return list; } finally{ session.close(); } } @Override public Object selectOne(String s, Object param) throws TypeException,SQLException,Exception { SqlSession session = getSqlSession(); try{ Object object = session.selectOne(s, param); return object; } finally{ session.close(); } } @Override public void update(String s, Object param) throws TypeException,SQLException, Exception { SqlSession session = getSqlSession(); try{ session.update(s, param); session.commit(); } finally{ session.close(); } } @Override public void insert(String s, Object param) throws TypeException, SQLException, Exception { SqlSession session = getSqlSession(); try{ session.insert(s, param); session.commit(); } finally{ session.close(); } } }
在Dao层中调用示例
继承BaseDaoImpl后,写法就如此简单了
Java代码
import java.sql.SQLException; import java.util.List; import java.util.Map; import org.apache.ibatis.type.TypeException; import com.opro.ims.i.restservice.core.impl.BaseDaoImpl; public class RetrieveWarningsDao extends BaseDaoImpl{ @SuppressWarnings("unchecked") public List retrieveWarnings(Map param, int pageNo, int pageSize) throws TypeException,SQLException,Exception{ return findList("retrievewarnings.retrieveWarnings", param, pageNo, pageSize); } }
转载请注明原文地址: https://ju.6miu.com/read-670340.html