Mybatis 数据库增删改查操作:

数据准备

项目结构

Department

1234567891011121314151617181920212223242526272829303132333435
package com.hph.mybatis.beans;

import java.util.List;

public class Department {

    private Integer id;    private String departmentName ;

    private List<Employee> emps ;

    public List<Employee> getEmps() {        return emps;    }    public void setEmps(List<Employee> emps) {        this.emps = emps;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getDepartmentName() {        return departmentName;    }    public void setDepartmentName(String departmentName) {        this.departmentName = departmentName;    }    @Override    public String toString() {        return "Department [id=" + id + ", departmentName=" + departmentName + "]";    }}

Employee

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
package com.hph.mybatis.beans;

public class Employee {

    private Integer id;    private String lastName;    private String email;    private Integer gender;

    private Department dept;

    public void setDept(Department dept) {        this.dept = dept;    }

    public Department getDept() {        return dept;    }

    public Employee() {    }

    public Employee(Integer id, String lastName, String email, Integer gender, Department dept) {        this.id = id;        this.lastName = lastName;        this.email = email;        this.gender = gender;        this.dept = dept;    }

    public Employee(Integer id, String lastName, String email, Integer gender) {        super();        this.id = id;        this.lastName = lastName;        this.email = email;        this.gender = gender;    }

    public Integer getId() {        return id;    }

    public void setId(Integer id) {        this.id = id;    }

    public String getLastName() {        return lastName;    }

    public void setLastName(String lastName) {        this.lastName = lastName;    }

    public String getEmail() {        return email;    }

    public void setEmail(String email) {        this.email = email;    }

    public Integer getGender() {        return gender;    }

    public void setGender(Integer gender) {        this.gender = gender;    }

    @Override    public String toString() {        return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + "]";    }

}

EmployeeMapper

1234567891011121314151617181920212223242526272829303132333435363738
import com.hph.mybatis.beans.Employee;import org.apache.ibatis.annotations.MapKey;import org.apache.ibatis.annotations.Param;

import java.util.List;import java.util.Map;

public interface EmployeeMapper {    //根据id查询员工    public Employee getEmployeeById(Integer id);

    //添加一个新的员工    public void addEmployee(Employee employee);

    //修改一个员工    public void updateEmployee(Employee employee);

    //删除一个员工    public Integer deleteEmployeeById(Integer id);

    //查询对象通过两个参数    public Employee getEmployeeByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastNmae);

    //查询一个集合    public Employee getEmployeeByMap(Map<String, Object> map);

    //查询多个数据返回一个对象的集合    public List<Employee>  getEmps();

    //查询单条数据返回一个Map    public Map<String,Object> getEmployeeByIdReturnMap(Integer id);

    //查询多条数据返回一个Map    @MapKey("id")  //指定使用对象那个属性作为Map的key    public Map<Integer,Employee> getEmpsRetrunMap();

}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
<?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"><!--配置SQL映射--><mapper namespace="com.hph.mybatis.dao.EmployeeMapper">

    <select id="selectEmployee" resultType="com.hph.mybatis.beans.Employee">        select id, last_name , email, gender from tbl_employee where id = #{id}    </select>    <!--public Employee getEmployeeById(Integer id);-->    <select id="getEmployeeById" resultType="com.hph.mybatis.beans.Employee">       select id, last_name , email, gender from tbl_employee where id = #{id}    </select>    <!--public void addEmployee(Employee employee);  parameterType:指定ca参数类型,可以省略不写  keyProperty:指定用对象的那个属性ba保存mybatisf返回的主键值    -->    <!--告诉mybatis:需要使用主键自增的方式-->    <insert id="addEmployee" useGeneratedKeys="true" keyProperty="id">  insert  into  tbl_employee(last_name,email,gender) values (#{lastName},#{email},#{gender})    </insert>

    <update id="updateEmployee"> update tbl_employee set       last_name = #{lastName},     email = #{email},        gender = #{gender}       where id = #{id}    </update>

    <delete id="deleteEmployeeById">        delete  from  tbl_employee where id = #{id}    </delete>    <select id="getEmployeeByIdAndLastName" resultType="com.hph.mybatis.beans.Employee">      select id, last_name lastName, email, gender from tbl_employee where id = #{id} and last_name = #{lastName}    </select>    <select id="getEmployeeByMap" resultType="com.hph.mybatis.beans.Employee">

      select id, last_name , email, gender from ${tableName} where id = ${id} and last_name = #{ln}    </select>    <!--public List<Employee>  getEmps()    resultType结果集的封装类型    ;-->    <select id="getEmps" resultType="com.hph.mybatis.beans.Employee">       select id, last_name , email, gender from tbl_employee    </select>    <select id="getEmployeeByIdReturnMap" resultType="java.util.Map">

