Mybatis 系列(1)—— JSP + Spring + Mybatis+Mysql 框架搭建
小编也是忙里偷闲的学会java,用吃饭和睡觉前的时间看完了一个Mybatis的介绍,手痒痒的就练了练,学习的时间也不长,两天时间搭了一个框架,分享给大家。
MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。之前学过了Hibernate,最近抽空学习了一下Mybatis,在两者直接做了简单的对比。
1.从查询语句上的区别。
之前用Hibernate开发,都是用封装好的语句,完全没有sql的影子,都是调用的方法。但是如果是一些稍微复杂的sql,Mybatis会是一个好的选择。所以,从查询效率上来说,对于简单的查询,建议用Hibernate封装好的,这样 可以节省很多时间,如果你不建议会返回全部字段的话。。那么大一些的项目,或许会用到复杂的sql语句,Mybatis动手写还调整方便,看着也知道自己写的是个啥,不错的选择。
2.从对象管理机制角度考虑。
用Hibernate 是完整的对象/关系映射,它提供了对象状态管理,使开发者不再需要理会底层数据库系统的细节。这样就是面向对象的方法把数据持久化到数据库中,不用管数据库里面的字段之类的内容。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。
resultMap是MyBatis中最强大的元素,你可以比使用JDBC调用结果集省掉90%的代码。也可以让你做许多JDBC不支持的事。事实上,要写一个等同类似与交互的映射的复杂的语句。可能要上千行的代码。ResultMap的目的,就是这样简单的语句而不需要多余的结果映射。
3.缓存机制。
Hibernate中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载,属于多事务级别,要防止事务并发性。缓存是以map的形式进行存储的(key-id,value-object)。
在Mybatis中,一级缓存是基于 PerpetualCache(mybatis自带)的 HashMap 本地缓存,作用范围为session,所以当session commit或close后,缓存就会被清空。二级缓存默认也是基于 PerpetualCache,但是可以为其制定存储源。一级缓存缓存的是SQL语句,而二级缓存缓存的是结果对象。
Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。
1.建立一个web工程,引入需要的jar包,spring、mybatis和mysql
2.web.xml 配置vcD4KPHA+PGJyPgo8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">
MyBatis_Spring3_Jsp
index.jsp
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
3. mvc-dispatcher-servlet.xml 文件配置
/WEB-INF/pages/ .jsp
4. spring applicationContext.XML文件配置
5. 添加Mybatis的配置文件configuration.xml
5. 编写controller 类,model类 等
UserController类:
package com.yihaomen.controller; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.yihaomen.inter.IUserOperation; import com.yihaomen.model.Article; import com.yihaomen.model.User; @Controller @RequestMapping("/article") public class UserController { @Autowired IUserOperation userMapper; @RequestMapping("/list") public ModelAndView listall(HttpServletRequest request,HttpServletResponse response){ List articles=userMapper.getUserArticles(1); ModelAndView mav=new ModelAndView("list"); mav.addObject("articles",articles); return mav; } }
package com.yihaomen.inter; import java.util.List; import com.yihaomen.model.Article; import com.yihaomen.model.User; public interface IUserOperation { public User selectUserByID(int id); public List selectUsers(String userName); public void addUser(User user); public void updateUser(User user); public void deleteUser(int id); public List getUserArticles(int id); }
user.xml(sql写在这里)
select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article where user.id=article.userid and user.id=#{id}
model类:
package com.yihaomen.model; public class Article { private int id; private User user; private String title; private String content; public int getId() { return id; } public void setId(int id) { this.id = id; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
6. JSP
test ${item.id }--${item.title }--${item.content }
运行效果:
1)每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。用xml文件构建SqlSessionFactory实例是非常简单的事情。
2)看再多的书,还是动手去做吧,这样理解的深刻。总有一天会熟悉它,时间的问题。