--------------------

线程不安全问题

首先明白什么是线程不安全:

举例:struts2中,每个action中都定义了model模型对象(action类中是全局对象的存在  数据域属性)  用于封装前端页面提交过来的数据  所以就造成了struts2是非线程安全的,

即struts2不能使用单例模式,而只能使用多例模式,因为:当进行多线程并发请求的时候  多个线程会共用一个成员变量的值(例如两个用户请求action时  他们的数据就会有问题)

所以为了解决这个问题  struts2自然就成了多例模式的存在(注解方式配置action时   @Scope(prototype))

所以这句话就可以解释了

----------------------------------------

问题的引出:使用原始的方式开发dao

实现类:

package org.mybatis.dao;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.po.User; public class UserDaoImpl implements UserDao { //通过构造注入SqlSessionFactory
private SqlSessionFactory sqlSessionFacory;
public UserDaoImpl(){ }
public UserDaoImpl(SqlSessionFactory sqlSessionFacory){
this.sqlSessionFacory=sqlSessionFacory;
} //问题1:因为sqlSession是非线程安全的 所以不能把sqlSession创建成全局变量 而只能写在每个方法体内 这就造成了问题2的产生 //问题2:这里面把sqlSession在每个方法中都进行了一次创建 以及事务提交 SQLSession关闭 出现大量重复代码 唯独不
//同的就是 执行的语句不同 //3.解决问题2的方法 就是使用代理模式 在执行真正的增删改查之前 先执行这些公共的代码 执行增删改查之后 执行公共代码 @Override
public void deleteUser(int id) throws Exception {
// TODO Auto-generated method stub
SqlSession sqlSession=this.sqlSessionFacory.openSession();
sqlSession.delete("test.deleteUser",id);
sqlSession.commit();
sqlSession.close();
}
@Override
public User findUserById(int id) throws Exception {
// TODO Auto-generated method stub
SqlSession sqlSession=this.sqlSessionFacory.openSession();
User user=sqlSession.selectOne("test.findUserById",id);//调用的是user.xml中写好的sql语句
//sqlSession.commit(); 没有做数据的变更 此代码不写
sqlSession.close();
return user;
} @Override
public void insertUser(User user) throws Exception {
// TODO Auto-generated method stub
SqlSession sqlSession=this.sqlSessionFacory.openSession();
sqlSession.insert("test.insertUser",user);
sqlSession.commit();
sqlSession.close();
} }

测试代码:

package org.mybatis.dao;

import static org.junit.Assert.*;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.po.User; public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory; //这个代码是在测试方法之前执行的代码
@Before
public void setUp() throws Exception {
String resource="SqlMapConfig.xml";
//得到配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
//创建回话工厂
this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsStream);
} @Test
public void testFindUserById() throws Exception {
UserDao userDao=new UserDaoImpl(sqlSessionFactory);
User user=userDao.findUserById(1);
System.out.println(user);
} }

问题的解决:使用代理模式

测试下面配置的方法

创建接口类  接口中的方法 需要和上面的id一样

namespace需要写成接口类的地址

在mybatis核心配置文件中引入sql语句文件

测试类:

package org.mybatis.mapper;

import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.mybatis.dao.UserDao;
import org.mybatis.dao.UserDaoImpl;
import org.mybatis.po.User; public class UserMapperTest { private SqlSessionFactory sqlSessionFactory; @Before
public void setUp() throws Exception {
//
String resource="SqlMapConfig.xml"; InputStream input=Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(input);
}
@Test
public void testFindUserById() throws Exception {
// UserDao userDao=new UserDaoImpl(sqlSessionFactory);
// User user=userDao.findUserById(1);
// System.out.println(user);
SqlSession sqlSession=sqlSessionFactory.openSession();
//得到代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//通过代理对象 调用UserMapper类中的方法
User user=mapper.findUserById(1);
System.out.println(user);
} }

开发思路:开发mapper.xml(UserMapper.xml)  开发mapper接口(UserMapper.java)(不需要实现类  因为sql代码在配置文件中已经创建了)  在核心配置文件中引入mapper.xml

然后就可以在测试类中通过代理对象

UserMapper mapper = sqlSession.getMapper(UserMapper.class);

调用mapper接口中的方法

User user=mapper.findUserById(1);
--------------------------------------------
全局配置文件中属性:

------------------------------

1.properties:

 


------------------------------------

---------------------------------------

---------------------------------

-------------------------------------

使用代理方式的前提下(1.配置文件中的namespace=对应接口类的全路径   2.接口类中的方法名=配置文件中statement对象【sql标签对象】的id值)    mapper.xml和对应的接口类mapper.java在同一目录下   (接口类名称和xml配置文件名称一样)    加载该类所在的包即可