      select id, last_name , email, gender from tbl_employee where  id = #{id}

    </select>    <select id="getEmpsRetrunMap" resultType="java.util.Map">       select id, last_name , email, gender from tbl_employee    </select>

</mapper>

EmployeeMapper.xml

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
<?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"><!--配置SQL映射--><mapper namespace="com.hph.mybatis.dao.EmployeeMapper">

    <!--public Employee getEmployeeById(Integer id);-->    <select id="getEmployeeById" resultType="com.hph.mybatis.beans.Employee">       select id, last_name , email, gender from tbl_employee where id = #{id}    </select>    <!--public void addEmployee(Employee employee);  parameterType:指定ca参数类型,可以省略不写  keyProperty:指定用对象的那个属性ba保存mybatisf返回的主键值    -->    <!--告诉mybatis:需要使用主键自增的方式-->    <insert id="addEmployee" useGeneratedKeys="true" keyProperty="id">  insert  into  tbl_employee(last_name,email,gender) values (#{lastName},#{email},#{gender})    </insert>

    <!--public void updateEmployee(Employee employee);-->    <update id="updateEmployee">  update tbl_employee set       last_name = #{lastName},     email = #{email},        gender = #{gender}       where id = #{id}    </update>

    <!--public Integer deleteEmployeeById(Integer id);-->    <delete id="deleteEmployeeById">        delete  from  tbl_employee where id = #{id}    </delete>    <!--    public Employee getEmployeeByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastNmae);-->    <select id="getEmployeeByIdAndLastName" resultType="com.hph.mybatis.beans.Employee">      select id, last_name lastName, email, gender from tbl_employee where id = #{id} and last_name = #{lastName}    </select>    <!--public Employee getEmployeeByMap(Map<String, Object> map);-->    <select id="getEmployeeByMap" resultType="com.hph.mybatis.beans.Employee">

       select id, last_name , email, gender from ${tableName} where id = ${id} and last_name = #{ln}    </select>    <!--public List<Employee>  getEmps()    resultType结果集的封装类型    ;-->    <!--public List<Employee>  getEmps();-->    <select id="getEmps" resultType="com.hph.mybatis.beans.Employee">     select id, last_name , email, gender from tbl_employee    </select>    <!--public Map<String,Object> getEmployeeByIdReturnMap(Integer id);-->    <select id="getEmployeeByIdReturnMap" resultType="java.util.Map">

      select id, last_name , email, gender from tbl_employee where  id = #{id}

    </select>    <!--public Map<Integer,Employee> getEmpsRetrunMap();-->    <select id="getEmpsRetrunMap" resultType="java.util.Map">      select id, last_name , email, gender from tbl_employee    </select></mapper>

TestMybatisMapper

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
package com.hph.mybatis.test;

import com.hph.mybatis.beans.Employee;import com.hph.mybatis.dao.EmployeeMapper;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.Test;

import java.io.IOException;import java.io.InputStream;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;

public class TestMybatisMapper {    @Test    public void testSqlsessionFactory() throws IOException {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        System.out.println(sqlSessionFactory);        SqlSession session = sqlSessionFactory.openSession();        System.out.println(session);        try {            Employee employee = session.selectOne("selectEmployee", 5);            System.out.println(employee);        } finally {            session.close();        }    }

