我的工程里面配置有mybatis hibernate为什么有时会无缘故不识别

mybatis3入门学习笔记 - 上善若水任方圆 - ITeye技术网站
博客分类:
MyBatis 的前身就是iBatis,是一个数据持久层(ORM)框架。
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis对JDBC进行了一次很浅的封装。
以前也学过iBatis,因为MyBatis是iBatis的升级版本,最初以为改动应该不大,实际结果是MyBatis对配置文件进行了一些大的改动,使整个框架更加方便人性化。
如果需要学习MyBatis,建议大家去MyBatis Google Code下载最新的API:/p/mybatis/
注意api是有中文的,我想这对广大中国同行们是一个很不错的消息。
configuration配置文件
与hibernate一样,MyBatis也需要一个核心配置文件来指定数据源、连接池和ORM映射文件等等基础数据。下面是一个简单的配置:
&?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"&
&!-- 注意:每个标签必须按顺序写,不然蛋疼的DTD会提示错误:The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,mappers?)". --&
&configuration&
&!-- 属性配置 --&
&properties resource="com/mybatisdemo/config/mysql-jdbc-connection.properties"&
&!-- 相同属性:最高优先级的属性是那些作为方法参数的,然后是资源/url 属性,最后是 properties元素中指定的属性 --&
&property name="username" value="root"/&
&property name="password" value="sa"/&
&/properties&
&!-- 设置缓存和延迟加载等等重要的运行时的行为方式 --&
&settings&
&!-- 设置超时时间,它决定驱动等待一个数据库响应的时间
&setting name="defaultStatementTimeout" value="25000"/&
&/settings&
&!-- 别名 --&
&typeAliases&
&typeAlias alias="UserInfo" type="com.mybatisdemo.entity.UserInfo"/&
&/typeAliases&
&environments default="development"&
&!-- environment 元素体中包含对事务管理和连接池的环境配置 --&
&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&
&!-- ORM映射文件 --&
&mapper resource="com/mybatisdemo/entity/config/UserInfoSqlMap.xml" /&
&/mappers&
&/configuration&
①xml中的标签顺序不能随便调换,否则会提示错误
②MyBatis使用自带的数据库连接池,不直接支持第三方连接池,不过网上有创建第三方连接池的方法
③以前别名(&typeAliases&)可以在sqlMap标签中创建,但现在需要在configuration标签中创建
④该配置文件可随意取名,在读取配置文件时指定该XML文件路径即可:
//读取核心配置文件
Reader reader = Resources.getResourceAsReader("com/mybatisdemo/config/Configuration.xml");
//创建SessionFactory实例
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SQL 映射的 XML 文件
此文件类似于iBatis的&sqlMap&文件,但现在使用的标签为&mapper&。官方是这样形容mapper文件作用的:当然如果你将它们和对等功能的 JDBC 代码来比较,你会发现映射文件节省了大约 95%的代码量。个人认为mapper文件的主要作用就是把SQL统一存放,方便开发人员复用和维护。下面是一段简单的配置:
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"&
&!-- namespace用于java代码调用时识别指定xml的mapper文件 --&
&mapper namespace="com.mybatisdemo.entity.UserInfo"&
&!-- 配置ORM映射 --&
&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代码段 --&
&sql id="demo_sql"&
code,name,sex,phone,money
&insert id="inser_userInfo" parameterType="UserInfo"&
&!-- include 引用可重用的SQL代码段 --&
INSERT INTO USERINFO(&include refid="demo_sql"/&) VALUES(#{code},#{name},#{sex},#{phone},#{money})
&update id="update_userInfo" parameterType="UserInfo"&
UPDATE USERINFO SET code=#{code} ,name=#{name} ,sex=#{sex} ,phone=#{phone} ,money=#{money} WHERE id=#{id}
&select id="selectAll_userInfo" useCache="false" flushCache="true" resultMap="user_orm"&
SELECT * FROM USERINFO
&select id="selectById_userInfo" parameterType="int" resultType="UserInfo"&
SELECT * FROM USERINFO WHERE id= #{id}
①resultType表示查询结果放到什么对象中,上面resultType="UserInfo"使用的是com.mybatisdemo.entity.UserInfo的别名,别名是在前面核心配置文件中设置的。
②还是resultType,用户会好奇:MyBatis怎么把每个值放到UserInfo这个javabean中,实际上在查询出数据后,MyBaits会去UserInfo中查找每个属性,如果属性与表中列名对应,则会把该列的数据赋给该属性。
③如果javabean与数据库表字段不对应,可以创建resultMap来实现ORM映射
MyBatis API
前面XML文件已经实现了数据库连接配置和SQL配置,现在就需要用java代码去调用xml配置文件的sql即可实现数据库查询。
与hibernate类似,MyBatis也有两个核心对象:SqlSessionFactory和SqlSession。SqlSessionFactory顾名思义就是获取SqlSession对象的工厂,功能类似于jdbc中加载数据库驱动、创建connection连接,所以SqlSessionFactory资源非常重要,推荐该对象保持静态,一直存在,尽量不去销毁。而SqlSession其实就类似于jdbc的connection对象,SqlSession对象就能执行数据库的增删改查操作,大家知道每个数据库连接都是非常珍贵的,所以在使用后尽量及时关闭。
为了方便获取SqlSession对象,我写了一个Util类:
package com.mybatisdemo.
import java.io.IOE
import java.io.R
import org.apache.ibatis.io.R
import org.apache.ibatis.session.SqlS
import org.apache.ibatis.session.SqlSessionF
import org.apache.ibatis.session.SqlSessionFactoryB
public class SessionFactoryUtil {
private static final String RESOURCE = "com/mybatisdemo/config/Configuration.xml";
private static SqlSessionFactory sqlSessionFactory =
private static ThreadLocal&SqlSession& threadLocal = new ThreadLocal&SqlSession&();
Reader reader =
reader = Resources.getResourceAsReader(RESOURCE);
} catch (IOException e) {
throw new RuntimeException("Get resource error:"+RESOURCE, e);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
* Function
: 获得SqlSessionFactory
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionF
* Function
: 重新创建SqlSessionFactory
public static void rebuildSqlSessionFactory(){
Reader reader =
reader = Resources.getResourceAsReader(RESOURCE);
} catch (IOException e) {
throw new RuntimeException("Get resource error:"+RESOURCE, e);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
* Function
: 获取sqlSession
: SqlSession
public static SqlSession getSession(){
SqlSession session = threadLocal.get();
if(session==null){
if(sqlSessionFactory == null){
rebuildSqlSessionFactory();
//如果sqlSessionFactory不为空则获取sqlSession,否则返回null
session = (sqlSessionFactory!=null) ? sqlSessionFactory.openSession():
* Function
: 关闭sqlSession
public static void closeSession(){
SqlSession session = threadLocal.get();
threadLocal.set(null);
if(session!=null){
session.close();
那么所有准备就绪以后,我们来看我们的重头戏,调用sql:
package com.mybatisdemo.
import java.util.L
import org.apache.ibatis.session.RowB
import org.apache.ibatis.session.SqlS
import com.mybatisdemo.entity.UserI
public class UserInfoDao {
@SuppressWarnings("unchecked")
public List&UserInfo& findAll(){
SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
List&UserInfo& lstUser =
lstUser = session.selectList("com.mybatisdemo.entity.UserInfo.selectAll_userInfo");
session.close();
return lstU
@SuppressWarnings("unchecked")
public List&UserInfo& findList(int pageNo,int pageSize){
SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
List&UserInfo& lstUser =
lstUser = session.selectList("com.mybatisdemo.entity.UserInfo.selectAll_userInfo", null, new RowBounds((pageNo-1)*pageSize, pageSize));
session.close();
return lstU
public UserInfo findById(int id){
SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
UserInfo user =
(UserInfo) session.selectOne("selectById_userInfo", id);
session.close();
public void insert(UserInfo user){
SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
session.insert("com.mybatisdemo.entity.UserInfo.inser_userInfo", user);
session.close();
public void update(UserInfo user){
SqlSession session = SessionFactoryUtil.getSqlSessionFactory().openSession();
session.update("com.mybatisdemo.entity.UserInfo.update_userInfo", user);
session.close();
public static void main(String[] args) {
List&UserInfo& lst = new UserInfoDao().findList(3,2);
for (UserInfo userInfo : lst) {
System.out.println(userInfo.getId()+" "+userInfo.getName());
如果没有学过MyBatis的同学可能会疑问:selectList中传入的参数是什么东西?平常大家都传入的sql语句,这个xx.xx完全看不懂的样子。其实这个"com.mybatisdemo.entity.UserInfo.selectAll_userInfo"就是从前面mapper配置文件中去找对应的sql语句,"com.mybatisdemo.entity.UserInfo"表示配置文件的namespace,"selectAll_userInfo"表示配置文件具体的select标签,update和insert类似。
这里只是简单介绍一下MyBatis,我也是初步学习,随后会研究与spring整合以及复杂sql的处理。
最后附上demo源码,希望对大家有所帮助。
下载次数: 385
if(session==null){& &&&&&&&&&&& if(sqlSessionFactory == null){& &&&&&&&&&&&&&&& getSqlSessionFactory();& &&&&&&&&&&& }& 如果sqlSessionFactory 为null,应该调用rebuild方法吧?应该是这样的
sqlSession的 工厂方法中 getSession方法的if判断是不是应该为 session==null嗯,看样子应该错了
浏览: 1910449 次
来自: 成都
好像有道理!!
super.printJsMsg(response, sb.t ...
受教了!分享一个Dubbo分布式架构项目实战参考内容:http ...
请问楼主,我现在运行的项目没用到hadoop,但目前查询数据非 ...
虽然没用hibernate测试,但是用mysql测试超期比例并 ...温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
抓住机遇,为兔兔爬藤努力赚钱
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
先将如何使用TOMCAT7使用JNDI Database Resource记录如下:1,修改Server.xml在&GlobalNamingResources&下添加:&Resource name="jdbc/name" auth="Container"& & & & & & & type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"& & & & & & & url="jdbc:oracle:thin:@//localHost:1521/dbId"& & & & & & & username="userName" password="password" maxActive="10" maxIdle="5"& & & & & & & maxWait="-1"/&2,copy ORACLE的驱动jar到tomcat的lib目录下3,修改tomcat的context.xml,添加:&Resource name="jdbc/name" auth="Container"& & & & & & & type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"& & & & & & & url="jdbc:oracle:thin:@//localHost:1521/dbId"& & & & & & & username="userName" password="password" maxActive="10" maxIdle="5"& & & & & & & maxWait="-1"/&4,修改工程的Web.xml &resource-ref&
&description&Oracle Datasource example&/description&
&res-ref-name&jdbc/name&&/res-ref-name&
&res-type&javax.sql.DataSource&/res-type&
&res-auth&Container&/res-auth& &/resource-ref&注意:上面标记红色的字段想,需要保持一致。5,修改工程的Web.xml, 添加:&resource-ref&
&description&Oracle Datasource example&/description&
&res-ref-name&jdbc/eyedoracle&/res-ref-name&
&res-type&javax.sql.DataSource&/res-type&
&res-auth&Container&/res-auth& &/resource-ref&at end of &/web-app&6,修改Mybatis 配置文件,修改:&environments default="development"&
&environment id="development"&
&transactionManager type="JDBC" /&
&dataSource type="JNDI"&
&property name="initial_context" value="java:comp/env" /&
&property name="data_source" value="jdbc/name" /&
&/dataSource&
&/environment& &/environments&然后启动你的tomcat,一切OK。(已经通过MyBatis3,MyEclipase9+, Tomcat7测试)
阅读(2907)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_095075',
blogTitle:'MyBatis 如何使用JNDI Database Resource——我在美国做程序员的日子(十)',
blogAbstract:'最近,公司的“大牛”建议在项目中使用MyBatis。就如何使用DB Pool大家倾向于采用容器的pool 管理。客户的标准架构是clustered Apache+JBoss. 在开发过程中采用tomcat。先将如何使用TOMCAT7使用JNDI Database Resource记录如下:1,修改Server.xml在&GlobalNamingResources&下添加:&Resource name=\"jdbc/',
blogTag:'mybatis,jndi,tomcat,java,j2ee',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:1,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'抓住机遇,为兔兔爬藤努力赚钱',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}mybatis拦截器分页问题。我在SSM工程中使用mybatis拦截器做分页,但是拦截器的intercept有时候执行有时候不执行,不知道为什么 - ITeye问答
我在SSM工程中使用mybatis拦截器做分页,但是拦截器的intercept有时候执行有时候不执行,不知道为什么,程序员没有没有经验呢?谢谢赐教
代码:
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class })})
public class PageInterceptor implements Interceptor {
private static String sqlId = "";
private static String dialect = "";
public Object intercept(Invocation inv) throws Throwable {
System.out.println("到了");
RoutingStatementHandler handler = (RoutingStatementHandler) inv.getTarget();
StatementHandler delegate = (StatementHandler)ReflectionUtils.getFieldValue(handler, "delegate");
MappedStatement mappedStatement = (MappedStatement) ReflectionUtils.getFieldValue(delegate, "mappedStatement");
if(mappedStatement.getId().matches(sqlId)) { //只拦截id包含pages的SQL
BoundSql bound = delegate.getBoundSql();
//获得当前绑定Sql的参数对象
Object object = bound.getParameterObject();
if(object == null) {
return inv.proceed();
if(object instanceof PageEntity&?&) {
PageEntity&?& page = (PageEntity&?&)
String sql = bound.getSql();
String pageSql = getPageSql(sql, page);
ReflectionUtils.setFieldValue(bound, "sql", pageSql);
return inv.proceed();
public String getPageSql(String sql, PageEntity&?& page) {
//此处省略SQL拼接代码
return pageSql.toString();
public Object plugin(Object arg0) {
return Plugin.wrap(arg0, this);
public void setProperties(Properties property) {
sqlId = property.getProperty("sqlId"); //".*Pages*.*"
dialect = property.getProperty("dialect"); //"oracle"
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd"&
&configuration&
&settings&
&setting name="cacheEnabled" value="true" /&
&setting name="lazyLoadingEnabled" value="true" /&
&setting name="multipleResultSetsEnabled" value="true" /&
&setting name="useColumnLabel" value="true" /&
&setting name="useGeneratedKeys" value="false" /&
&setting name="defaultExecutorType" value="SIMPLE" /&
&/settings&
&& &typeAliases&
&&&&&&& &typeAlias type="com.cifpay.user.entity.UserEntity" alias="user" /&
&&&&&&& &typeAlias type="com.cifpay.role.entity.RoleEntity" alias="role" /&
&&&&&&& &typeAlias type="com.cifpay.menu.entity.MenuEntity" alias="menu" /&
&&&&&&& &typeAlias type="com.cifpay.role.entity.RoleMenuMapEntity" alias="roleMenuMap" /&
&&&&&&& &typeAlias type="com.cifpay.role.entity.UserRoleMapEntity" alias="userRoleMap" /&
&& &/typeAliases&
&plugin interceptor="com.cifpay.base.interceptor.PageInterceptor"&
&property name="sqlId" value=".*Pages*.*"/&
&property name="dialect" value="oracle"/&
&/plugins&
&&& &mappers&
&&&&&&& &mapper resource="com/cifpay/user/entity/User.sqlMap.xml" /&
&&&&&&& &mapper resource="com/cifpay/role/entity/Role.sqlMap.xml" /&
&&&&&&& &mapper resource="com/cifpay/menu/entity/Menu.sqlMap.xml"/&
&&&&&&& &mapper resource="com/cifpay/role/entity/RoleMenuMap.sqlMap.xml"/&
&&&&&&& &mapper resource="com/cifpay/role/entity/UserRoleMap.sqlMap.xml"/&
&&&& &/mappers&
&/configuration&
它所有的操作都是来源于MapperProxy的代理,它把拦截器放入拦截,它有一个
final MapperMethod mapperMethod = cachedMapperMethod(method);
我怀疑cacheMethod导致的,不过我自己重来未碰到过
是不是拦截器配置的问题
我实现分页 是在mybatis dao的xml里拼分页sql的,
已解决问题
未解决问题22:13 提问
为什么我的mybatis一对多查询会只取最后一个值 我是新手
Sys_userMapper.xml
&!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
SELECT * FROM sys_right,(
SELECT *FROM sys_role_right,
FROM sys_user,sys_role
WHERE sys_user.user_name=#{user_name}
AND sys_user.user_password=#{user_password}
AND sys_user.user_role_id=sys_role.role_id
WHERE a.role_id=sys_role_right.rf_role_id)b
WHERE b.rf_right_code=sys_right.right_code
&resultMap type="Sys_user" id="resultSys_userMap"&
&id property="user_id" column="user_id" /&
&result property="user_name" column="user_name" /&
&result property="user_password" column="user_password" /&
&result property="user_role_id" column="user_role_id" /&
&result property="user_flag" column="user_flag" /&
&association
property="sys_right" javaType="Sys_right"&
&id property="right_code" column="right_code" /&
&result property="right_parent_code" column="right_parent_code" /&
&result property="right_type" column="right_type" /&
&result property="right_text" column="right_text" /&
&result property="right_url" column="right_url" /&
&result property="right_tip" column="right_tip" /&
&/association
&association
property="sys_role_right" javaType="Sys_role_right"&
&id property="rf_id" column="rf_id" /&
&result property="rf_role_id" column="rf_role_id" /&
&result property="rf_right_code" column="rf_right_code" /&
&/association
&association
property="sys_role" javaType="Sys_role"&
&id property="role_id" column="role_id" /&
&result property="role_name" column="role_name" /&
&result property="role_desc" column="role_desc" /&
&result property="role_flag" column="role_flag" /&
&/association
&/resultMap&
mybatisConfig.xml
&?xml version="1.0" encoding="UTF-8" ?&
&!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
按赞数排序

我要回帖

更多关于 mybatis hibernate 的文章

 

随机推荐