1.什么是mybatismybatis 是支持普通 sql 查询,存储过程和高级映射的优秀持久层框架。mybatis 消除 了几乎所有的 jdbc 代码和参数的手工设置以及结果集的检索。mybatis 使用简单的 xml 或注解用于配置和原始映射,将接口和 java 的 pojos(plain old java objects,普通的 java 对象)映射成数据库中的记录。(类似hibernate)
2.从xml中构建 sqlsessionfactory每一个mybatis的应用程序都以一个sqlsessionfactory对象的实例为核心。sqlsessionfactory 对象的实例可以通过 sqlsessionfactorybuilder对象来 获 得 sqlsessionfactorybuilder 对象可以从 xml 配置文件,或从 configuration 类的实 例中构建 sqlsessionfactory 对象。
string resource = domain/configuration.xml; //配置文件的位置reader reader =resources.getresourceasreader(resource);sqlsessionfactory sf = new sqlsessionfactorybuilder().build(reader);
3. 从 sqlsessionfactory 中获取 sqlsessionsqlsession 对象完全包含以数据库为背景的所有执行 sql 操作的 方法。你可以用 sqlsession 实例来直接执行已映射的 sql 语句。
sqlsession session = sqlsessionfactory.opensession();try { blog blog = (blog)session.selectone(org.mybatis.example.blogmapper.selectblog, 101);}finally { session.close();}
4.mapper xml 文件4.1 select select * from person where id = #{id}
id是select的标识,与mapper.java中的函数名称一致完成映射。hashmap代表返回值resulttype是,其中key是指列名。#{id}是指参数,和mapper.java中参数同名。
参数也可以指定数据类型#{id,javatype=int,jdbctype=numeric}
类似于java完成以下代码:// similar jdbc code, not mybatis…
string selectperson = select * from person where id=?;preparedstatement ps = conn.preparestatement(selectperson);ps.setint(1,id);
4.2 insert, update, delete insert into author (username,password,email,bio) values (#{username},#{password},#{email},#{bio})
update,delete用法类似,还有parametertype属性等。
4.3 resultmap要记住类型别名是你的伙伴。使用它们你可以不用输入类的全路径。比如:
使用时:等同于:
eg: type属性是指实体类,一般要把
resultmap用来解决映射类的属性与数据库字段不一致的情况。
select * from t_address where id=#{id}
4.4 sql这个元素可以被用来定义可重用的 sql 代码段,可以包含在其他语句中。比如:
id,username,password
这个 sql 片段可以被包含在其他语句中,例如:
select from some_table where id = #{id}
用include元素来引用,refid属性的值必须是某个sql元素的id.
5.动态sql5.1 if在动态 sql 中所做的最通用的事情是包含部分 where 字句的条件。比如:
select * from blog where state = ‘active’ and title like #{title} and author_name like #{author.name}
理解时注意:其中的参数title、author都是从函数中传过来的值。不属于数据库中字段值。所以需要test判断是否为空。
5.2 choose when otherwise相当于java语言中的switch……case语句,只需要满足一个条件:
select * from blog where state = ‘active’ and title like #{title} and author_name like #{author.name} and featured = 1
如果title、author二者都没提供,只返回 featured blogs(也许是由管理员策略地选 择的结果列表,而不是返回大量没有意义的随机博客结果列表)。
5.3 trim where set为了变面下面代码这种情况,定义了where,set
select * from blog where state = #{state} and title like #{title} and author_name like #{author.name}
上面那代码会因为其中某些条件不满足导致下面的sql代码的出现:
select * from blog whereselect * from blog where and title like ‘sometitle’
导致查询失败,为了避免这种情况,大多使用where元素:
select * from blog state = #{state} and title like #{title} and author_name like #{author.name}
where碰到and开头会自动过滤掉and.动态更新语句相似的解决方案是 set。set 元素可以被用于动态包含更新的列,而不包含不需更新的,可以自动过滤掉句末的符号。
update author username=#{username}, password=#{password}, email=#{email}, bio=#{bio} where id=#{id}
不管是where元素和set元素遇到的问题都可以用trim来解决:
... ... prefixoverriders、suffixoverriders分别表示前后缀的过滤
5.4 foreach迭代用法,一般用在in条件中。
select * from post p where id in #{item}//会组合成(1,2,3.....)
foreach 元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可 以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素 是很智能的,它不会偶然地附加多余的分隔符。
关于collection:参考http://my.oschina.net/linuxred/blog/38802
list、array都是list、array
如果是复杂类型,map {, };那么collection指向想要的值的key,此列中collection=”id”
