栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mybatis入门

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mybatis入门

搭建MyBatis 1.创建maven工程引入依赖


    
        org.mybatis
        mybatis
        3.5.7
    

    
        junit
        junit
        4.12
        test
    

    
        mysql
        mysql-connector-java
        5.1.3
    

mybatis有两配置文件,一个是核心的配置文件【数据库连接信息和mybatis全局信息】,一个是mapper文件用于书写sql语句

2.创建MyBatis的核心【全局】配置文件

在习惯上命名为mybatis-config.xml,这个文件名仅仅是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制,粘贴。

核心配置文件主要配置连接数据库环境以及mybatis全局配置信息

核心配置文件存在的位置是src/main/resources目录下




    
        
        
            
            
            
                
                
                
                
            
        
    
    
    
        
    

3.创建Mapper接口

1.必须先创建数据库中的表:

CREATE TABLE IF NOT EXISTS t_user(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAr(20),
	`password` VARCHAr(20),
	age INT,
	sex CHAR,
	email VARCHAr(20)
);

2.创建对应的javabean类

public class User {
    private int id;
    private String username;
    private String password;
    private int age;
    private String sex;
    private String email;

    public User() {
    }

    public User(int id, String username, String password, int age, String sex, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
        this.sex = sex;
        this.email = email;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + ''' +
                ", password='" + password + ''' +
                ", age=" + age +
                ", sex='" + sex + ''' +
                ", email='" + email + ''' +
                '}';
    }
}

MyBatis中的mpper接口相当于以前的dao,但是区别在于mapper仅仅是接口,我们不需要提供实现类,在mybatis会自动生成实现类

public interface UserMapper {
    
    int insertUser();
}
4.创建MyBatis的映射文件

相关概念:ORM【Object Relationship Mapper】对象关系映射。

  • 对象:Java的实体类对象
  • 关系:关系型数据库
  • 映射:二者之间的对应关系
Java概念数据库概念
属性字段/列
对象记录/行
细节说明 1.映射文件的命名规则:
  • 表所对应的实体类的类名+Mapper.xml【就是mapper接口中的接口名和映射文件的名字一致,只是后缀不同】
  • 例如:表名为t_User ,映射的实体类为User,所对应的接口名一般为UserMapper,及对应的映射文件为UserMapper.xml,所以说:接口名和映射文件名一致只是后缀不同,一个是.java,一个是.xml
  • 一个映射文件对应一个实体类,对应一张表的操作
  • mybatis映射文件用于编写sql,访问以及操作表中的数据
  • mybatis映射文件存放的位置是src/main/resources/mappers目录下【注意在resources下文件是以目录形式的不能使用.形式,要以形式】
2.MyBatis中可以面向接口操作数据,要保证两个一致性:[非常重要]
  • mapper接口的全类名和映射文件的命名空间namespace保持一致
  • mapper接口中的方法的方法名和映射文件中编写sql的标签的id属性保持一致

原因是:我们调用mapper接口时,mapper接口可以根据映射文件的命名空间namespace找到mapper.xml文件,再调用mapper接口中的方法时,根据映射文件中的id可以找到相对应的sql标签,从而执行sql

注意是在:resources下存放的是资源文件,不是包,所以不能使用.的方式,要以目录的方式

第一步:编写Mapper接口

public interface UserMapper {

    
    
    
    int insertUser();
}

第二步:编写Mapper.xml文件




    
    
        insert into t_user(id,username,password,age,sex,email)
        values(null,"湛江","123",23,"男","123@qq.com")
    

第三步:在mybatis核心【全局】配置文件中引入 mapper.xml的路径

    
    
        
    
5.通过Junit测试功能

步骤:

  1. 读取MyBatis的核心配置文件【使用的是apache中的ibatis.io包下的Resources类】
  2. 创建SqlSessionFactoryBuilder对象
  3. 通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象
  4. 使用SqlSessionFactory对象中的静态方法openSession(),获取SqlSession对象【注意是在openSession()方法中可以传入参数,传入true表示自动提交事务,传入false表示手动提交事务】
  5. 调用SqlSession对象中的getMapper(Class type)方法,返回一个实现类,如果传入是一个类,则返回一个类的对象,如果传入是一个接口,则返回的是一个接口的实现类
  6. 调用Mapper接口中的方法
  7. 处理结果
  8. 关闭流

