基于代理 Dao 实现 CRUD 操作,使用mybatis连接MySQL数据库并对其进行增删改查

该博客详细介绍了如何使用mybatis框架连接MySQL数据库,进行增删改查操作。内容包括:基于代理Dao的CRUD实现要求,如接口与映射配置在同一包下,namespace与方法名对应等;使用步骤,涉及在持久层接口添加findById方法,映射配置文件的编写,以及测试类的测试代码。文章强调了parameterType属性的设置和事务提交的重要性,并指出在新增用户后返回自增id的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用mybatis连接MySQL数据库并对其进行增删改查

  • 这里通过mybatis框架对MySQL数据库进行操作
    提示:里面环境搭建和实体类的建立在我上篇文章里!
    需要的点这里!


前言

mybatis 环境搭建步骤
第一步:创建 maven 工程
第二步:导入坐标
第三步:编写必要代码(实体类和持久层接口)
第四步:编写 SqlMapConfig.xml
第五步:编写映射配置文件
第六步:编写测试类


提示:以下是本篇文章正文内容,下面案例可供参考

一、 基于代理 Dao 实现 CRUD 操作

使用要求:
1、持久层接口和持久层接口的映射配置必须在相同的包下
2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接口的全限定类名
3、SQL 语句的配置标签,,,的 id 属性必须和持久层接口的
方法名相同。

目录结构:
在这里插入图片描述

二、使用步骤

1. 在持久层接口(UserDao.java)中添加 findById 方法

在这里插入图片描述

代码如下(示例):

package cn.it.dao;

import cn.it.domain.Users;

import java.util.List;

public interface UserDao {
    /*//映射查询方法
    List<Users> findAll();*/

    //使用注解查询方法
    /*@Select("SELECT * from users")*/
    List<Users> findAll();

    //id查询
    Users findByID(Integer id);

    //添加
    void addUser(Users users);

    //删除
    void deleteByID(Integer id);

    //更新操作
    void updateUser(Users users);

    //模糊查询
    List<Users> findByFuzzy(String name);

    //条件查询
    List<Users> findByName(String name);

    //查询总记录数
    int findTotal();
}

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">
<mapper namespace="cn.it.dao.UserDao">
    <!-- namespace:把要映射的接口路径加载过来-->
    <select id="findAll" resultType="cn.it.domain.Users">
        SELECT  *  from users
    </select>

    <!--ID查询-->
    <!--id=方法名,resultType=返回值类型(包路径),parameterType=参数类型(包路径)-->
    <select id="findByID" resultType="cn.it.domain.Users" parameterType="java.lang.Integer">
        SELECT * from users where id = #{ id }
    </select>

    <!--添加-->
    <insert id="addUser" parameterType="cn.it.domain.Users">
        /*获取当前插入值的key值,id*/
        <selectKey keyColumn="id" keyProperty="id" resultType="int">
            select last_insert_id();
        </selectKey>
        insert into users(name,password,address) values(#{name},#{password},#{address})
    </insert>

   <!-- 删除-->
    <delete id="deleteByID" parameterType="java.lang.Integer">
        DELETE from users where id = #{ id }
    </delete>

    <!--更新-->
    <update id="updateUser" parameterType="cn.it.domain.Users">
        UPDATE users SET name = #{name},password = #{password},address = #{address} where id = #{id}
    </update>

    <!--//模糊查询-->
    <select id="findByFuzzy" resultType="cn.it.domain.Users" parameterType="String">
        SELECT * from users where name like '%${value}%'
    </select>

    <!--条件查询-->
    <select id="findByName" resultType="cn.it.domain.Users" parameterType="String">
        SELECT * from users where name = #{name}
    </select>

    <!--查询总记录数-->
    <select id="findTotal" resultType="int">
        SELECT count(*) from users
    </select>
</mapper>

3.在测试类添加测试

在这里插入图片描述

package cn.it.test;

import cn.it.dao.UserDao;
import cn.it.domain.Users;
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.List;

public class MybatisTest {

    //使用封装的方式
    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession session;
    private UserDao userDao;

    //初始化方法
    @Before
    public  void init() throws IOException {
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory的构建者对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.使用构建者创建工厂对象 SqlSessionFactory
        factory = builder.build(in);
        //4.使用工厂生产SqlSession对象
        session = factory.openSession();
        //5.使用SqlSession创建Dao接口的代理对象
        userDao = session.getMapper(UserDao.class);

    }

    //关闭资源
    @After
    public void closeResources() throws IOException{
        //移交表
        session.commit();
        //6.释放资源
        session.close();
        in.close();

    }

    //查询所有
    @Test
    public void findAll(){
        //5.使用代理对象执行方法
        List<Users> users = userDao.findAll();
        for(Users user : users){
            System.out.println(user);
         }
    }

    //ID单行查询
    @Test
    public void findByID01(){
        Users users1 = userDao.findByID(1);
        System.out.println(users1);
    }

    //添加
    @Test
    public void add(){
        Users users = new Users();
        users.setName("小强2");
        users.setPassword("2131");
        users.setAddress("深圳");
        userDao.addUser(users);
        //输出当前插入数据的id
        System.out.println(users.getId());
    }

    //删除
    @Test
    public void delete(){
        userDao.deleteByID(3127);
    }

    //修改
    @Test
    public void update(){
        Users users = userDao.findByID(2);
        users.setName("小玉");
        users.setPassword("aaa");
        users.setAddress("上海");
        userDao.updateUser(users);
    }

    //模糊查询
    @Test
    public void findByFezzy(){
        List<Users> usersList = userDao.findByFuzzy("强");
        for (Users users : usersList){
            System.out.println(users);
        }
    }

    //条件查询名字为小爽
    @Test
    public void findByname(){
        List<Users> usersList = userDao.findByName("小爽");
        for (Users users : usersList){
            System.out.println(users);
        }
    }

    //查询总记录数
    @Test
    public void getTatal(){
        int r = userDao.findTotal();
        System.out.println("一共有"+r+"条记录!");
    }

}

所有的增删改查操作的代码我都写在里面了,里面有许多需要注意的细节需要注意。

<insert id="saveUser" parameterType="com.itheima.domain.User">
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>

细节:
parameterType 属性:
代表参数的类型,因为我们要传入的是一个类的对象,所以类型就写类的全名称。

可以使用:session.commit();来实现事务提交。加入事务提交后的代码如下:

@After//在测试方法执行完成之后执行
public void destroy() throws Exception{
session.commit();
//7.释放资源
session.close();
in.close();
}

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

<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>
#{}与${}的区别
#{}表示一个占位符号
通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,
#{}可以有效防止 sql 注入。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类
型值,#{}括号中可以是 value 或其它名称。
${}表示拼接 sql 串
通过${}可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换, ${}可以接收简
单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,${}括号中只能是 value。

总结

提示:我只说明了部分细节和需要注意的地方,没有的地方还请见谅!
以上就是操作的内容,本文仅仅简单介绍了 CRUD 操作,希望对您有所帮助,谢谢阅读!。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值