mybatis入门截图二

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

线程不安全问题

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

举例: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配置文件名称一样)    加载该类所在的包即可

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

时间: 2024-10-11 17:25:55

mybatis入门截图二的相关文章

Mybatis入门(二)——CRUD

Mybatis入门(二) 添加数据 1.在studentMapping.xml写入SQL <insert id="studentAdd" parameterType="com.bean.Student"> insert into student values(#{sno},#{sName},#{sSex},#{sAge},#{sDept}); </insert> 2.Main函数调用插入数据 String statement="co

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

阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先苦后甜嘛! 回到顶部 一:原始dao开发方法 概要:1.在上篇中搭建好的框价中编写dao接口和dao实现类 2.向dao接口实现类中注入SqlSessionFactory,在方法体内通过SqlSe

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

一.创建数据库表 1.1.创建数据表同时插入数据 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybatis ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @[emai

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

p.p4 { margin: 0.0px 0.0px 0.0px 10.0px; font: 10.5px "PingFang SC" } p.p6 { margin: 0.0px 0.0px 0.0px 21.0px; font: 10.0px "Courier New"; color: #4f76cb } p.p7 { margin: 0.0px 0.0px 0.0px 21.0px; font: 10.0px "Courier New" }

Mybatis入门实例(二)——添加ehcache缓存支持

为了提高MyBatis的性能,有时候我们需要加入缓存支持,目前用的比较多的缓存莫过于ehcache缓存了,ehcache性能强大,而且位各种应用都提供了解决方案,在此我们主要是做查询缓存,提高查询的效率. 在Mybatis的官网上把集成ehcache的文档下载下来看了看,说的太简单了,对于新手很难理解,而且里面说的也不是很清楚,经过一番折腾,终于将ehcache加入了. 官网上提供了一个MyBatis-ehcache.jar的包用于整合ehcache缓存,文档中还说明需要一个ehcache-co

mybatis入门截图三

----------------------------------------------- <!-- 用户信息的综合查询 --> <select id="userlist" parameterType="org.mybatis.po.UserQueryVo" resultType="org.mybatis.po.UserCustom"> <!-- 原来的sql --> <!-- select *fro

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

--------------------------------- 一对一查询 查询订单信息,关联查询创建订单的用户信息 1.高级映射-一对一查询-使用resultType 2.高级映射-一对一查询-使用resultMap 在mapper.xml中定义映射的ResultMap <!-- 订单查询关联用户的resultMap 将整个查询的结果映射到cn.itcast.mybatis.po.Orders中 --> <resultMap type="cn.itcast.mybatis

MyBatis入门学习(二)

在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了解.环境测试是上一节中的测试环境.在此感谢博主提供的资料. 一.通过MyBatis持久层框架完成对数据库表的增删改查操作——基于XML的实现 1.定义sql文件的映射文件,userMapper文件内容如下: <?xml version="1.0" encoding="UTF

mybatis入门(二)

mybatis入门(二) 探究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"> <map