1. 程式人生 > 實用技巧 >6、MySQL之常見的單表CRUD

6、MySQL之常見的單表CRUD

  • CRUD
    • 增 (saveUser)
    • 刪 (deleteUser)
    • 改 (updateUser)
    • 查 (findAllUser,FindUserById)
  • like (findUserByName,findUserByName2)
  • 聚合函式 (findTotal)
  • 獲取儲存資料的id(saveUser)
  • OGNL取值 (findUserByWorkCard)

準備工作

1、user實體類

public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String gender;
    private String address;
      //省略get、set和toString方法
}

2、WorkCard實體類

public class WorkCard {
    private User user;
     //省略get、set方法
}

3、資料庫

CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '使用者名稱稱',
  `birthday` datetime DEFAULT NULL COMMENT '生日',
  `gender` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性別',
  `address` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`) USING BTREE
)

表結構

介面

public interface UserMapper {
    /**
     * 查詢所有使用者
     * @return
     */
    List<User> findAllUser();
    /**
     * 儲存使用者
     */
    void saveUser(User user);
    /**
     * 更新使用者
     */
    void updateUser(User user);
    /**
     * 刪除使用者
     */
    void deleteUser(Integer id);
    /**
     * 根據id查詢使用者
     */
    User findUserById(Integer id);
    /**
     * like模糊查詢,第一種
     */
    List<User> findUserByName(String username);
    /**
     * like模糊查詢,第二種
     */
    List<User> findUserByName2(String username);
    /**
     * 查詢總使用者數(聚合函式count)
     */
    int findTotal();
    /**
     * 根據WorkCard類中User屬性的username模糊查詢
     * WorkCard是user的封裝類
     * OGNL表示式取值
     */
    List<User> findUserByWorkCard(WorkCard workCard);
}

對映檔案

<?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介面的全限定名-->
<mapper namespace="com.example.mapper.UserMapper">
    <!--查詢所有-->
    <select id="findAllUser" resultType="com.example.pojo.User">
        select * FROM user
    </select>
    <!--新增使用者-->
    <insert id="saveUser" parameterType="com.example.pojo.User">
        <!--配置插入操作後,獲取插入資料的id -->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
          SELECT last_insert_id();
        </selectKey>
        INSERT INTO user(username,birthday,gender,address) VALUES (#{username},#{birthday},#{gender},#{address})
    </insert>
    <!--更新使用者-->
    <update id="updateUser" parameterType="com.example.pojo.User">
        UPDATE user SET username = #{username}, birthday = #{birthday}, gender = #{gender}, address = #{address} WHERE id = #{id}
    </update>
    <!--刪除使用者-->
    <delete id="deleteUser" parameterType="Integer">
        <!--當引數只用一個並且引數是基本資料型別的包裝類是#{佔位符}佔位符可以隨便寫 -->
        DELETE FROM user WHERE id = #{userid}
    </delete>
    <!--通過id查詢使用者-->
    <select id="findUserById" parameterType="Integer" resultType="com.example.pojo.User">
        select * FROM user where id = #{userId}
    </select>
    <!--通過名字模糊查詢使用者-->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.example.pojo.User">
        SELECT * FROM user WHERE username LIKE '%${username}%'
    </select>
    <!--通過名字模糊查詢使用者-->
    <select id="findUserByName2" parameterType="java.lang.String" resultType="com.example.pojo.User">
        SELECT * FROM user WHERE username LIKE #{username}
    </select>
    <!--查詢總使用者數,聚合函式count()-->
    <select id="findTotal" resultType="int">
        SELECT count(*) FROM user
    </select>

    <!--OGNL表示式
        Object Graphic Navigation Language 物件 圖 導航 語言
        它是通過物件的取值方法來獲取資料,在寫法上吧get給省略了
        比如:獲取使用者名稱
            通常的寫法:user.getUsername();
            OGNL表示式寫法 user.username
    -->
    <select id="findUserByWorkCard" parameterType="com.example.pojo.WorkCard" resultType="com.example.pojo.User">
        SELECT * FROM user WHERE username LIKE #{user.username}
    </select>
</mapper>
public class UserMapperTest {
    private UserMapper userMapper;
    private SqlSession sqlSession;
    private InputStream stream;

    @Before
    public void init() throws IOException {
        stream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
        sqlSession = sqlSessionFactory.openSession();
        userMapper = sqlSession.getMapper(UserMapper.class);
    }

    @After
    public void destory() throws IOException {
//        每次執行完都進行事務提交
        sqlSession.commit();
        sqlSession.close();
        stream.close();
    }

    /**
     * 查詢所有
     */
    @Test
    public void testFindAll(){

        List<User> allUser = userMapper.findAllUser();
        for (User user: allUser
             ) {
            System.out.println(user);
        }
    }

    /**
     * 儲存使用者
     */
    @Test
    public void testSaveUser(){
        User user = new User();
        user.setUsername("小紅");
        user.setGender("男");
        user.setBirthday(new Date());
        user.setAddress("汕頭市");
        userMapper.saveUser(user);

        System.out.println(user);
    }
    /**
     * 更新使用者
     */
    @Test
    public void testUpdateUser(){
        User user = new User();
        user.setUsername("小紅");
        user.setGender("女");
        user.setBirthday(new Date());
        user.setAddress("汕頭市");
        user.setId(52);
        userMapper.updateUser(user);
    }
    /**
     * 刪除使用者
     */
    @Test
    public void testDeleteUser(){
        userMapper.deleteUser(50);
    }
    /**
     * 根據使用者id查詢使用者
     */
    @Test
    public void testFindUserById(){
        User user = userMapper.findUserById(48);
        System.out.println(user);
    }
    /**
     * 根據使用者姓名模糊查詢使用者
     */
    @Test
    public void testFindUserByName(){
        /**
         * 第一種寫法在dao層的sql語句中新增'%${username}%',這種方式的缺點是不能預處理
         */
        List<User> users = userMapper.findUserByName("小");
        for (User user: users
             ) {
            System.out.println(user);
        }
    }
    /**
     * 根據使用者姓名模糊查詢使用者
     */
    @Test
    public void testFindUserByName2(){
        /**
         * 第二種寫法是在傳參是就添加了%
         */
        List<User> users = userMapper.findUserByName2("%" + "小" + "%");
        for (User user: users
                ) {
            System.out.println(user);
        }
    }
    /**
     * 測試聚合函式
     */
    @Test
    public void testFindTotal(){
        int total = userMapper.findTotal();
        System.out.println(total);
    }

    /**
     * OGNL取值
     */
    /**
     * 根據使用者姓名模糊查詢使用者
     */
    @Test
    public void findUserByWorkCard(){
        User user = new User();
        user.setUsername("%" + "小" + "%");
        WorkCard workCard = new WorkCard();
        workCard.setUser(user);
        List<User> users = userMapper.findUserByWorkCard(workCard);
        for (User u: users
             ) {
            System.out.println(u);
        }
    }
}