-------------------------------------------------------

mybatis入门截图二的更多相关文章

  1. mybatis入门系列二之输入与输出参数

    mybatis入门系列二之详解输入与输出参数   基础知识   mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回 ...

  2. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

  3. MyBatis入门(二)---一对一,一对多

    一.创建数据库表 1.1.创建数据表同时插入数据 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybati ...

  4. mybatis入门介绍二

    相信看过我的上一篇博客的同学都已经对mybatis有一个初步的认识了.这篇博客主要是对mybatis的mapper代理做一下简单的介绍,希望能够帮助大家共同学习. 我的上一篇博客:mybatis入门介 ...

  5. MyBatis入门(二)接口式编程

    在  MyBatis入门(一) 的基础之上编写接口 将接口和Mapper文件进行绑定,会为接口创建一个代理对象,代理对象去执行增删改查 (1)编写接口 public interface EmpDao ...

  6. MyBatis入门(二)—— 输入映射和输出映射、动态sql、关联查询

    一.输入映射和输出映射 1. parameterType(输入类型) 1.1 传递简单类型 <select id="getUserById" parameterType=&q ...

  7. Mybatis入门(二)------增删改查

    Mybatis增删改查基本操作 一.XML实现方式 1.mapper.xml的配置 <?xml version="1.0" encoding="UTF-8" ...

  8. mybatis入门截图四(订单商品数据模型-懒加载-缓存)

    <!-- 延迟加载的resultMap --> <resultMap type="cn.itcast.mybatis.po.Orders" id="Or ...

  9. mybatis入门截图四(订单商品数据模型 一对一,一对多,多对多)

    --------------------------------- 一对一查询 查询订单信息,关联查询创建订单的用户信息 1.高级映射-一对一查询-使用resultType 2.高级映射-一对一查询- ...

随机推荐

  1. expdp impdp 数据库导入导出命令具体解释

    一.创建逻辑文件夹,该命令不会在操作系统创建真正的文件夹.最好以system等管理员创建. create directory dpdata1 as 'd:\test\dump'; 二.查看管理理员文件 ...

  2. 将Latex tex文档转换成 word文档(上)

    有时候逼不得已,必须得将自己精心排版好的latex 文档 转换成word 给别人编辑 以下提供一个方法 下载 Tex2Word 工具,地址我的网盘 安装 解压后安装,使用默认安装路径 安装过程中.点击 ...

  3. [think in java]第12章 通过异常处理错误

    异常处理是java中唯一正式的错误报告机制. 而且通过编译器强行运行. 异常參数 抛出异常与方法正常返回值的差别:异常返回的"地点"与普通方法调用返回的"地点" ...

  4. WINDOWS XP 系统显示乱码的解决方法(修改注册表,使用正常字体)

            一位同事的计算机进入WINDOWS XP系统后,电脑里的所有汉字全部显示乱码,很多办公文档无法打开而影响工作.因为第一次遇到这种问题,当然首先是百度解决了,搜索了相关的信息后找到了答案 ...

  5. luogu1445 [violet]樱花 阶乘分解

    题目大意 求方程$$\frac{1}{x}+\frac{1}{y}=\frac{1}{N!}$$的正整数解的组数. 思路 咱们把式子整理得$$xy-(x+y)N!=0$$.$xy$和$x+y$?貌似可 ...

  6. luogu1082 同余方程

    题目大意:求$$ax\equiv 1(\ \mathrm{mod}\ m)$$的最小正整数解. 因为$ax-1|m$,故令$ax-1=-ym$,原方程就变成了$ax+my=1$.根据bezout定理此 ...

  7. xcode打包测试

    模拟器的内存cpu网络,都是电脑的.xcode可以查看. Xcode7之前是限制人,限制电脑,限制app,限制真机调试的. Xcode7之后,做真机测试只需要apple id即可,会自动生成证书. X ...

  8. 依赖注入与Service Locator

    为什么需要依赖注入? ServiceUser是组件,在编写者之外的环境内被使用,且使用者不能改变其源代码. ServiceProvider是服务,其类似于ServiceUser,都要被其他应用使用,不 ...

  9. 从实现HTML页面局部刷新到JSONP

    也可以用iframe方法发get请求,但是目前iframe基本已经被弃用,所以此处就不介绍这个方法. 方案一:用图片造 get 请求 button.addEventListener('click', ...

  10. hdu1853 Cyclic Tour 完美匹配 验证模版

    题意: 给出n个城市和m条路,每个城市只能经过一次,想要旅游所有的城市,求需要的最小花费(路径的长度). 分析: 做题之前,首先要知道什么是完美匹配.不然题目做了却不知道为什么可以用这个方法来做.完美 ...