Mybatis基于代理Dao实现CRUD操作

使用要求:

1、持久层接口和持久层接口的映射配置必须在相同的包下

2、持久层映射配置中mapper标签的namespace属性取值必须是持久层接口的全限定类名

3、SQL语句的配置标签<select>,<insert>,<delete>,<update>的id属性必须和持久层接口的方法名相同。

持久层接口

/**
*
* 用户的持久层接口
*/
public interface IUserDao { /**
* 查询所有操作
* @return
*/
List<User> findAll(); /**
* 保存用户
* @param user
*/
void saveUser(User user); /**
* 更新用户
* @param user
*/
void updateUser(User user); /**
* 根据ID删除用户
* @param userId
*/
void deleteUser(Integer userId); /**
* 根据ID查询用户
* @param userId
* @return
*/
User findById(Integer userId); /**
* 根据名称模糊查询用户信息
* @param username
* @return
*/
List<User> findByName(String username); /**
* 查询总用户数 聚合函数
* @return
*/
int findTotal();
}

持久层接口对应的映射配置文件

<?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.itheima.dao.IUserDao">
<!--配置查询所有-->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select> <!--保存用户-->
<insert id="saveUser" parameterType="com.itheima.domain.User">
insert into user(username,address,sex,birthday)values (#{username},#{address},#{sex},#{birthday});
</insert> <!--更新用户-->
<update id="updateUser" parameterType="com.itheima.domain.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update> <!--删除用户-->
<!--此处dao方法中只有一个integer类型参数,只需要写清楚一个占位符就可以,占位符叫什么无所谓-->
<delete id="deleteUser" parameterType="Integer">
delete from user where id=#{id};
</delete> <!--根据ID查询用户-->
<select id="findById" parameterType="Integer" resultType="com.itheima.domain.User">
select * from user where id=#{id};
</select> <!--根据名称模糊查询用户信息-->
<select id="findByName" parameterType="String" resultType="com.itheima.domain.User">
select * from user where username like #{username};
/*select * from user where username like '%${value}%';*/
</select> <!--使用聚合函数查询总用户数-->
<select id="findTotal" resultType="int">
select count(id) from user;
</select>
</mapper>

测试类

package com.itheima.test;

import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
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.After;
import org.junit.Before;
import org.junit.Test; import java.io.InputStream;
import java.util.Date;
import java.util.List; public class MybatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao; @Before//用于在测试方法执行之前执行
public void init()throws Exception{
//1.读取配置文件,生成字节输入流
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取SqlSession对象
sqlSession = factory.openSession();
//4.获取dao的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After//用于在测试方法执行之后执行
public void destroy()throws Exception{ //提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
} @Test
public void testFindAll(){
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
} /**
* 测试保存操作
*/
@Test
public void testSaveUser(){
User user =new User ();
user.setAddress ("QingDao");
user.setBirthday (new Date ());
user.setSex ("m");
user.setUsername ("MKL");
userDao.saveUser (user);
}
/**
* 测试更新操作
*/
@Test
public void testUpdateUser(){
User user =new User ();
user.setId (59);
user.setAddress ("HuangDao");
user.setBirthday (new Date ());
user.setSex ("男");
user.setUsername ("MKL");
userDao.updateUser (user);
} /**
* 测试根据ID进行删除
*/
@Test
public void testDeleteUser(){
userDao.deleteUser (43);
} /**
* 测试根据ID查询用户
*/
@Test
public void testFindById(){
User user=userDao.findById (59);
System.out.println (user);
} /**
* 测试根据名称模糊查询用户信息
*/
@Test
public void testFindByName(){
List<User> users = userDao.findByName ("%王%");
//List<User> users = userDao.findByName ("王");
System.out.println (users);
} /**
*使用聚合函数查询总用户数
*/
@Test
public void testFindTotal(){
System.out.println (userDao.findTotal ());
}
}

问题扩展:进行模糊查询时两种方式的区别

第一种方式   PreparedStatement的参数占位符

第二种方式:   Statement对象的字符串拼接SQL

问题扩展:新增用户id的返回值

Mybatis 示例之 SelectKey

新增用户后,同时还要返回当前新增用户的id值,因为id是由数据库的自动增长来实现的,所以就相当于我们要在新增后将自动增长auto_increment的值返回。

keyProperty 对应的属性名称

<insert id="saveUser" parameterType="USER">
  <!-- 配置保存时获取插入的id -->
  <selectKey keyColumn="id" keyProperty="id" resultType="int">
    select last_insert_id();
  </selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</insert>

Mybatis的参数深入    传递pojo包装对象

开发中通过pojo传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。 Pojo类中包含pojo。

需求:根据用户名查询用户信息,查询条件放到QueryVo的user属性中。

编写QueryVo

package com.itheima.domain;

import java.io.Serializable;

/**
* Created by IDEA
* User:MKL7
* Date:2019/4/20
* Time:15:45
*/ /**
* 查询条件对象对象
*/
public class QueryVo implements Serializable {
private User user; public User getUser () {
return user;
} public void setUser (User user) {
this.user = user;
}
}

编写持久层接口

 /**
* 根据QueryVo中的条件 查询用户信息
* @param queryVo
* @return
*/
List<User> findByVo(QueryVo queryVo);

持久层接口的映射文件

<!--根据QueryVo中的条件查询用户信息-->
<select id="findByVo" resultType="com.itheima.domain.User" parameterType="com.itheima.domain.QueryVo">
select * from user where username like #{user.username};
</select>

测试包装类作为参数

/**
* 测试根据QueryVo 查询用户信息
*/
@Test
public void testFindByVo () {
User user = new User ();
user.setUsername ("%王%"); QueryVo queryVo = new QueryVo ();
queryVo.setUser (user); List<User> users=userDao.findByVo (queryVo);
System.out.println (users);
}

Mybatis基于代理Dao实现CRUD操作 及 Mybatis的参数深入的更多相关文章

  1. 使用MyBatis对数据库中表实现CRUD操作(二)

    一.使用MyBatis对表实现CRUD操作 1.定义sql映射 userMapper.xml <?xml version="1.0" encoding="UTF-8 ...

  2. Springboot整合Mybatis实现级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...

  3. Spring Boot整合Mybatis完成级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...

  4. 05 Mybatis的CRUD操作和Mybatis连接池

    1.CRUD的含义 CRUD是指在做计算处理时的增加(Create).读取(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单词的首字母简写.主要被用在描述软件系统中 ...

  5. 数据库CRUD操作以及MyBatis的配置使用

    • 业务字段设计 • 数据库创建 • CRUD操作 • MyBatis集成 • 注解和XML定义 • ViewObject和DateTool • 首页开发     • 业务字段设计 实体: name: ...

  6. Mybatis学习(二) - CRUD操作(增删改查操作)

    直接上例子: 1.项目结构: 2.具体代码及配置 User.java package com.mybatis.bean; public class User { private int id; pri ...

  7. MyBatis使用注解方式实现CRUD操作

    一.使用注解后就不需要写SysGroupDaoMapper.xml 只需要在Dao的抽象方法前加上相应的注解就可以. package cn.mg39.ssm01.dao; import java.ut ...

  8. SSM框架之Mybatis(2)CRUD操作

    Mybatis(2)CRUD 1.基于代理Dao实现CRUD操作 使用要求: 1.持久层接口(src\main\java\dao\IUserDao.java)和持久层接口的映射配置(src\main\ ...

  9. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013540.html 上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybati ...

随机推荐

  1. MySQL最新版本 MySQL5.7.11 批量自动化一键式安装(转)

    --背景云端 以前都喜欢了源码安装MySQL,总觉得源码是高大上的事情,不过源码也需要时间,特别是make的时候,如果磁盘和cpu差的话,时间很长很长,在虚拟机上安装mysql尤其甚慢了. 现在业务发 ...

  2. linux下的时间

    1.linux下时间管理机制: 在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现.为了保持系统时间与CMOS时间的一致性,Linux每隔11分钟会 ...

  3. Java8 日期和时间实用技巧

    新的日期API ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则 Instant: 用来表示时间线上的一个点 LocalDate: 表示没有时区的日期, Lo ...

  4. 【Python环境】matplotlib - 2D 与 3D 图的绘制

    2015-10-30数据科学自媒体 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. 让我们加载它: from pylab import ...

  5. Sandbox简介和路径获取

    一.简介 iOS的沙盒机制,每个应用只能访问自己应用目录下的文件.iOS应用产生的内容,如文件.缓存内容等都必须存储在自己的沙盒内.默认情况下,每个沙盒含有3个文件夹:Documents, Libra ...

  6. java飞机大战之子弹的自动生成

    import java.awt.Graphics; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing. ...

  7. linux&nbsp;dev/dsp&nbsp;声卡学习笔记

    原文地址:dev/dsp 声卡学习笔记">linux dev/dsp 声卡学习笔记作者:ziyou飞翔       无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(f ...

  8. JavaScript中常用的函数

    javascript函数一共可分为五类:  ·常规函数  ·数组函数  ·日期函数  ·数学函数  ·字符串函数 1.常规函数  javascript常规函数包括以下9个函数:  (1)alert函数 ...

  9. oracle 之sys 、system区别

    角色 1)最重要的区别,存储的数据的重要性不同sys--所有oracle的数据字典的基表和视图都存放在sys用户中,这些基表和视图对于oracle的运行是至关重要的,由数据库自己维护,任何用户都不能手 ...

  10. Apollo问题

    1.安装问题: 一不小心安装了NVIDIA,导致bash docker/scripts/dev_start.sh无法启动:[ERROR] Failed to start docker containe ...