02【MyBatis框架的CRUD】

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 02【MyBatis框架的CRUD】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

二、MyBatis框架的CRUD

重新搭建一个新的MyBatis环境,进行MyBatis的CRUD测试;

参考:01【MyBatis-快速入门】

2.1 新增

2.1.1 dao接口

package com.dfbz.dao;

/**
 * @author lscl
 * @version 1.0
 * @intro:
 */
import com.dfbz.entity.Emp;

public interface EmpDao {
    void save(Emp emp);
}

2.1.2 接口映射

<?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">

<!--namespace 名称空间,指定对哪个接口进行映射-->
<mapper namespace="com.dfbz.dao.EmpDao">

    <!--
        id: 标识唯一一条SQL语句,和接口方法名保持一致
        parameterType:SQL语句的入参类型,也就是方法参数
        #{}:取值符号
        #{name}:对应的是Emp对象的属性
    -->
    <insert id="save" parameterType="com.dfbz.entity.Emp">
        insert into emp values(null,#{name},#{age},#{addr},#{salary})
    </insert>
</mapper>

2.1.3 代码测试

package com.dfbz.test;

import com.dfbz.dao.EmpDao;
import com.dfbz.entity.Emp;
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;

public class Demo01 {
    @Test
    public void test1() throws IOException {
        //获取主配置文件流
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");

        //获取工厂构造器对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

        //获取session工厂
        SqlSessionFactory factory = builder.build(is);

        //获取session会话对象,与数据交互会话
       	/*
            true: 自动提交
            false: 手动提交(默认值)
         */
        SqlSession session = factory.openSession(true);			// 是否开启自动提交,默认值:false

        EmpDao empDao = session.getMapper(EmpDao.class);

        // 封装数据
        Emp emp = new Emp(null,"小兰",20,"湖北襄阳",5000.0);

        // 执行保持
        empDao.save(emp);

        //释放资源
        session.close();

        is.close();
    }
}

2.1.4 保持返回ID值

Emp emp = new Emp(null, "小红", 18, "江西抚州", 7000.0);
System.out.println("保存之前: " + emp);

empDao.save(emp);

System.out.println("保存之后前: " + emp);

执行结果:

在这里插入图片描述

1)方法一

数据库查询自增长主键的值

在dao接口中扩展一个方法:

void save2(Emp emp);

在这里插入图片描述

dao接口映射:

<!--
    selectKey:相当于执行MySQL LAST_INSERT_ID()函数
        keyColumn:列名称
        keyProperty:实体属性名称
        resultType:类型
        order:
            after:在数据插入之后获取值(适用于列自增)
            before:在数据插入之前获取值(适用于oracle的序列增长)
-->
<insert id="save2" parameterType="com.dfbz.entity.Emp">

    <selectKey keyColumn="id" keyProperty="id" resultType="Integer" order="AFTER">
        select LAST_INSERT_ID()
    </selectKey>
    insert into emp values(null,#{name},#{age},#{addr},#{salary})
</insert>

测试:

在这里插入图片描述

2)方法二

适合支持主键自增长的数据库

  • 1)在dao接口中扩展一个新的方法:
void save3(Emp emp);
  • 2)在EmpDao.xml配置文件中编写:
<!--
    只支持主键自增长的数据库。在oracle中不能使用,因为需要查询序列值
    useGeneratedKeys="true" 获取主键值
-->
<insert id="save3" parameterType="com.dfbz.entity.Emp" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
    insert into emp values(null,#{name},#{age},#{addr},#{salary})
</insert>

2.2 修改

2.2.1 dao接口

void update(Emp emp);

2.2.2 接口映射

<!--修改-->
<update id="update" parameterType="com.dfbz.entity.Emp">
    update emp set name=#{name},age=#{age},addr=#{addr},salary=#{salary} where id=#{id}
</update>

2.2.3 测试

  • 1)抽取创建Session的公共方法:
private SqlSession session = null;
private EmpDao empDao = null;

@Before
public void before() throws Exception {
    // 1. 创建Session工厂的构建对象
    SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();

    // 2. 通过工厂构建对象来创建一个Session工厂
    SqlSessionFactory sessionFactory = factoryBuilder.build(Resources.getResourceAsStream("MyBatisConfig.xml"));

    // 3. 通过session工厂来创建session
    session = sessionFactory.openSession();
    
    // 4. 通过session获取Mapper接口
    empDao = session.getMapper(EmpDao.class);
}

@After
public void after() throws Exception {
    session.close();
}
  • 2)测试代码:
@Test
public void test2() throws IOException {
    // 封装数据
    Emp emp = new Emp(1, "小灰", 22, "江西南昌", 5000.0);

    // 执行修改
    empDao.update(emp);
}

2.3 删除

2.3.1 dao接口

void delete(Integer id);

2.3.2 接口映射

<!--删除,入参是Integer类型-->
<delete id="delete" parameterType="java.lang.Integer">
    delete from emp where id=#{id}
</delete>

2.4 查询

2.4.1 dao接口

Emp findById(Integer id);

List<Emp> findAll();

2.4.2 接口映射

<!--
    parameterType:入参类型(方法形参)
    resultType:出参类型(方法返回值)
-->
<select id="findById" parameterType="java.lang.Integer" resultType="com.dfbz.entity.Emp">
    select * from emp where id=#{id}
</select>

<!--
    parameterType:入参类型(方法形参)
    resultType:出参类型(方法返回值)
-->
<select id="findByNameLike" parameterType="java.lang.String" resultType="com.dfbz.entity.Emp">
    select * from emp where name like #{name}
</select>

3.5.3 测试

  • 测试代码:
@Test
public void test3() throws IOException {
    // 根据id查询
    Emp emp = empDao.findById(1);
    System.out.println(emp);
}

@Test
public void test4() throws IOException {

    List<Emp> empList = empDao.findAll();
    for (Emp emp : empList) {
        System.out.println(emp);
    }
}

2.5 统计

2.5.1 dao接口

Long count();

2.5.2 接口映射

<!--统计-->
<select id="count" resultType="java.lang.Long">
    select count(1) from emp
</select>

2.5.3 测试

@Test
public void test5() throws IOException {
    Long count = empDao.count();
    System.out.println("查询到: " + count + "条记录");
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/131676.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!