04-增删改查

一、代码

1.接口代码

package com.MyBatis01.dao;

import com.MyBatis01.domain.User;

import java.util.List;

/**
 * 用户持久层接口
 */
public interface IUserDao
{
    /**
     * 查询所有操作
     * @return
     */
    List<User> findAll();

    /**
     * 保存操作
     * @param user
     */
    void saveUser(User user);

    /**
     * 更新用户
     * @param user
     */
    void updateUser(User user);

    /**
     * 删除用户
     * @param userId
     */
    void deleteUser(Integer userId);

    User findById(int userId);

    /**
     * 根据名称,模糊查询
     * @param username
     * @return
     */
    List<User> findByName(String username);

    /**
     * 查询总用户数目
     * @return
     */
    int findTotal();
}

2. 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.MyBatis01.dao.IUserDao">
    <!--配置查询所有 id不可随便写,要写dao的方法名称,resultType返回的类型-->
    <select id="findAll" resultType="com.MyBatis01.domain.User">
        select *from user;
    </select>

    <!--插入操作-->
    <insert id="saveUser" parameterType="com.MyBatis01.domain.User">
        <!-- 配置插入操作后,获取插入数据的 id -->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday) values (#{username},#{address},#{sex},#{birthday});
    </insert>

    <!--更新用户-->
    <update id="updateUser" parameterType="com.MyBatis01.domain.User">
        update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
    </update>

    <!--删除用户-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        /*当参数只有一个时,可以为任何字母代表*/
        delete from user where id=#{any};
    </delete>
    
    <select id="findById" parameterType="java.lang.Integer" resultType="com.MyBatis01.domain.User">
        select *from user where id=#{userId};
    </select>

    <!--根据名称模糊查询-->
    <select id="findByName" parameterType="String" resultType="com.MyBatis01.domain.User">
        select *from user where username like #{name}
    </select>

    <!--查询总用户数目-->
    <select id="findTotal" resultType="java.lang.Integer">
        select count(id) from user;
    </select>
</mapper>

3.测试类代码

package com.MyBatis01.test;

import com.MyBatis01.dao.IUserDao;
import com.MyBatis01.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.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class MyBatisTest
{
    //region 初始化操作
    private InputStream in=null;
    private SqlSession sqlSession=null;
    private IUserDao userDao;



    @Before //用于在测试方法之前执行
    public void init(){
        try
        {
            //        1.读取配置文件
            in=Resources.getResourceAsStream("SqlMapConfig.xml");

            SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
            SqlSessionFactory factory=builder.build(in);

            sqlSession=factory.openSession();

            userDao=sqlSession.getMapper(IUserDao.class);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    @After //用于在测试方法之后执行
    public void destroy(){
        try
        {
            //提交事务
            sqlSession.commit();
            sqlSession.close();
            in.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    //endregion

    /**
     * 查看所有
     */
    @Test
    public void testSelect()
    {

        List<User> users=userDao.findAll();
        for (User user:users){
            System.out.println(user);
        }
        System.out.println("查询所有");
    }

    /**
     * 插入
     */
    @Test
    public void testInsert(){
        User user=new User();
        user.setUsername("泰坦之光");
        user.setAddress("泰坦星");
        user.setSex('男');
        user.setBirthday(new Date());

//        保存之前与保存之后 id 的不同,看 xml 配置文件
        System.out.println("保存操作之前"+user);
        userDao.saveUser(user);

        System.out.println("保存操作之后"+user);

    }

    /**
     * 修改
     */
    @Test
    public void testUpdate(){
        User user=new User();
        user.setId(12);
        user.setUsername("信守斩龙-醉人");
        user.setAddress("龙之谷");
        user.setSex('男');
        user.setBirthday(new Date());

        userDao.updateUser(user);
    }

    /**
     * 删除
     */
    @Test
    public void testDelete(){
        userDao.deleteUser(111);
        System.out.println("删除成功");
    }

    /**
     * 根据 id 查询用户
     */
    @Test
    public void testFindById(){
        User user=userDao.findById(12);
        System.out.println(user);
    }

    /**
     * 模糊查询
     */
    @Test
    public void testFindByName(){
//        模糊查询需要 % 所以要自己添加
        List<User> users=userDao.findByName("%龙%");
        for (User user:users){
            System.out.println(user);
        }
    }

    /**
     * 查询总记录条数
     */
    @Test
    public void testFindTotal(){
        Integer userTotal=userDao.findTotal();
        System.out.println("总人口数目为:"+userTotal);
    }
}

二、parameterType(输入类型)

1.传递简单类型

2.传递 pojo 对象

MyBatis 使用 ognl 表达式解析对象字段的值,#{}或者${}括号中的值为 pojo 属性名称

OGNL表达式:

Object Graphic Navigation Language

它是通过对象的取值方法来获取数据,在写法上把 get 给省略了

比如:我们获取用户的名称

​ 类中写法:user.getUsername();

​ OGNL表达式写法:user.username

mybatis 中为什么能直接写 username,而不用 user. 呢?

​ 因为在 parameterType 中已经提供了属性所属的类,所以此时不需要写对象名

3.传递 pojo 包装对象

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

pojo 类中包含 pojo

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

三、假如数据库列明与实体类的名字对不上号

  1. 在 IUserDao 查询语句中改为

    1. select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday
  2. 配置 查询结果的列明和实体类的属性名的对应关系

    <!--配置 查询结果的列明和实体类的属性名的对应关系-->
    <resultMap id="userMap" type="com.MyBatis01.domain.User">
        <!--主键字段的对应-->
        <id property="id" column="id"></id>

        <!--左边位实体类的属性名,右边为数据库的列名-->
        <!--非主键字段的对应-->
        <result property="username" column="username"></result>
        <result property="birthday" column="birthday"></result>
        <result property="sex" column="sex"></result>
        <result property="address" column="address"></result>

    </resultMap>

    <!--配置查询所有 id不可随便写,要写dao的方法名称,resultType返回的类型-->
    <select id="findAll" resultMap="userMap">
        select *from user;
    </select>
原文地址:https://www.cnblogs.com/zuiren/p/11406103.html