MyBatis Dao层的编写
传统的dao层编写
以前编写dao层,先新建一个包com.chy.dao,再写接口StudentDao:
public interface StudentDao {
public void insertStudent(Student student); public void updateStudent(Student student, Integer id); public Student selectStudent(Integer id);
}
接着写实现类StudentDaoImpl:
public class StudentDaoImpl implements StudentDao {
@Override
public void insertStudent(Student student) { } @Override
public void updateStudent(Student student, Integer id) { } @Override
public Student selectStudent(Integer id) {
return null;
}
}
MyBatis的dao层编写
MyBatis不这样编写dao。MyBatis的dao由2部分组成:映射文件、映射文件对应的接口。
新建一个包com.chy.mapper,包下新建接口StudentMapper:
public interface StudentMapper {
public void insertStudent(Student student); public Student selectStudent(Integer id);
}
包下新建此接口对应的映射文件StudentMapper.xml:
<?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"> <mapper namespace="com.chy.mapper.StudentMapper">
<insert id="insertStudent" parameterType="com.chy.pojo.Student">
INSERT INTO student_tb(name,age,score)VALUES (#{name},#{age},#{score})
</insert> <select id="queryById" parameterType="Integer" resultType="Student">
SELECT * FROM student_tb WHERE id=#{id}
</select>
</mapper>
- 映射文件的文件名、namespace要与接口名相同,面向接口编程。
- id要与接口中的方法名相同
- 参数类型、返回值类型要与接口中的一致
- 接口中的方法最多只能有一个参数,因为映射文件的参数类型最多只能有一个
mapper包相当于传统方式的dao包,映射文件相当于接口的实现类。
MyBatis dao层的使用
在mybatis全局配置文件中引入映射文件。
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession(); //通过mapper来调用接口中的方法,操作数据库
//参数是mapper接口类的class对象
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); //插入
Student student1 = new Student();
student1.setName("chy");
mapper.insertStudent(student1); //查询
Student student2 = mapper.queryById(1);
System.out.println(student2); sqlSession.commit();
sqlSession.close();
说明
Mapper接口不是必需的。
如果不写Mapper接口,那只能通过sqlSession.selectOne()之类的方式操作数据库;
编写了Mapper接口,才可以通过Mapper接口来操作数据库,sqlSession.getMapper(),实质是动态代理。
传入包装类型的参数
有时候我们需要传入多个参数,比如
- 查询age>20、score>90的学生,需要传入2个Integer型的参数
- 查询某本书在这一周的销量,需要传入一个pojo类:Book,还需要传入一个参数表示这一周以内。
- 要查询某用户购买某辆汽车的订单信息,需要传入2个pojo类:User、Car
这种传入多个参数的情况在复杂的条件查询中比较常见,尤其是多表查询。
mybatis最多只能传入一个参数,怎么办?
可以把要传入的参数包装一下,放在一个包装类中,传入包装类即可。
新建包com.chy.vo,包下新建包装类UserQueryVO,将要传入的参数写为成员变量,并提供getter、setter方法:
public class UserQueryVO {
private User user;
private Car car; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public Car getCar() {
return car;
} public void setCar(Car car) {
this.car = car;
}
}
vo:value object 值对象
po:persist object 持久化对象,与数据表对应。
pojo:plain ordinary java object 简单的Java对象
在com.chy.mapper包下新建UserMapper接口,编写对应的映射文件实现数据库操作。
public interface UserMapper {
public Order queryOrder(UserQueryVO vo);
}
<mapper namespace="com.chy.mapper.UserMapper">
<select id="queryOrder" parameterType="com.chy.vo.UserQueryVO" resultType="com.chy.pojo.Order">
SELECT * FROM order_tb WHERE order_tb.user_id=#{user.id} AND order_tb.car_name=#{car.name}
</select>
</mapper>
#{}中的user、car是vo的属性,这2个属性本身也是对象,可通过.来访问user、car的属性。
使用:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession(); Car car = new Car();
car.setName("宝马X6"); User user = new User();
user.setId(1); //要传入的包装类
UserQueryVO vo = new UserQueryVO();
vo.setCar(car);
vo.setUser(user); UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//传入包装类进行查询
Order order = mapper.queryOrder(vo);
System.out.println(order);
使用Map传入多个参数
除了可以使用包装类传入多个参数,也可以使用Map传入多个参数。
Mapper接口:
public interface UserMapper {
public Order queryOrder(Map<String,Object> map);
}
这个是Mapper接口,所以参数通常写接口,不写具体的实现类,让耦合是接口层次的。
要传入的参数的数据类型不同,写成Object。
映射文件:
<mapper namespace="com.chy.mapper.UserMapper">
<select id="queryOrder" parameterType="HashMap" resultType="com.chy.pojo.Order">
SELECT * FROM order_tb WHERE order_tb.user_id=#{user.id} AND order_tb.car_name=#{car.name}
</select>
</mapper>
#{}中的user、car是map的key,得到对应的value(对象),再通过.获取属性值。
使用:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession(); Car car = new Car();
car.setName("宝马X6"); User user = new User();
user.setId(1); //要传入的map
HashMap<String,Object> map = new HashMap<>();
map.put("car", car);
map.put("user", user); UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//传入map进行查询
Order order = mapper.queryOrder(map);
System.out.println(order);
与使用包装类传入多个参数相比,使用map不需要创建vo类,更加简单。
使用List传入多个参数
<update id="updateMoney" parameterType="list">
<!--传入map,直接通过key来引用-->
update user_tb set money=#{list[1]} where id=#{list[0]}
</update>
默认以list代表列表名。
使用@Param直接传入多个参数
不使用@Param,则只能有一个参数;使用@Param,可以有多个参数。
mapper接口:
public interface UserMapper {
public double queryMoneyById(int id);
public void updateMoney(@Param("id") int id, @Param("money") double money);
}
映射文件:
<update id="updateMoney">
<!--传入map,直接通过key来引用-->
update user_tb set money=#{money} where id=#{id}
</update>
不设置参数类型,@Param("value")、#{value}这2个value要相同,通过这个值来绑定参数。
MyBatis Dao层的编写的更多相关文章
- MyBatis dao层 方法传参
MyBatis dao层 方法传参有三种方法. 1. 以下标的方法获取参数. <update id="insertSuccessKilled"> INSER ...
- controller层负责创建类传递类给service;service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性;dao层负责数据的持久化
controller层负责创建类传递类给service:service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性:dao层负责数据的持久化
- [MyBatis]DAO层只写接口,不用写实现类
团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...
- Mybatis Dao层注解及XML组合Dao的开发方式
mybatis可以用xml进行数据操作,也可以在dao层用注解的方式,也可以采取xml和dao层接口组合使用的方法.显然 ,后者更加简单. 实体类Student package com.zhao. ...
- mybatis dao 层开发简易版 非整合 spring
同样老习惯,先上项目结构截图 首先 补充上篇文中缺失的 mysql demo 用的 小脚本 drop database if exists mybatis; CREATE DATABASE `myba ...
- MyBatis DAO层传递参数到mapping.xml 几种方式
Dao层传递参数到mapping.xml文件的几种方式:(Mybatis传值总结) 第一种:传递单个参数 Dao层Code片段: /** * 根据articleId查询XXXX详情. * * @par ...
- 基于dbunit进行mybatis DAO层Excel单元测试
DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,如H2.优点: ...
- 黑马MyBatisday2 MyBatis Dao层实现 接口代理实现&传统实现 动态SQL和SQL抽取 自定义类型处理 分页插件PageHelper
package com.itheima.mapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelp ...
- 基于Mybatis的Dao层的开发
基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFa ...
随机推荐
- 实现简单HttpServer案例
<html> <head> <title>第一个表单</title> </head> <body> <pre> me ...
- python中的type和object详解
关于这篇博客 这篇博客主要描述Python的新风格对象(new-style objects),如下: <type 'type'>和<type 'object'>分别是什么? 用 ...
- C/S的接口测试工具
Postman概述: Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响 ...
- 如何用VBA代码依次打开文件夹下的Excel文件
'Check Public Function Check() As Variant On Error GoTo erlb Dim StrDir As String StrDir = T ...
- 李彦宏AI大会现场:3秒钟事故30分钟专注
编辑 | 于斌 出品 | 于见(mpyujian) 很多人只看到了舞台上3秒钟的事故,却没有看到李彦宏在台上30分钟的专注. 7月3号,百度AI开发者大会上,李彦宏遭遇了3秒钟的突然袭击,他表现的沉着 ...
- Monty Hall Problem (三门问题)
最近有点忙,没怎么写程序...今天突然想起以前看到过的一个问题-三门问题,十分想用程序来模拟一下,于是实在忍不住了就模拟了这个游戏的实验,通过写程序更加加深了我对这个问题的理解,期间也查找了各种相关资 ...
- Jenkins 定时备份插件 ThinBackup
需求 公司的整个测试环境正式环境打包都是用的同一个Jenkins, 该Jenkins是搭建在内部的一台机器上,之前有一台机器的硬盘出了问题,为了安全起见,我们决定备份 Jenkins 的配置和数据. ...
- HTML常用标签效果展示
HTML常用标签效果展示 一.文本效果 段落1---收到了开发建设看来得更加快乐圣诞节福利肯定是减肥的路上苏里科夫就是打开了飞机都是风口浪尖上的疯狂了大煞风景圣诞快乐的索科洛夫几点上课了关键是低空掠过 ...
- robot framework 接口post请求需要加headers
说明:当你用RF进行post接口测试时候,那么需要加个headers=Content-Type=application/x-www-form-urlencoded,要不然会请求不成功的.
- Struts笔记一
Struts 概念: 是一个MVC框架: Servlet的缺点 1.在web.xml中文件中需要配置很多行代码,维护起来很不方便呢,不利于团队合作. 2.一个servlet的入口只有一个doPost或 ...