使用Mybatis完成CRUD

实例

POJO: User

package com.rhett.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {

    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;

    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getAddress() {
        return address;
    }

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

    public String getSex() {
        return sex;
    }

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

    public Date getBirthday() {
        return birthday;
    }

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

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

DAO接口

package com.rhett.dao;

import com.rhett.domain.User;
import java.util.List;

public interface IUserDao {
    /**
     * 查询所有操作
     */
    List<User> findAll();

    /**
     * 保存用户
     * @param user
     */
    void saveUser(User user);

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

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

    /**
     * 根据id查找用户
     * @param userId
     * @return
     */
    User findById(Integer userId);

    /**
     * 模糊查询用户信息
     * @param username
     * @return
     */
    List<User> findByName(String username);

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

mapper配置

<?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.rhett.dao.IUserDao">
    <!-- 配置查询所有操作 -->
    <select id="findAll" resultType="User">
        select * from user
    </select>

    <!-- 保存用户 -->
    <insert id="saveUser" parameterType="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="User">
        update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
    </update>

    <!-- 删除用户 -->
    <delete id="deleteUser">
        delete from user where id = #{uid};
    </delete>

    <!-- 根据id查询用户 -->
    <select id="findById" resultType="User">
        select * from user where id = #{uid};
    </select>

    <!-- 根据名称模糊查询用户 -->
    <select id="findByName" resultType="User">
        select * from user where username like #{username};
    </select>

    <!-- 获取用户的总记录条数 -->
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>
</mapper>

mybatis配置

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <properties resource="db.properties"/>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <typeAliases>
        <package name="com.rhett.domain"></package>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="{driver}"/>
                <property name="url" value="{url}"/>
                <property name="username" value="{username}"/>
                <property name="password" value="{password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/rhett/dao/IUserDao.xml"/>
    </mappers>
</configuration>

测试类

package test;

import com.rhett.dao.IUserDao;
import com.rhett.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
import org.junit.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;

public class MybatisTest {
    InputStream in;
    SqlSession session;
    private IUserDao userDao;

    @Before
    public void init() throws IOException {
        // 1.读取配置文件
        in = Resources.getResourceAsStream("mybatis.xml");
        // 2.创建SqlSessionFactory工厂
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        // 3.使用工厂生成SqlSession对象
        session = factory.openSession();
        // 4.使用SqlSession创建Dao接口的代理
        userDao = session.getMapper(IUserDao.class);
    }

    @After
    public void destroy() throws IOException {
        session.commit();
        // 6.释放资源
        session.close();
        in.close();
    }

    @Test
    public void testFindAll() throws IOException {
        // 5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user:users){
            System.out.println(user);
        }
    }

    /**
     * 测试保存操作
     */
    @Test
    public void testSave() throws IOException {
        User user = new User();
        user.setUsername("mybatis save user get insertedId");
        user.setAddress("北京市顺义区");
        user.setSex("男");
        user.setBirthday(new Date());
        System.out.println("保存操作之前:"+user);
        // 5.使用代理对象执行方法
        userDao.saveUser(user);
        System.out.println("保存操作之后:"+user);
    }


    /**
     * 测试更新操作
     */
    @Test
    public void testUpdate() throws IOException {
        User user = new User();
        user.setId(50);
        user.setUsername("mybatis update user");
        user.setAddress("北京市顺义区");
        user.setSex("女");
        user.setBirthday(new Date());

        // 5.使用代理对象执行方法
        userDao.updateUser(user);
    }

    /**
     * 测试更新操作
     */
    @Test
    public void testDelete() throws IOException {
        // 5.使用代理对象执行方法
        userDao.deleteUser(48);
    }

    /**
     * 测试更新操作
     */
    @Test
    public void testFindOne() throws IOException {
        // 5.执行查询一个方法
        User user = userDao.findById(50);
        System.out.println(user);
    }

    /**
     * 测试模糊查询
     */
    @Test
    public void testFindByName() throws IOException {
        // 5.使用代理对象执行方法
        List<User> users = userDao.findByName("%王%");
        for(User user:users){
            System.out.println(user);
        }
    }

    /**
     * 测试查询总记录条数
     */
    @Test
    public void testFindTotal() throws IOException {
        // 5.使用代理对象执行方法
        int count = userDao.findTotal();
        System.out.println(count);
    }
}

知识点

SQL参数绑定

#{}和${}

  • #{}表示一个占位符,可以防止sql注入
  • ${}表示一个拼接符,将直接显示在sql中

OGNL表达式

#{}中使用OGNL表达式:

它是 apache 提供的一种表达式语言,全称是:
Object Graphic Navigation Language 对象图导航语言
它是按照一定的语法格式来获取数据的。
语法格式就是使用 #{对象.对象} 的方式

根据参数类型的不同可以填的也不同:

  • 基本数据类型
    • 使用#{0},#{1}...的格式
    • 使用#{param1},{param2}...的格式
    • 调用时使用自定义参数注解@Param("xx"),则可以使用#{xx}
  • 对象的属性
    使用#{属性名}
  • Map的值
    使用#{Map的键}

注意

  • 当只有一个参数的时候且数据类型是基本类型,#{}内的内容可以随意填写
  • 除非参数是Map类型,否则配置中的ParameterType不是必填

事务管理

实现增删改时一定要去控制事务的提交,否则会默认回滚事务,使用SqlSession.commit()来实现事务提交。

插入数据之后获取id

配置selectKey标签,id会自动封装到参数对象中:

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

自动封装出现实体类属性和数据库字段名称不一致

解决方案:

  • 在SQL查询的时候给返回的字段用as起别名
  • 用实体类中用注解给属性起别名
  • 在Mapper xml配置文件中使用resultMap配置对应关系
<resultMap id="userMap" type="com.rhett.domain.User">
    <!--主键字段的对应-->
    <id property="" column=""/>

    <result property="" column=""/>
</resultMap>

然后在select标签中使用resultMap="userMap"代替parameterType

<select id="findAll" resultMap="userMap">

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e4%bd%bf%e7%94%a8mybatis%e5%ae%8c%e6%88%90crud/