JavaEE学习日志(八十一): MyBatis的增删改查操作

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

JavaEE学习日志(八十一)

  • MyBatis
    • MyBatis快速入门
    • MyBatis的CRUD操作
      • 根据ID查询
      • 添加数据
      • 更新数据
      • 删除数据
      • 模糊查询
      • 类型转换--Date类型

MyBatis

MyBatis快速入门

和自定义MyBatis同样的测试代码

package com.itheima;


import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

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

public class TestCustomFrame2 {
    @Test
    public void test(){
        //获取配置文件的输入流对象
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");

        //创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = builder.build(is);
        //获取sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行sql语句
        List list = sqlSession.selectList("com.itheima.dao.UserDao.findAll");
        //遍历结果集
        for (Object o : list) {
            System.out.println(o);
        }
        //关闭资源
        sqlSession.close();
    }
}

MyBatis的CRUD操作

根据ID查询

根据id查询
parameterType="参数类型"
在mybatis中,引入变量#{}


    <select id="findById" resultType="com.itheima.domain.User" parameterType="java.lang.Integer">
        select * from user where id = #{id}
    select>
/*
        根据id查询用户
     */
    @Test
    public void testFindById(){
        //获取输入流对象
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //生成SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //
        List<User> userList = sqlSession.selectList("userMapper.findById",1);
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }

在这里插入图片描述
只查询到了一条数据,使用selectList就显得有点浪费,所以,有一个方法selectOne():

  • selectList永远返回list集合,适合查询多个对象
  • selectOne 返回一个对象,适合查询单个对象
@Test
    public void testFindById(){
        //获取输入流对象
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //生成SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //
//        List userList = sqlSession.selectList("userMapper.findById",1);
//        for (User user : userList) {
//            System.out.println(user);
//        }
        /*
            selectList永远返回list集合,适合查询多个对象
            selectOne 返回一个对象,适合查询单个对象
         */
        User user = sqlSession.selectOne("userMapper.findById", 1);
        System.out.println(user);
        sqlSession.close();
    }

添加数据

注意:

  • 添加数据不用写返回值类型,需要的是参数
  • 默认需要事务提交,否则添加数据失败

    <insert id="save" parameterType="com.itheima.domain.User">
        insert into user values(null,#{username},#{password},#{sex},#{address})
    insert>
@Test
    public void testSave(){
        //获取输入流对象
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //生成SqlSession对象
        //获取的sqlSession不能自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession();

        User user = new User();
        user.setUsername("田七");
        user.setPassword("123");
        user.setSex("男");
        user.setAddress("安徽芜湖");
        //执行sql语句
        sqlSession.insert("userMapper.save",user);
        //提交
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

补充:日志

  1. 引入依赖log4j
  2. 引入日志的配置文件log4j.properties

关于log4j.properties,有两条重要内容
1、

log4j.rootCategory=debug, CONSOLE, LOGFILE, info

其中的debug属性,如果没有debug,则运行时控制台不会输出日志。
2、

log4j.appender.LOGFILE.File=d:/axis.log

路径为日志输出的文件,文件里储存日志

更新数据

  • 和添加一样,不需要返回值,需要参数
  • 默认需要提交事务

    <update id="update" parameterType="com.itheima.domain.User">
        update user set username = #{username}, password = #{password}, sex = #{sex}, address=#{address}
        where id = #{id}
    update>
@Test
    public void testUpdate(){
        //获取输入流对象
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //生成SqlSession对象
        //获取的sqlSession不能自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession();

        User user = new User();
        user.setId(8);
        user.setUsername("王八2");
        user.setPassword("1234562");
        user.setSex("女2");
        user.setAddress("江苏盐城2");
        //执行sql语句
        sqlSession.update("userMapper.update",user);
        //提交
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

删除数据

  • 和添加一样,不需要返回值,需要参数
  • 默认需要提交事务

    <delete id="del" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    delete>
@Test
    public void testDel(){
        //获取输入流对象
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //生成SqlSession对象
        //获取的sqlSession不能自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行sql语句
        sqlSession.delete("userMapper.del",6);
        //提交
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

模糊查询

  • 参数: %a%
    配置文件: username like #{username}
  • 参数: a
    配置文件1: username like "%"#{username}"%"
    配置文件2: username like "%${value}%"

注意:

  • 如果传的是简单类型(基本数据类型或String),${}必须使用value,#{}写什么都行
  • 如果是pojo,属性名引用

${}#{}的区别:
${}:直接拼接,不会转换类型,不能防注入
#{}:转换类型后拼接,相当于占位符?,可以防注入


    
    
    <select id="findByUsername" parameterType="java.lang.String" resultType="com.itheima.domain.User">
        select * from user where username like "%${value}%"
    select>
@Test
    public void testFindByUsername(){
        //获取输入流对象
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        //获取SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        //生成SqlSession对象
        //获取的sqlSession不能自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //执行查询操作
        List<User> userList = sqlSession.selectList("userMapper.findByUsername","八");
        for (User user : userList) {
            System.out.println(user);
        }
        //提交
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

类型转换–Date类型

#{}可以进行类型的转换

在数据表user中添加一列datetime类型的birthday
JavaEE学习日志(八十一): MyBatis的增删改查操作_第1张图片
但pojo中使用的却是String类型

private String birthday;

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

进行添加数据操作

user.setBirthday("1999-12-30");

可以看到日志文件中,进行了转换

userMapper.save  - ==> Parameters: 新二(String), 123(String),(String), 北京(String), 1999-12-30(String)

成功添加到数据库
JavaEE学习日志(八十一): MyBatis的增删改查操作_第2张图片

你可能感兴趣的:(MyBatis,JavaEE学习日志)