上述第五小点

//        5. 调用`SqlSession`对象中的`getMapper(Class type)`方法,返回一个实现类,如果传入是一个类,则返回一个类的对象,如果传入是一个接口,则返回的是一个接口的实现类
        // 如果传入是一个Java具类,返回就是一个Java类的对象
        User user = new User();
        sqlSession.getMapper(User.class);
        // 如果传入是一个接口,返回就是一个接口的实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//返回一个接口的实现类的对象

案例:

public class TestMapperCRUD {
    @Test
    public void testInsert() throws IOException {
//        1. 读取`MyBatis`的核心配置文件
        InputStream rss = Resources.getResourceAsStream("mybatis-config.xml");
//        2. 创建`SqlSessionFactoryBuilder`对象
        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//        3. 通过核心配置文件所对应的字节输入流创建工厂类`SqlSessionFactory`,生产`SqlSession`对象
        SqlSessionFactory build = ssfb.build(rss);
//        4. 使用`SqlSessionFactory`对象中的静态方法`openSession()`,获取`SqlSession`对象【注意是在`openSession()`方法中可以传入参数,传入`true`表示自动提交事务,传入`false`表示手动提交事务】
        SqlSession sqlSession = build.openSession();
//        5. 调用`SqlSession`对象中的`getMapper(Class type)`方法,返回一个实现类,如果传入是一个类,则返回一个类的对象,如果传入是一个接口,则返回的是一个接口的实现类
        // 如果传入是一个Java具类,返回就是一个Java类的对象
//        User user = new User();
//        sqlSession.getMapper(User.class);
        // 如果传入是一个接口,返回就是一个接口的实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//返回一个接口的实现类的对象
//        6. 调用`Mapper`接口中的方法
        int i = mapper.insertUser();
        //注意是:由于使用的是JDBC管理事务,需要手动提交事务,除非在获取SqlSession对象中传入true参数
        sqlSession.commit();
//        7. 处理结果
        System.out.println(i);
    }
}

执行的原理是:当我们调用方法时,会根据接口,接口找到相应的web.xml,接口的方法会根据web.xml的id对应的Sql语句,执行sql

总结:

SqlSession:代表Java程序和数据库之间的会话。【相当于HttpSession是Java程序和浏览器之间的会话】

SqlSessionFactory:是生产 SqlSession的工厂

工厂模式:如果创建某个一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个工厂类中,以后都使用这个 工厂类来生产我们需要对象

优化自动提交事务

在使用SqlSessionFactory对象中的一个openSession()方法时,传入参数true时,表示自动提交,不需要手动提交事务

6.加入log4j日志功能

步骤:

  1. 加入依赖

  2. 加入log4j的配置文件

    log4j配置文件名为log4j.xml,存放位置src/main/resources目录下【一般日志文件名是固定的】

依赖:



    log4j
    log4j
    1.2.17

加入log4j配置文件【文件名一般是固定的】




    
        
        
            
        
    
    
        
    
    
        
    
    
        
        
    

日志的级别【重点】

FATAL(致命) —> ERROR(错误) —> WARN(警告) —> INFO(信息) —>DEBUG(调试)

从左到右打印的内容越来越详细

7.测试增删改查CRUD

书写的顺序,是先在Mapper接口中,定义方法,再在Mapper.xml文件中编写sql语句

第一步:编写UserMapper接口

public interface UserMapper {

    

    
    int insertUser();

    
    int updateUser();

    
    int deleteUser();

    
    User getUserById();

    
    List selectAllUser();
}

第二步:编写UserMapper.xml文件




    
    
        insert into t_user(id,username,password,age,sex,email)
        values(null,"海康","123",22,"男","123@qq.com");
    


    
    
        update t_user set email = "168@qq.com" where id = 1;
    

    
    
        delete from t_user where id = 2;
    

    


    
        select * from t_user;
    

第三步:编写测试方法

