(五)mybatis开发dao层
目录
SqlSession 是线程不安全的
SqlSession 是 线程不安全 的;
对于它,我们建议在方法体内部使用;这样,即使多个线程同时访问了,每个线程都占用一片自己的内存,因此 ,sqlsession 对象就在不同的内存区域内,因此,就可以避免掉线程冲突的问题 ;
原始 dao 开发方法
原始 dao 层开发,需要我们写 接口 和 实现类 ;
接口
package xin.ijava.dao; import xin.ijava.pojo.User; /**
* @author An
*/
public interface UserDao { /**
* 添加用户
* @param user 封装好的用户信息
* @throws Exception
*/
public void insertUser(User user) throws Exception ; /**
* 删除用户 根据 id
* @param id 用户 id
* @throws Exception
*/
public void deleteUserById(int id ) throws Exception ; /**
* 更新用户
* @param user 封装新信息的用户对象
* @throws Exception
*/
public void updateUser(User user) throws Exception ; /**
* 查找用户
* @param id 用户id
* @return 用户对象
* @throws Exception
*/
public User findUserById(int id) throws Exception ; }
实现类
package xin.ijava.dao; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import xin.ijava.pojo.User; /**
* @author An
*/
public class UserDaoImpl implements UserDao{ /**
* 注入sqlSessionFactory 工厂
*/
private SqlSessionFactory factory ; public UserDaoImpl(SqlSessionFactory factory){
this.factory = factory ;
} @Override
public void insertUser(User user) throws Exception {
SqlSession sqlSession = factory.openSession() ;
sqlSession.insert("test.insertUser",user) ;
sqlSession.close();
} @Override
public void deleteUserById(int id) throws Exception {
SqlSession sqlSession = factory.openSession() ;
sqlSession.delete("test.deleteUserById",id) ;
sqlSession.close();
} @Override
public void updateUser(User user) throws Exception {
SqlSession sqlSession = factory.openSession() ;
sqlSession.update("test.updateUserById",user) ;
sqlSession.close();
} @Override
public User findUserById(int id) throws Exception {
SqlSession sqlSession = factory.openSession() ;
User user = sqlSession.selectOne("test.findUserById",id) ;
sqlSession.close();
return user;
}
}
总结
1、上面的实现类代码中,可以看出,代码中存在着大量的模板代码,我们重复的写着这些代码;
2、
硬编码问题,我们把statement的id硬编码到了代码中 ;3、参数是
object类型,导致传任何类型的数据进去,都不会报错,即使传的数据类型根本不是映射关系中要求的类型,也不会得到报错,导致编译期间不会提示错误,直到运行期才能知道错哪了 ;
Mapper 代理方法
程序员只需要写出 mapper 接口(相当于 dao 接口)即可,无须写出实现类 ;
mapper 的开发规范:
在
mapper.xml中namespace等于mapper接口地址<mapper namespace="xin.ijava.dao.UserMapper">mapper.java接口中的方法名和mapper.xml中的statement的id一致 ;mapper.java接口中的方法输入参数类型和mapper.xml中的statement的parameterType指定的类型一致 ;mapper.java接口中的方法返回值类型和mapper.xml中的statement的resultType指定的类型一致 ;
以上操作完成以后,就可以利用 mybatis 生成代理对象 ;
@Test
public void test2() throws Exception {
SqlSession sqlSession = factory.openSession() ;
// 获取代理对象,参数写上类的全路径名
UserMapper userMapper = sqlSession.getMapper(xin.ijava.dao.UserMapper.class) ;
// 利用代理对象,操作
User user = userMapper.findUserById(1) ;
System.out.println(user);
}
关于代理对象
代理对象是怎么知道具体调用什么方法的呢?
在构建代理对象的时候,会去查询 xxxMapper,xml 映射关系,根据标签名,就可以知道是调用什么方法了;标签名有: <select> 、<delete> 、<update> 、<insert> ;
根据接口方法名字,也就是 标签的 id 值,查询标签的名字,从而知道调用什么方法 ;
其中 select 方法,有点不同;因为有2中,selectOne 、selectList ;
代理对象,是根据接口的返回值来,判断调用哪一个的 ,假如接口的方法,返回单个 pojo 对象,则调用 selectOne,返回集合类型,则调用 selectList;
(五)mybatis开发dao层的更多相关文章
- MyBatis开发Dao层的两种方式(原始Dao层开发)
本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...
- MyBatis开发Dao层的两种方式(Mapper动态代理方式)
MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...
- 基于Mybatis的Dao层的开发
基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFa ...
- mybatis 学习笔记(三):mapper 代理开发 dao 层
mybatis 学习笔记(三):mapper 代理开发 dao 层 优势 通过使用mapper 代理,我们可以不需要去编写具体的实现类(使用 getMapper() 方法自动生成),只需编写接口即可, ...
- 基于Mybatis的Dao层开发
转自:https://www.cnblogs.com/rodge-run/p/6528398.html 基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建 Sq ...
- mybatis开发dao的方式
mybatis基于传统dao的开发方式 第一步:开发接口 public interface UserDao { public User getUserById(int id) throws Excep ...
- MyBatis学习--mybatis开发dao的方法
简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...
- 四 mybatis开发dao的方法
mybatis开发dao的方法 1.1 SqlSession使用范围 1.1.1 SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...
- MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...
随机推荐
- bash基础之三配置文件
一.shell的两种登录方式: 1.交互式登录:(1)直接通过终端输入账号密码登录(2)使用“su - UserName” 或“su -l Username”切换的用户执行顺序:/etc/profil ...
- java试题复盘——9月8日
上: 1.可将语句块或方法设为同步使用的语句是(A) A synchronized 用于方法或者代码块前,使此方法或者代码变成同步的 B static ...
- java单例问题
之前看资料,有人根据对象的创建时间将单例的实现分为懒汉式和饿汉式: 懒汉式: public class Singleton { private volatile static Singleton in ...
- Hive-概述
Hive:由 Facebook 开源用于解决海量结构化日志的数据统计. Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能. 本质是:将 ...
- 【I·M·U_Ops】------Ⅱ------ IMU自动化运维平台之CMDB
说明本脚本仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 我理解的 CMDB CMDB翻译过来,Configuratio ...
- 周志华-机器学习西瓜书-第三章习题3.5 LDA
本文为周志华机器学习西瓜书第三章课后习题3.5答案,编程实现线性判别分析LDA,数据集为书本第89页的数据 首先介绍LDA算法流程: LDA的一个手工计算数学实例: 课后习题的代码: # coding ...
- MySQL 慢查询日志介绍
转: MySQL 慢查询日志介绍 2018年08月23日 08:47:40 曾梦想仗剑走天涯XX 阅读数 1104 一. 慢查询介绍 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记 ...
- UC浏览器打开百度显示 丰臣吉秀.网址
- 04Flutter仿京东商城项目 首页商品列表布局
Home.dart import 'package:flutter/material.dart'; import 'package:flutter_swiper/flutter_swiper.dart ...
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_09-freemarker基础-内建函数
可以理解为freemaker提供的一些函数和方法 controller里面记得把map的数据注释去掉,.放开代码 工程需要重启下 <br/> 学生的个数: ${stus?size} < ...