MyBatis学习记录(一) 初始MyBatis

最近想学习一下java web相关知识,于是就随便找了一个最近比较流行的一个持久层框架来学习,在实验楼学习的,感觉那个网站还是不错的,虽然很多课程需要会员,有在线的学习环境,但是我不想用,我还是比较喜欢本地练习。

什么是MyBatis呢?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

我对java也是刚刚入门的级别,所以里面的一些词语还是不太懂的,比如这个xml,我实验之后,给我的感觉它是一个配置文件,有点类似于json文件,然后POJO 我也不太清楚是什么东西。暂时先照葫芦画瓢把这个东西用起来。

准备条件

既然是根数据库有关的,那么肯定要装有数据库呀,我这里就是用的MySql,登录进去mysql -uroot -p 这里的-u 是说用户名,后面接的是用户名,然后-p表示需要密码,然后输入密码就可以登录到数据库啦。
然后新建一个mybatis测试用的数据库

create database mybatis;

然后新建一个表

create table user(
    id int primary key auto_increment,
    username varchar(20),
    password varchar(20),
    sex varchar(10),
    address varchar(20));

ok了,数据库的准备环境已经好了

然后就是MyBatis的环境了,首先下载MyBatis的包,去github下载就可以了,然后还需要一个连接mysql的java驱动包,去mysql的官网下载mysql-connector就可以了,接下来用你的ide,我比较喜欢idea,因为不喜欢eclipse的代码提示功能,创建一个web project,然后把这两个包加上一个mybatis目录lib里面的log4j-1.2.17.jar包 复制到web的lib(没有的话自己创建)目录下,然后再Project Structure 里面modules 的dependencis里面加入这个路径就行了。
然后基础的包都准备完毕。

然后就开始mybatis的配置了,在src目录下新建一个mybatis.cfg.xml文件,往里面填写




    
        
    

    
    
        
            
            

            
            
            
                
                
                
                
            
        
    

    
        
    

这个配置文件我也是复制教程上的,我想如果以后自己要写一个项目的话,没有这个东西怎么办呀,先不管这么多,看看这个文件里面干了什么。

其实注释已经写的很清楚了,这里的JDBC我也不是太清楚到底是什么东西,大概也是用于控制数据库的东西。
这里面有个东西值得我们注意,就是dataSource这个里面的东西,可以看到里面写到了连接数据库的用户名和密码,用的时候注意改。

然后这里还有两个没有注释的就是 typeAliases 和 mappers 等会说。

配置完成之后,我们需要建立一个java类,和我们数据库中的表格来一个完全一致的对应关心,就是类的属性和表格的字段最好一样。

package com.shiyanlou.mybatis.model;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;

    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 getPassword() {
        return password;
    }

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

    public String getSex() {
        return sex;
    }

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

    public String getAddress() {
        return address;
    }

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

然后需要写一个你想要有哪些方法来操作数据库的一个接口,这里就是一个创建记录的方法,更新记录的方法,删除记录的方法,查询记录(根据id和所有)的方法,一共有五个方法,所以接口这么写:

package com.shiyanlou.mybatis.mapper;

import com.shiyanlou.mybatis.model.User;

import java.util.List;

public interface UserMapper {

    /*
    * 新增用户
    * @param user
    * @return
    * @throws Exception*/
    public int insertUser(User user) throws Exception;



    public int updateUser(User user) throws Exception;


    /*
    * 删除用户
    * @param id
    * @return
    * @throws Exception*/
    public int deleteUser(Integer id) throws Exception;


    /*
    * 根据id查询用户
    * @param id
    * @return
    * @throws Exception*/
    public User selectUserById(Integer id) throws Exception;


    /*
    * 查询所有用户
    * @return
    * @throws Exception*/
    public List selectAllUser() throws Exception;

}

注意看最开头的package哦,它是这个接口所在的包,之后会用到。

然后接口完成之后,我们需要一个映射配置文件,在这个接口文件的包下,建立一个xml配置文件,用来配置具体的sql语句的实现(包括参数,返回类型)。
如下:




    
    
        
        
        
        
        
    

    
    
    
    
    
        insert into user (username,password,sex,address) values
        (#{username},#{password},#{sex},#{address})
    

    
        update user set
        address=#{address} where
        id=#{id}
    

    
        delete from user where
        id=#{id}
    

    

    
    

    


我们看到那个一开始mapper 有个namespace 它的值就是接口文件的位置,这个配置文件非常关键(个人感觉),其中开头配置了一个自定义的返回结果类型,就是userMap,在selectAllUser中用到了这个类型,目前还没有看懂为什么要用到resultMap而不继续用resultType,然后这个配置文件继续定义了各种数据库操作的sql语句,可以看到这个里面的updateUser其实是只更新了address,有缺陷,可以完善一下。这个东西弄好了以后,我们要在mybatis的配置文件中设置一下,也就是之前我说以后说的那个部分,在mybatis.cfg.xml中添加:


    
    

以及为我们的javabean起一个别名,在文件中添加




正是因为我们添加这个东西,所以我们在写那个UserMapper.xml配置文件的时候,就可以直接用User这个类,而不需要写完整的包路径。

然后我们添加一个记录日志,在src目录下新建一个mybatis的目录文件log4j.properties,然后添加内容:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

我们再写一个测试文件,用户测试我们的之前写的所有东西是否正确。

我们创建一个UserTest类来进行测试。

package com.shiyanlou.mybatis.test;

import com.shiyanlou.mybatis.mapper.UserMapper;
import com.shiyanlou.mybatis.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

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

public class UserTest {


    private static SqlSessionFactory sqlSessionFactory;


    public static void main(String[] args) {
        // mybatis 配置文件路径
        String resource = "mybatis.cfg.xml";

        //得到配置流文件
        InputStream inputStream = null;
        try{
            inputStream = Resources.getResourceAsStream(resource);
        }catch (IOException e){
            e.printStackTrace();
        }

        //创建会话工厂,传入MyBatis 的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //insertUser();
        updateUser();
        //selectUserById();
        //selectAllUser();
        //deleteUser();
    }

    // 新增用户
    private static void insertUser(){
        // 通过工厂得到SqlSession
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = new User();

        user.setUsername("John");
        user.setPassword("123456");
        user.setSex("male");
        user.setAddress("beijing");
        try {
            mapper.insertUser(user);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }

        session.close();
    }

    // 更新用户
    private static void updateUser(){
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = null;

        try {
            user = mapper.selectUserById(1);
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
        user.setUsername("MiaoMiao");

        try{
            mapper.updateUser(user);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }

        session.close();
    }


    // 根据id删除用户
    private static void deleteUser(){
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        try {
            mapper.deleteUser(3);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }

        session.close();
    }

    // 根据id查找用户
    private static void selectUserById(){
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        try{
            User user = mapper.selectUserById(1);
            session.commit();
            System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
        }catch (Exception e){
            e.printStackTrace();
            session.rollback();
        }

        session.close();

    }

    private static void selectAllUser(){
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        try {
            List userList = mapper.selectAllUser();
            session.commit();
            for (User user : userList){
                System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
            }
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }
        session.close();
    }
}

同样注意包的名字,这个文件就比较好懂,里面配置了mybatis的配置文件,然后就可以根据这个东西创建一个SqlSessionFactory 来创建SqlSession了,然后就是基本的操作了。
最后我们就是一个一个方法进行测试就可以了。

你可能感兴趣的:(MyBatis学习记录(一) 初始MyBatis)