最近学习了一下mybatis结合网上的一些列子搭建的一个网站的框架,前端显示用的velocity引擎,数据访问使用mybatis+oracle,视图访问控制spring mvc,框架主要包括一些基本的增删改操作以及拦截器,废话不多说了直接开始吧!! 代码下载地址最下面
整体项目预览
项目运行效果图
1.首先架包
2.实体类就是一个普通的 java bean 也没多少字段,本身只为了框架搭建
3.application配置
<!-- 扫描各个包 -->
<context:component-scan base-package="com.*">
<!-- 不扫描带有@Controller注解的类 -->
<context:exclude-filter type="annotation"
expression="com.mybatis.controller.LoginAction" />
</context:component-scan>
<!-- 配置DataSource数据源 -->
<!-- 引入配置文件 -->
<context:property-placeholder location="classpath:config.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 创建mybatis sqlsessionFactory工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis.xml" />
<!-- mapper和resultmap配置路径 -->
<property name="mapperLocations">
<list>
<!-- 表示在com.resultmap包或以下所有目录中,以-resultmap.xml结尾所有文件 -->
<!-- <value>classpath:com/mybatis/mapper/*-mapper.xml</value> -->
<value>classpath:com/mybatis/mapper/*-mapper.xml</value>
<!-- 自定义 -->
<!-- <value>classpath:com/mybatis/mapper/book-mapper.xml</value> -->
<!-- <value>classpath:com/mybatis/mapper/student-mapper.xml</value> -->
</list>
</property>
</bean>
<!-- 通过扫描的模式,扫描目录在com/mapper目录下,所有的mapper都继承SqlMapper接口的接口, 这样一个bean就可以了 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mybatis.mapper" />
<property name="markerInterface" value="com.mybatis.mapper.SqlMapper" />
</bean>
<!-- 不定义通用的话每个类就要写下面的配置了 -->
<!-- <bean id="bookMaper" class="org.mybatis.spring.mapper.MapperFactoryBean"> -->
<!-- <property name="mapperInterface" value="com.mybatis.mapper.BookMapper"></property> -->
<!-- <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> -->
<!-- </bean> -->
<!-- velocity表达式需要的配置 -->
<bean id="velocityConfigurer"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<!--声明模板文件所在的路径 (实际资源文件所在的文件夹) -->
<property name="resourceLoaderPath" value="WEB-INF/template/"></property>
<!--设置输入输出的编码方式 -->
<property name="velocityProperties">
<props>
<prop key="input.encoding">utf-8</prop>
<prop key="output.encoding">utf-8</prop>
</props>
</property>
</bean>
<!-- spring 管理下velocity配置 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="" />
<!-- 声明velocity表达式支持的后缀 -->
<property name="suffix" value=".html"></property>
<!-- 如果你需要使用Spring 对 Velocity宏命令的支持, 将这个属性设为true -->
<property name="exposeSpringMacroHelpers" value="true" />
<property name="contentType" value="text/html;charset=utf-8" />
<!-- velocity时间格式化工具 -->
<property name="dateToolAttribute" value="date"></property>
<!-- 是否开放session -->
<property name="exposeSessionAttributes" value="true"></property>
<!-- 是否开放request -->
<property name="exposeRequestAttributes" value="true"></property>
<!-- request引用的名称 -->
<property name="requestContextAttribute" value="rc"></property>
</bean>
<!-- 启用支持Annotation注解方式的事务管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 自定义拦截链配置 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/front/**" />
<!-- <mvc:mapping path="/front/bgIndex/**"/> -->
<bean class="com.common.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
</beans>
mybatis 配置就相对东西少很多了
<configuration>
<!-- 别名 -->
<settings>
<!-- 全局映射器启用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 查询时,关闭关联对象即时加载以提高性能 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" />
<!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 允许使用列标签代替列名 -->
<setting name="useColumnLabel" value="true" />
<!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖
允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false-->
<setting name="useGeneratedKeys" value="false" />
<!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
<setting name="autoMappingBehavior" value="FULL" />
<!-- 对于批量更新操作缓存SQL以提高性能 -->
<setting name="defaultExecutorType" value="BATCH" />
<!-- 数据库超过25000秒仍未响应则超时 -->
<setting name="defaultStatementTimeout" value="25000" />
</settings>
<!-- 全局别名设置,在映射文件中只需写别名,而不必写出整个类路径 -->
<typeAliases>
<typeAlias type="com.mybatis.bean.Student" alias="student" />
<typeAlias type="com.mybatis.bean.Book" alias="book" />
</typeAliases>
config.properties 配置
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url = jdbc:oracle:thin:@localhost:1521:ORCL
jdbc.username =SCOTT
jdbc.password =oracle
Studentdao 层 注意SqlMapper只是一个空接口而已
package com.mybatis.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;
import com.mybatis.bean.Student;
public interface StudentMapper extends SqlMapper {
// @SelectProvider(type = TestSqlProvider.class, method = "getSql") : 提供查询的SQL语句,如果你不用这个注解,
// 你也可以直接使用@Select("select * from ....")注解,把查询SQL抽取到一个类里面,方便管理,同时复杂的SQL也容易操作,
// type = TestSqlProvider.class就是存放SQL语句的类,而method = "getSql"表示get接口方法需要到TestSqlProvider类的getSql方法中获取SQL语句。
// @ResultMap(value="com.mapper.StudentMapper.student")
// @Select("SELECT stu.student_id,stu.student_name,stu.student_phone,stu.student_class_id FROM student stu")
// public List<Student> getStudentList();
/**
* 不使用注解则需在对应的xml文件中编写sql语句 注意id与这里的方法对应
* @return
*/
public List<Student> getAllStudent();
public void addStudent(Student stu);
@ResultMap(value="com.mybatis.mapper.StudentMapper.studentMap")
@Select("select * from student where student_Id = #{studentId}")
public Student findStudentById(@Param("studentId") Integer studentId);
}
bookdao 层 注意SqlMapper只是一个空接口而已
package com.mybatis.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;
import com.mybatis.bean.Book;
public interface BookMapper extends SqlMapper {
/**
* 通过注解方式直接写代码不需要在book-mapper.xml中配置
* ResultMap对应book-mapper.xml中的(com.mybatis.mapper.BookMapper)为namespace的值 bookResultMap为mybatis文件中类的别名
*/
@ResultMap(value="com.mybatis.mapper.BookMapper.bookResultMap")
@Select("SELECT * FROM book WHERE book_id = #{bookId}")
public Book findBookById(@Param("bookId") Integer bookId);
// @ResultMap(value="com.mybatis.mapper.BookMapper.bookResultMap")
// @Select("SELECT stu.student_id,stu.student_name,stu.student_phone,stu.student_class_id FROM student stu")
// public List<Student> getStudentList();
public List<Book> getAllBook();
}
StudentMapper xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace和定义的Mapper接口对应,并实现其中的方法 -->
<mapper namespace="com.mybatis.mapper.StudentMapper">
<resultMap type="student" id="studentMap">
<id property="studentId" column="student_id" />
<result property="studentName" column="student_name" />
<result property="studentPhone" column="student_phone" />
<result property="studentClassId" column="student_class_id" />
</resultMap>
<!-- id和mapper接口中的方法名对应,parameterType使用mybatis.xml中的别名 -->
<select id="getAllStudent" parameterType="student" resultMap="studentMap" >
<![CDATA[
SELECT * FROM student
]]>
</select>
<!--BOOK_SEQUENCE.nextval 为oracle序列 -->
<insert id="addStudent" parameterType="student" >
insert into student(student_id, student_name, student_phone,
student_class_id)
values(BOOK_SEQUENCE.nextval, #{studentName}, #{studentPhone}, #{studentClassId})
</insert>
</mapper>
book xml配置 这里用纯注解所有没有相关的sql语句也可以添加,灵活开发半注解半sql语句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace和定义的Mapper接口对应,并实现其中的方法 ,如果使用@注解方式则不用与接口名全限定名相对应-->
<mapper namespace="com.mybatis.mapper.BookMapper" >
<resultMap type="book" id="bookResultMap" >
<id property="bookId" column="book_id"/>
<result property="bookName" column="book_name"/>
<result property="bookAuthor" column="book_author"/>
<result property="bookPrice" column="book_price"/>
</resultMap>
</mapper>
biz 只是接口
package com.mybatis.biz;
import java.util.List;
import com.mybatis.bean.Book;
import com.mybatis.bean.Student;
public interface CommBiz {
public Student findStudentById(Integer id);
public List<Student> findStudentAll();
public Book findBookById(Integer bookId);
public void saveStudent(Student stu);
public List<Student> getAllStudent();
}
biz 实现
package com.mybatis.biz;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.mybatis.bean.Book;
import com.mybatis.bean.Student;
import com.mybatis.mapper.BookMapper;
import com.mybatis.mapper.StudentMapper;
@Transactional
@Service
public class CommBizImpl implements CommBiz {
@Autowired
private StudentMapper studentMapper;
@Autowired
private BookMapper bookMapper;
@Override
public Student findStudentById(Integer id) {
// TODO Auto-generated method stub
return studentMapper.findStudentById(id);
}
@Override
public Book findBookById(Integer bookId) {
// TODO Auto-generated method stub
return bookMapper.findBookById(bookId);
}
@Override
public List<Student> findStudentAll() {
// TODO Auto-generated method stub
return studentMapper.getAllStudent();
}
public StudentMapper getStudentMapper() {
return studentMapper;
}
public void setStudentMapper(StudentMapper studentMapper) {
this.studentMapper = studentMapper;
}
@Override
public void saveStudent(Student stu) {
// TODO Auto-generated method stub
studentMapper.addStudent(stu);
}
@Override
public List<Student> getAllStudent() {
// TODO Auto-generated method stub
return studentMapper.getAllStudent();
}
}
控制层
package com.mybatis.controller;
import java.util.List;
import javax.servlet.http.HttpSession;
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.mybatis.bean.Student;
import com.mybatis.biz.CommBiz;
@RequestMapping("front/")
@Controller
public class LoginAction {
@Autowired
private CommBiz commBiz;
@RequestMapping("/login.htm")
public ModelAndView loginUI(){
ModelAndView mv=new ModelAndView();
mv.addObject("test","test");
// String msg= (String) session.getAttribute("msg");
// if(msg!=null)
// mv.addObject("msg",msg);
mv.setViewName("front/login");
return mv;
}
@RequestMapping("/isLogin")
public ModelAndView isLogin(String name,String password,HttpSession session){
ModelAndView mv=new ModelAndView();
if(name.equals("zengjie")&&password.equals("123456")){
// mv.addObject("name",name);
session.setAttribute("name",name);
mv.setViewName("redirect:main.htm");
}else{
mv.addObject("msg","登陆失败请重新登陆");
mv.setViewName("redirect:login.htm");
}
return mv;
}
@RequestMapping("/main.htm")
public ModelAndView mainUI(){
ModelAndView mv=new ModelAndView();
List<Student> stuList=commBiz.findStudentAll();
mv.addObject("stuList",stuList);
mv.setViewName("front/main");
return mv;
}
}
页面
<!DOCTYPE html>
<html>
<head>
<title>main.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="$!webPath/background/css/bootstrap.css" />
<link rel="stylesheet" type="text/css" href="$!webPath/background/css/bootstrap-responsive.css" />
<script type="text/javascript" src="$!webPath/background/js/jPages/js/jquery-1.8.2.min.js"></script>
<!-- 日期控件-->
<script language="javascript" type="text/javascript" src="$!webPath/background/js/WdatePicker.js"></script>
<!-- jpage分页 -->
<link rel="stylesheet" href="$!webPath/background/js/jPages/css/jPages.css" type="text/css"></link>
<link rel="stylesheet" href="$!webPath/background/js/jPages/css/animate.css" type="text/css"></link>
<script type="text/javascript" src="$!webPath/background/js/jPages/js/jPages.min.js"></script>
<script type="text/javascript">
$(function() {
$("div.holder").jPages({
containerID : "itemContainer",
previous : "上一页",
next : "下一页",
perPage : 4
});
});
</script>
</head>
<style>
/*table.gridtable {
font-family: verdana,arial,sans-serif;
font-size:14px;
color:#333333;
border-width: 1px;
border-color: #666666;
border-collapse: collapse;
}
table.gridtable th {
border-width: 1px;
padding: 8px;
border-style: solid;
border-color: #666666;
background-color: #dedede;
}
table.gridtable td {
border-width: 1px;
padding: 8px;
border-style: solid;
border-color: #666666;
background-color: #ffffff;
}*/
</style>
<body>
<br>
<div align="center">
<p>学生人员名单 登陆成功欢迎你 <span style="color: red;">$!name</span></p>
<table class="gridtable table table-bordered table-hover definewidth m10" style="width: 500px;height: 500px">
<thead>
<tr>
<th>id</th>
<th>姓名</th>
<th>电话</th>
<th>班级id</th>
<th>操作</th>
</tr>
</thead>
<tbody id="itemContainer">
#foreach($stu in $stuList)
<tr>
<td>$!stu.studentId</td>
<td>$!stu.studentName</td>
<td>$!stu.studentPhone</td>
<td>$!stu.studentClassId</td>
<td><a href="javascript:deleteNews($!articleList.newsId)"
class="btn btn-primary">CRUD</a> </td>
</tr>
#end
</tbody>
</table>
<div align="center" class="holder" style="font-size: 20px"></div>
</div>
</body>
</html>
还有mvc的拦截器
package com.common.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor {
// afterCompletion()方法在DispatcherServlet完全处理完请求后被调用
// 这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object obj, Exception err)
throws Exception {
request.removeAttribute("status");
}
// postHandle()方法在业务处理器处理请求之后被调用
// 这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回请求前被调用,在该方法中对用户请求request进行处理。
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object obj, ModelAndView mav) throws Exception {
String status=(String) request.getAttribute("status");
String path=mav.getViewName();
System.out.println(path);
if(path.contains("login")){
System.out.println("是登陆请求");
}else{
if(status.equals("false")){
request.getSession().setAttribute("msg", "没有登录");
response.sendRedirect("login.htm");
}
}
}
// preHandle()方法在业务处理器处理请求之前被调用
// 这个方法在业务处理器处理请求之前被调用,
// 在该方法中对用户请求request进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,
// 或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object obj) throws Exception {
String str = (String) request.getSession().getAttribute("name");
if(str!=null){
request.setAttribute("status","true");
} else{
request.setAttribute("status","false");
}
return true;
}
}
项目案例下载地址:mybatis
mybatis注解详解:mybatis注解详解
建议参考 Velocity语法大全
另外还有我的一个项目基于最新的三大框架SSH2.2.3.16+4.0.2+4.3.4 要的留言直接打包给你