mybatis交给spring管理
-
和 p:basePackage=”cn.tedu.dao”一样
- 读取总清单和子清单,生成sqlSessionFactoryBean对象
- 通过sqlSessionFactoryBean生成mapper代理对象
<!-- 实例化MyBatis的SqlSessionFactoryBean对象-->
<!--mybatis配置,读取配置文件(扫描配置文件)-->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="alibabaDataSource"
p:configLocation="classpath:conf/configuration.xml"
p:mapperLocations="classpath:mapper/*.xml">
</bean>
<!-- 扫描所有XXXMapper的对象 用于生成mapper的代理对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="cn.tedu.dao"
p:sqlSessionFactoryBeanName="sqlSessionFactory">
</bean>
注意:
spring没有整合mybatis,mybatis自己写一个框架用于跟spring整合
mybatis-spring.jar,即:mybatis的几个重要的对象交给spring创建和管理,比如sqlSession,mapper接口的代理对象等
mybatis的几个重要的配置(总清单文件和子清单文件)都要交给spring加载和管理
搭建ssm项目
- 配置文件
- 项目入口web.xml
- spring.xml 配置spring容器
- spring_mvc.xml 配置springmvc容器
- spring_mybatis.xml 配置mybatis
个人总结
在spring配置中要有如下配置
- 源数据对象dataSource,用阿里巴巴的druid,url,驱动jar,用户名密码
- sqlSession,注入dataSource,加载mybatis配置文件,加载mapper映射文件
- 扫描sqlSession实现的接口类
mybatis缓存机制
一级缓存:SqlSession级别的缓存
@Test
public void testFindUserById(){
SqlSession sqlSession=null;
try{
sqlSession=sqlSessionFactory.openSession();
//发sql语句数据库查询,结果存储给sqlSession对象
User user=sqlSession.selectOne("com.xxx.yyy.findUserById",20);
System.out.println(user);
//先sqlSession对象map集合是否有缓存,如果有就直接从缓存取,如果没有就走数据库
User user1=sqlSession.selectOne("com.xxx.yyy.findUserById",20);
System.out.println(user1);
//sqlSession.commit();
}catch(Exception e){
//sqlSession.rollback();
e.printStackTrace();
}finally{
sqlSession.close();
}
}
二级缓存:SqlSessionFactory级别的缓存,mybatis自带有一个缓存实现 需要依赖一个第三方的缓存产品,要求实体必须序列化,mybatis二级缓存默认是开着的,是否能有二级缓存还需要在清单文件中添加cache标签 注意: mybatis查询数据库的时候,首先从二级缓存中寻找是否有缓存,如果有就取出,如果没有,就寻找一级缓存,如果一级缓存有,就取出,如果一级缓存没有就发sql语句查询数据库
项目实践(表单)
jsp层
<form action="user/login.do" method="post">
做了一个登陆界面,用表单提交的方式发送给user/login.do
经过拦截器dispatcher *.do的拦截,进入spring管理的map集合中找到这个controller
controller层
@Controller
@RequestMapping("user/")
public class UserController {
@Resource(name="userService")
private UserService userService;
@RequestMapping(value="login",method=RequestMethod.GET)
@ResponseBody
public Result login(User user,
Model model,
HttpSession session){
Result result=null;
result=this.userService.login(user,session);
return result;
}
controller调用了业务层
业务层
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource(name="userMapper")
private UserMapper userMapper;
@Override
public Result login(User user, HttpSession session) {
Result result=new Result();
int id=this.userMapper.login(user);
if(id>0){
session.setAttribute("userName", user.getName());
result.setStatus(1);
result.setMessage("登录成功!");
}else{
result.setStatus(0);
result.setMessage("登录失败!");
}
return result;
}
业务层调用了数据库dao层,数据库是由mybatis管理的,mybatis是由spring容器管理的,userMapper是sqlsession的代理对象,由mybatis_spring.xml生成
数据库
<mapper namespace="cn.tedu.dao.UserMapper">
<select id="login"
parameterType="User"
resultType="java.lang.Integer">
select
id
from t_user
where username=#{name} and
userpassword=#{password}
</select>
</mapper>
<!-- 实例化MyBatis的SqlSessionFactoryBean对象-->
<!--mybatis配置,读取配置文件(扫描配置文件)-->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="alibabaDataSource"
p:configLocation="classpath:conf/configuration.xml"
p:mapperLocations="classpath:mapper/*.xml">
</bean>
<!-- 扫描所有XXXMapper的对象 用于生成mapper的代理对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:basePackage="cn.tedu.dao"
p:sqlSessionFactoryBeanName="sqlSessionFactory">
</bean>
将数据返回给业务层,做跳转
项目实践(ajax)
可以是html页面,不提交表单,通过jquery获取表单数据,发送给controller
<form>
<!--略-->
</form>
$(function(){
$("form").submit(function(){
return login();
});
});
function login(){
//获取表单文本框的数据
var uname=$("form input[name=name]").val();
var upwd=$("form input[name=password]").val();
alert(uname+" "+upwd);
//发送ajax异步请求
$.ajax({
url:"user/login",
type:"get",
data:{
"name":uname,
"password":upwd
},
dataType:"json",
success:function(result){
alert(result.status+" "+result.message);
if(result.status==1){
window.location.href="index.html"
}else{
alert(result.message);
}
},
error:function(){
alert("请求失败!");
}
});
return false;
}