public class TestMapperCRUD {
    @Test
    public void testInsert() throws IOException {
//        1. 读取`MyBatis`的核心配置文件
        InputStream rss = Resources.getResourceAsStream("mybatis-config.xml");
//        2. 创建`SqlSessionFactoryBuilder`对象
        SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
//        3. 通过核心配置文件所对应的字节输入流创建工厂类`SqlSessionFactory`,生产`SqlSession`对象
        SqlSessionFactory build = ssfb.build(rss);
//        4. 使用`SqlSessionFactory`对象中的静态方法`openSession()`,获取`SqlSession`对象【注意是在`openSession()`方法中可以传入参数,传入`true`表示自动提交事务,传入`false`表示手动提交事务】
        SqlSession sqlSession = build.openSession();
//        5. 调用`SqlSession`对象中的`getMapper(Class type)`方法,返回一个实现类,如果传入是一个类,则返回一个类的对象,如果传入是一个接口,则返回的是一个接口的实现类
        // 如果传入是一个Java具类,返回就是一个Java类的对象
//        User user = new User();
//        sqlSession.getMapper(User.class);
        // 如果传入是一个接口,返回就是一个接口的实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);//返回一个接口的实现类的对象
//        6. 调用`Mapper`接口中的方法
        int i = mapper.insertUser();
        //注意是:由于使用的是JDBC管理事务,需要手动提交事务,除非在获取SqlSession对象中传入true参数
        sqlSession.commit();
//        7. 处理结果
        System.out.println(i);

        // 关闭流
        if (sqlSession!=null){
            sqlSession.close();
        }
    }

    @Test
    public void testUpdate() throws IOException {
        // 加载配置文件
        InputStream rss = Resources.getResourceAsStream("mybatis-config.xml");
        // 创建工厂对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // SqlSessionFactoryBuilder对象中的build方法获取一个SqlSessionFactory对象
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(rss);
        // 获取SqlSession对象
        SqlSession sqlSession = build.openSession(true);//传入true表示自动提交事务
        // 获取Mapper接口实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 调用Mapper接口中的方法
        int i = mapper.updateUser();
        // 处理结果
        System.out.println(i);
        // 关闭流
        if (sqlSession!=null){
            sqlSession.close();
        }
    }

    @Test
    public void testDelete() throws IOException {
        // 加载配置文件
        InputStream rss = Resources.getResourceAsStream("mybatis-config.xml");
        // 创建工厂对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // SqlSessionFactoryBuilder对象中的build方法获取一个SqlSessionFactory对象
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(rss);
        // 获取SqlSession对象
        SqlSession sqlSession = build.openSession(true);//传入true表示自动提交事务
        // 获取Mapper接口实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 调用Mapper接口中的方法
        int i = mapper.deleteUser();
        // 处理结果
        System.out.println(i);
        // 关闭流
        if (sqlSession!=null){
            sqlSession.close();
        }
    }

    @Test
    public void testSelect() throws IOException {
        // 加载配置文件
        InputStream rss = Resources.getResourceAsStream("mybatis-config.xml");
        // 创建工厂对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // SqlSessionFactoryBuilder对象中的build方法获取一个SqlSessionFactory对象
        SqlSessionFactory build = sqlSessionFactoryBuilder.build(rss);
        // 获取SqlSession对象
        SqlSession sqlSession = build.openSession(true);//传入true表示自动提交事务
        // 获取Mapper接口实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        // 查询指定用户信息
//        User user = mapper.getUserById();
        // 处理结果
//        System.out.println(user);

        // 查询所有用户信息
        List users = mapper.selectAllUser();
        // 输出所有用户信息
        users.forEach(user -> System.out.println(user));
        // 关闭流
        if (sqlSession!=null){
            sqlSession.close();
        }
    }
注意:
  1. 查询标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系
    1. resultType:自动映射,用于属性名和表中字段名一致的情况
    2. resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况
  2. 当查询的数据为多条时,不能使用实体类作为返回值,只能使用集合,否则会抛出异常ToomManyResultsException,但是若查询的数据只有一条,可以使用实体类或集合作为返回值
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/855005.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号