Mybatis CRUD 操作

create

1, UserDao接口新增方法void saveUser(User user);

2, 配置文件

   <!--insert标签用于插入操作,
    parameterType值的是接口方法即id的参数类型 void saveUser(User user),这里是User类型
    mybatis规定sql语句的?用#{}占位符替代,填的是实体类的属性名(本质是方法名去掉前面的get set),
    如果不是用IDE自动生成的方法,这就意味着可能属性和方法不一致,直接方法名去掉get set即可
    -->
    <insert id="saveUser" parameterType="com.scott.domain.User">
        insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>

3, 测试方法

先把公用代码提取出来

    private InputStream is;
    private SqlSession session;
    private UserDao userDao;

    /**
     * 注意:并非你写了init方法它就会自动执行,而是看上面的注解
     * 而且,这里的Before After注解的方法都要为public才行
     * @throws IOException
     */
    @Before
    public void init() throws IOException {
        is = Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(is);
        session = factory.openSession();
        userDao = session.getMapper(UserDao.class);
    }

    @After
    public void destroy() throws IOException {
        //提交事务
        session.commit();
        //释放资源
        session.close();
        is.close();
    }



注意一定要手动提交事物,否则会回滚

 /**
     * 测试保存用户
     * @throws IOException
     */
    @Test
    public void testSaveUser() throws IOException {
        User user = new User();
        user.setUsername("山本武大郎");
        user.setSex("M");
        user.setBirthday(new Date());
        user.setAddress("北京三文鱼海鲜市场");
        userDao.saveUser(user);
    }

补充新增后如何返回新插入记录的id

1, 接口方法不用改

2,配置文件

    <insert id="saveUser" parameterType="com.scott.domain.User">
        <!--配置插入操作后,获取插入数据的id
        keyProperty="id" 实体类的属性名称
        keyColumn="id" 对应表的列名
        resultType="int" 返回值类型
        order="AFTER" 执行顺序
        -->
        <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id()
        </selectKey>
        insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
    </insert>

3, 测试

     /**
     * 测试保存用户并将id封装到实体类中
     * @throws IOException
     */
    @Test
    public void testSaveUser() throws IOException {
        User user = new User();
        user.setUsername("山本武大郎 测试获取插入后的id");
        user.setSex("M");
        user.setBirthday(new Date());
        user.setAddress("北京三文鱼海鲜市场");
        System.out.println("保存操作之前:"+user);
        userDao.saveUser(user);
        System.out.println("保存操作之后:"+user);
    }


delete

1, UserDao接口新增方法void deleteUser(int id);

2, 配置文件

    <!--删除用户,
    这里的parameterType由于是基础类型所以这里可以填int,INt, INteger, java.lang.Integer 等等
    由于是基础类型且只有一个参数,所以占位符里面可以随便写 UId, banannana,XXX 都行
    -->
    <delete id="deleteUser" parameterType="int">
        delete from user where id = #{uid}
    </delete>

3, 测试

     /**
     * 测试删除用户
     * @throws IOException
     */
    @Test
    public void testDeleteUser() throws IOException {
        userDao.deleteUser(52);
    }

update

1, UserDao接口新增方法void updateUser(User user);

2, 配置文件

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

3, 测试

    /**
     * 测试更新用户
     * @throws IOException
     */
    @Test
    public void testUpdateUser() throws IOException {
        User user = new User();
        user.setId(52);
        user.setUsername("毛利小武郎");
        user.setSex("W");
        user.setBirthday(new Date());
        user.setAddress("北京三文鱼海鲜市场");
        userDao.updateUser(user);
    }

retrieve

查一般以下方法:

  • 根据id查询单个
  • 查询所有
  • 模糊查询
  • 由多个对象组成的条件查询
  • 分页查询
  • 查询总记录数

1. 根据id查询

1, UserDao接口新增方法User findById(Integer id);

2, 配置文件

    <select id="findById" parameterType="java.lang.Integer" resultType="com.scott.domain.User" >
       select * from user where id = #{uid}
    </select>

3, 测试

     /**
     * 测试根据id查询用户
     * @throws IOException
     */
    @Test
    public void testFindUserById() throws IOException {
        User user = userDao.findById(50);
        System.out.println(user);
    }

2. 查询所有

1, UserDao接口新增方法List<User> findAll();

2, 配置文件

    <!--配置查询所有-->
    <!--id不能乱写,是接口的方法名-->
    <!--resultType告诉mabatis把结果封装到哪里去-->
    <select id="findAll" resultType="com.scott.domain.User">
        select * from user
    </select>

3, 测试

    /**
     * test findAll()
     */
    @Test
    public void testFindAll() throws IOException {
        List<User> users = userDao.findAll();
        for (User u : users) {
            System.out.println(u);
        }
    }

3. 2种模糊查询方式

1, UserDao接口新增2个方法 List<User> findByName(String username); List<User> findByName1(String username);

2, 配置文件

    <!--模糊查询1-->
    <select id="findByName" parameterType="string" resultType="com.scott.domain.User">
        select * from user where username like #{username}
    </select>
    <!--模糊查询2 这里的key必须为value-->
    <select id="findByName1" parameterType="string" resultType="com.scott.domain.User" >
        select * from user where username like '%${value}%'
    </select>

注意:模糊查询中 这里的key必须为value

3, 测试

    /**
     * 测试更具username模糊查询用户
     * @throws IOException
     */
    @Test
    public void testFindUsersByName() throws IOException {
        List<User> users = userDao.findByName("%王%");
        for (User u: users) {
            System.out.println(u);
        }
    }

    /**
     * 测试根据username模糊查询用户
     * @throws IOException
     */
    @Test
    public void testFindUsersByName1() throws IOException {
        List<User> users = userDao.findByName1("王");
        for (User u: users) {
            System.out.println(u);
        }
    }

4. 查询总记录数

1, UserDao新增方法

    //mabatis也支持聚合函数,查询用户总记录数
    int findUsers();

2, 配置文件

    <select id="findUsers" resultType="int">
        select count(id) from user
    </select>

3, 测试

     /**
     * 测试查询有多少用户
     * @throws IOException
     */
    @Test
    public void testFindUsers() throws IOException {
        int count = userDao.findUsers();
        System.out.println(count);
    }

5,由多个对象组成的条件查询

domain包下创建 QueryVo.java

public class QueryVo {
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

1, UserDao新增方法

    //把实体类再包装一层,在实际开发中被广泛使用,由多个对象组成一个查询条件来实现数据的查询
    List<User> findByQueryVo(QueryVo vo);

2, 配置文件

     <!--OGNL表达式会把占位符里面的东西看成是parameterType里的属性,可以看到只有user-->
    <select id="findByQueryVo" parameterType="com.scott.domain.QueryVo" resultType="com.scott.domain.User" >
        select * from user where username like #{user.username}
    </select>

3, 测试

    /**
     * 测试通过username模糊查询用户
     * 把实体类再包装一层,在实际开发中被广泛使用,由多个对象组成一个查询条件来实现数据的查询
     * @throws IOException
     */
    @Test
    public void testFindUsersByVo() throws IOException {
        QueryVo vo = new QueryVo();
        User u = new User();
        u.setUsername("%王%");
        vo.setUser(u);
        List<User> users = userDao.findByQueryVo(vo);
        for (User user: users) {
            System.out.println(user);
        }
    }

results matching ""

    No results matching ""