    @Test    public void testHelloWorldMapper() throws IOException {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        SqlSession session = sqlSessionFactory.openSession();        try {            //Mapper接口 dao接口            EmployeeMapper dao = session.getMapper(EmployeeMapper.class);            Employee employee = dao.getEmployeeById(1001);            System.out.println(employee);        } finally {            session.close();        }    }

    public SqlSessionFactory getsqlSessionFactory() throws IOException {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        return sqlSessionFactory;    }

    @Test    public void testCRUD() throws IOException, SQLException {        SqlSessionFactory ssf = getsqlSessionFactory();        SqlSession session = ssf.openSession(true);        try {            //获取代理实现类对象 mapper接口的代理实现类对象            EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);            //添加            Employee employee = new Employee(null, "清风笑_Test", "qfx@qq.com", 1);            mapper.addEmployee(employee);            System.out.println("返回的键值" + employee.getId());

            /**             *      Connection conn = null;             *             PreparedStatement ps = conn.prepareStatement("sql", PreparedStatement.RETURN_GENERATED_KEYS);             *             *             ps.executeUpdate();             *             ps.getGeneratedKeys();             *             jdbc获取新插入的组件的数值             */           //修改            Employee employee1 = new Employee(null,"清风_笑丶", "qfx@gmail.com", 1);

            mapper.updateEmployee(employee1);            //删除         //   Integer count = mapper.deleteEmployeeById(1001);           // System.out.println(count);        } finally {            session.close();        }    }

    @Test    public void testParameter() throws IOException {        SqlSessionFactory ssf = getsqlSessionFactory();        SqlSession session = ssf.openSession(true);        try {            EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);            //   Employee employee = mapper.getEmployeeByIdAndLastName(5, "清风_笑丶");            Map<String, Object> map = new HashMap<String, Object>();            map.put("id", "5");            map.put("ln", "清风_笑丶");            map.put("tableName", "tbl_employee");

            Employee employee = mapper.getEmployeeByMap(map);            System.out.println(employee);        } finally {            session.close();        }    }

    @Test    public void tetSelect() throws IOException {        SqlSessionFactory ssf = getsqlSessionFactory();        SqlSession session = ssf.openSession(true);        try {            EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);            //List<Employee> emps = mapper.getEmps();            //System.out.println(emps);            //Map<String, Object> map = mapper.getEmployeeByIdReturnMap(5);            //System.out.println(map);            Map<Integer, Employee> map = mapper.getEmpsRetrunMap();            System.out.println(map);        } finally {            session.close();        }    }}

结果

testHelloWorldMapper

addEmployee

添加数据

修改数据

删除数据

testParameter

tetSelect

无参数

有参数

主键生成方式、获取主键值

主键生成方式

支持主键自增,例如MySQL数据库

不支持主键自增,例如Oracle数据库

获取主键值

数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=”true”,然后再把 keyProperty设置到目标属性上。

1234567
<insert id="insertEmployee"    parameterType="com.hph.mybatis.beans.Employee"           databaseId="mysql"         useGeneratedKeys="true"            keyProperty="id">       insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})</insert>

参数传递

参数传递的方式

  • 单个参数: 可以接受基本类型,对象类型。这种情况MyBatis可直接使用这个参数,不需要经过任 何处理。
  • 多个参数: 任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,或者0,1…,值就是参数的值
  • 命名参数: 为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名
  • POJO: 当这些参数属于我们业务POJO时,直接传递POJO
  • Map : 我们也可以封装多个参数为map,直接传递
  • Collection/Array : 会被MyBatis封装成一个map传入, Collection对应的key是collection,Array对应的key是array. 如果确定是List集合,key还可以是list.

参数传递源码

12345678910111213141516171819202122
public Object getNamedParams(Object[] args) {    final int paramCount = names.size();    if (args == null || paramCount == 0) {      return null;    } else if (!hasParamAnnotation && paramCount == 1) {      return args[names.firstKey()];    } else {      final Map<String, Object> param = new ParamMap<Object>();      int i = 0;      for (Map.Entry<Integer, String> entry : names.entrySet()) {        param.put(entry.getValue(), args[entry.getKey()]);        // add generic param names (param1, param2, ...)        final String genericParamName = GENERIC_NAME_PREFIX + String.valueOf(i + 1);        // ensure not to overwrite parameter named with @Param        if (!names.containsValue(genericParamName)) {          param.put(genericParamName, args[entry.getKey()]);        }        i++;      }      return param;    }  }

参数处理

参数位置支持的属性: javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、expression

实际上通常被设置的是:可能为空的列名指定 jdbcType ,例如:

1
insert into orcl_employee(id,last_name,email,gender) values(employee_seq.nextval,#{lastName, ,jdbcType=NULL },#{email},#{gender})可以在全局配置文件指定为null 也可以像上面这面这样单独配置

参数获取方式

123456789
#{key}:可取普通类型、POJO类型、多个参数、集合类型获取参数的值,预编译到SQL中。安全。Preparedstatement${key}:可取单个普通类型、POJO类型、多个参数、集合类型注意:取单个普通类型的参数,${}中不能随便写 必须用_parameter  _parameter是Mybatis的内置参数获取参数的值,拼接到SQL中。有SQL注入问题。Statement ORDER BY ${name}

原则:能用#{}取值就优先使用#{} 解决不了的使用${}      e.g.原生的JDBC不支持占位符的地方 就可以使用${}     e.g.Select column1,column2…from 表 where 条件 group by 组表示 having 条件                 order by 排序字段 desc/asc  limit X,X;

select查询的几种情况

查询单行数据返回单个对象

1
public Employee getEmployeeById(Integer id );

查询多行数据返回对象的集合

1
public List<Employee> getAllEmps();

查询单行数据返回Map集合

1
public Map<String,Object> getEmployeeByIdReturnMap(Integer id );

查询多行数据返回Map集合

12
@MapKey("id") // 指定使用对象的哪个属性来充当map的key(对象的属性,而不是数据库的列)public Map<Integer,Employee>  getAllEmpsReturnMap();

resultType自动映射

  • autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是列名和javaBean属性名一致
  • 如果autoMappingBehavior设置为null则会取消自动映射
  • 数据库字段命名规范,POJO属性符合驼峰命名法,如A_COLUMNaColumn,我们可以开启自动驼峰命名规则映射功能,mapUnderscoreToCamelCase=true

缺点:多表查询 完成不了

MyBatis的CURD相关推荐

  1. springboot2整合mysql5_SpringBoot2.X (二十五):SpringBoot整合 Mybatis + MySQL CURD 示例

    话不多数,直接开始撸代码- 工程结构图 开始之前先放张工程结构图 1.maven 依赖: org.springframework.boot spring-boot-starter-web org.my ...

  2. MyBatis简单CURD

    MyBatis简单CURD 回顾ORM的一些知识 ORM的实现 JDBC有优缺点 JPA的优缺点 MyBatis学习 MyBatis第一个入门程序 domain dao/impl 使用 MyBatis ...

  3. springboot 整合mybatis实现curd

    springboot 整合mybatis pom文件 mvc 架构 application.properties 扩展配置,druid配置类 项目地址: https://github.com/seve ...

  4. MyBatis常规CURD详解及拓展~

    目录 1. insert(增) 2. delete(删) 3. update(改) 4. select(查) SQL优化:Map传参 示例:插入一个用户 map传参优点 各种传参对比 补充:模糊查询 ...

  5. 6 MyBatis基于Mapper接口CURD

    6.1 MyBatis进行CURD: 方式1: 基于映射文件+SqlSession 特点: 依赖SqlSession对象方法,实现CURD.比如selectList(),selectOne(),ins ...

  6. Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建

    目录 Spring MVC+Spring+Mybatis+MySQL(IDEA)入门框架搭建 0.项目准备 1.数据持久层Mybatis+MySQL 1.1 MySQL数据准备 1.2 Mybatis ...

  7. 软件框架技术1(MyBatis)

    目录 1.软件框架技术概述: 1.1为什么会出现软件框架技术? 1.2框架概述 1.3框架的优势 2.Maven 2.1.maven是什么 2.2maven依赖管理 2.3仓库 ​编辑2.4maven ...

  8. MyBatis入门(从零到一)

    文章目录 MyBatis官方文档地址 实际操作可能会遇见的问题 引入MyBatis依赖 CURD各写一遍 使用map参数类型 resultMap标签的简单使用(结果集映射) 配置解析 核心配置文件 环 ...

  9. 01 mybatis框架

    回顾 jdbc: 1.1 jdbc 操作步骤总结如下: 1. 加载数据库驱动 2. 创建并获取数据库链接 3. 创建 jdbc statement 对象 4. 设置 sql 语句 5. 设置 sql ...

最新文章

  1. OpenCV中Mat类的重载运算符operator()的用法
  2. viewer vue 文档_vue基于viewer实现的图片查看器
  3. 计算机桌面怎么换服,电脑管家桌面整理怎么更换电脑壁纸?
  4. Linux多任务编程之七:Linux守护进程及其基础实验(转)
  5. Antd Mobile Design输入框组件InputItem错误显示方式封装
  6. fastjson 1.1.31 发布,Java 的 JSON 库
  7. MyCat 主键ID自增长配置
  8. python函数手册 chm_Python中文文档
  9. Hadoop大数据综合案例4-Hive数据分析
  10. C++ 找朋友(friends)
  11. Xbrowser远程登录Ubuntu闪退问题的解决方案
  12. 计算机毕业设计Java的健身房管理系统(源码+系统+mysql数据库+lw文档)
  13. 2022年1111/双11淘宝/天猫/京东任务自动助手,分享源码学习
  14. 前端vue使用vue-socket.io与socket.io-client与后台使用netty-socketio建立实时通信
  15. 国内医院临床自闭症病例分享:大脑自闭了,为什么是肠道的锅?
  16. PostgreSQL 源码解读(147)- Storage Manager#3(fsm_search函数)
  17. 在Linux下使用Vi进阶编辑器Vim编译C/C++
  18. win7旗舰版计算机管理在哪,win7打开计算机管理,windows7计算机管理在哪里
  19. Expires / Cache-Control / Last-Modified / If-Modified-Since / ETag / If-None-Match 区别使用
  20. 如何用cmd命令查看wifi密码

热门文章

  1. 简单编程代码表白_用简单代码实现抖音表白神器
  2. API的String 一些用法
  3. 微信小程序 - 为何setData到页面上有的加分号
  4. 完全数--Python
  5. ubuntu配置硬盘开机自动挂载
  6. 24-[模块]-re
  7. 关于C++全局变量和静态变量初始化的一些总结
  8. idea没有代码自动提示功能和包自动引入不了问题
  9. include 与 Widget
  10. Sdut 2165 Crack Mathmen(数论)(山东省ACM第二届省赛E 题)