MyBatis基于代理DAO实现CRUD操作

搭建MyBatis环境

  1. 创建Maven工程
  2. 导入相关坐标
    • MyBatis(3.4.5)
    • Junit(4.10)
    • log4j(1.2.12)
    • Mysql(8.0.15)
  3. 编写必要的代码Dao和Domain
  4. 编写映射配置文件
  5. 配置SqlMapConfig.xml
  6. 编写测试类

基于代理DAO的方式实现CRUD

注意事项:

  1. DAO层接口和DAO层接口的配置文件必须在相同的包下.(IDEA需要特别注意)
  2. 持久层的mapper标签的namespace属性必须是DAO层接口的全限定类名
  3. Sql语句的配置标签(select标签等)中的id属性必须和DAO层接口的方法名相同.

编写实体类

package domain;

import java.util.Date;

public class User {
    //字段名字要和数据库中的字段名字一样
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

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

    public void setUsername(String username) {
        this.username = username;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Integer getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public Date getBirthday() {
        return birthday;
    }

    public String getSex() {
        return sex;
    }

    public String getAddress() {
        return address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday=" + birthday +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

编写DAO层接口

package dao;

import domain.QueryVo;
import domain.User;

import java.util.List;

/*
    用户持久层接口
*/
public interface UserDao {
    /**
    * @Description: 查询所有用户
    * @Param: []
    * @return: java.util.List<domain.User>
    * @Author: Chen
    */
    List<User> findAll();

    /**
    * @Description: 保存用户
    * @Param: []
    * @return: void
    * @Author: Chen
    */
    void saveUser(User user);

    /**
    * @Description: 更新用户
    * @Param: [user]
    * @return: void
    * @Author: Chen
    */
    void updateUser(User user);

    /*
        根据ID删除用户
    */
    void deleteUser(Integer userId);

    //根据ID查询用户
    User findById(Integer userId);

    //模糊查询根据名称查询用户信息
    List<User> findByName(String userName);

    //查询总用户数
    int findTotal();

    //根据QueryVO查询中的条件查询用户
    List<User> findUserByVo(QueryVo vo);

}

在UserDao的映射配置文件中进行配置

<?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">
<!--
id:哪个方法
namespace:确定该方法在哪个DAO接口
resultType:封装哪个实体类
parameterType:参数类型
-->
<mapper namespace="dao.UserDao">
    <!--查询所有-->
    <select id="findAll" resultType="domain.User">
        select * from user;
    </select>

    <!--保存用户-->
    <insert id="saveUser" parameterType="domain.User">
        <!--配置保存时获取插入的 id
        keyColumn:数据库的ID值
        keyProperty:对应的属性名称
        resultType:返回值类型
        order:插入后的行为
        #{field}:OGNL表达式
        -->
        <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday) values(#{username},#{address},#{sex},#{birthday});
    </insert>
    <!--更新用户-->
    <update id="updateUser" parameterType="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=#{id};
    </delete>
    <!--根据ID查询用户信息-->
    <select id="findById" parameterType="java.lang.Integer" resultType="domain.User">
        select * from user where id=#{id};
    </select>

    <!--根据名称模糊查询-->
    <select id="findByName" parameterType="String" resultType="domain.User">
        select * from user where username like #{username};
    </select>
    <!--查询总用户数-->
    <select id="findTotal" resultType="java.lang.Integer">
        select count(id) from user;
    </select>

    <!--根据QueryVO的条件查询用户
    #{user.username}:OGNL表达式
        user:QueryVo中的属性,也就是User对象
        username:user对象中的属性
    -->
    <select id="findUserByVo" parameterType="domain.QueryVo" resultType="domain.User">
        select * from user where username like #{user.username};
    </select>
</mapper>

编写测试类

import dao.UserDao;
import domain.QueryVo;
import 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;

/**
* @description: MyBatisCRUD
* @author: Mr.Wang
**/
public class MyBatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    SqlSessionFactory factory;
    SqlSessionFactoryBuilder builder;
    private UserDao userDao;

    /**
    * @Description: 初始化方法
    * @Param: []
    * @return: void
    */
    @Before //该注解用于在测试方法执行之前执行
    public void init() throws Exception {
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建sqlSessionFactory
        builder = new SqlSessionFactoryBuilder();
        //3.使用构建者创建工厂对象 SqlSessionFactory
        factory = builder.build(in);
        //4.使用 SqlSessionFactory 生产SqlSession 对象
        sqlSession = factory.openSession();
        //5.使用 SqlSession 创建 dao 接口的代理对象
        userDao = sqlSession.getMapper(UserDao.class);
    }

    /**
    * @Description: 释放资源和提交事务方法
    */
    @After  //该注解用于在测试方法执行之后执行
    public void destroy() throws Exception {
        //提交事务
        sqlSession.commit();
        sqlSession.close();
        in.close();
    }

    /**
    * @Description: 测试查询所有方法
    * @Param: []
    * @return: void
    * @Author: Chen
    */
    @Test
    public void testFindAll() {
        //使用代理对象执行查询所有方法
        List<User> users = userDao.findAll();
        for (User user : users
        ) {
            System.out.println(user);
        }
    }

    @Test
    public void testSave() {
        User user = new User();     //当前时间
        user.setAddress("北京西二旗");
        user.setSex("女");
        user.setBirthday(new Date());
        user.setUsername("刘龙飞");
        //执行保存方法
        userDao.saveUser(user);
    }

    //更新用户
    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(45);
        user.setAddress("北京天安门");
        user.setSex("男");
        user.setBirthday(new Date());//当前时间
        user.setUsername("张小飞");
        //执行更新方法
        userDao.updateUser(user);
    }

    // 删除用户
    @Test
    public void testDelete() {
        //执行删除方法
        userDao.deleteUser(50);
    }

    // 根据ID查询用户
    @Test
    public void testfindById() {
        User user = userDao.findById(41);
        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 count = userDao.findTotal();
        System.out.println(count);
    }

    //保存用户后返回用户ID
    @Test
    public void testSaveReturnId() {
        User user = new User();     //当前时间
        user.setAddress("北京西二旗");
        user.setSex("女");
        user.setBirthday(new Date());
        user.setUsername("保存后返回用户id");
        System.out.println("保存前:" + user);
        //执行保存方法
        userDao.saveUser(user);
        System.out.println("保存后:" + user);
    }

    //根据QueryVO查询中的条件查询用户
    @Test
    public void testFindByQueryVo() {
        QueryVo queryVo = new QueryVo();
        User user = new User();
        user.setUsername("小%");
        queryVo.setUser(user);
        List<User> users = userDao.findUserByVo(queryVo);
        for (User u :
                users
        ) {
            System.out.println(u);
        }
    }
}

sql语句标签的一些属性说明

select

id:DAO层接口的方法名

parameterType:用于指定传入的参数类型

resultType:用于指定结果集

#{}:OGNL表达式,语法格式{对象.对象}

insert

id:DAO层接口的方法名

parameterType:代表参数类型,因为传入的参数是一个类对象,所以要写类的全限定名

#{}:在insert标签中,我们传入的参数是一个User对象,所以此处应该写User对象中的属性名称.

注意:#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username属性,并调用getUsername()方法把值取出来。如果parameterType属性上指定了实体类名称,可以省略对象名,而直接写对象的属性名称.

注意

在进行insert,update,delete操作时必须要commit.

模糊查询需要注意的事项

在配置文件中没有加入%来作为模糊查询的条件,所以在传入字符串实参时,就需要给定模糊查询的标识%。配置文件中的#{username}也只是一个占位符,所以SQL语句显示为”?”.


 上一篇
MyBatis的参数深入 MyBatis的参数深入
parameterType配置参数给Sql语句传参数使用parameterType属性进行设置.该属性可以读取基本数据类型也可以读取引用类型,还可以是POJO类,同时也可以使用实体类的包装类. 注意: 基本数据类型和String在传参数的时
2019-05-16
下一篇 
MyBatis入门使用 MyBatis入门使用
搭建MyBatis开发环境创建项目 数据库准备新建数据库并插入测试数据 use chuanzhijava CREATE TABLE user ( id int(11) NOT NULL auto_increment, username v
2019-05-06
  目录