miracle just wanna be better

ssm

2019-09-01
miracle

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;
}

上一篇 mybatis

下一篇 shiro

Comments

Content