Mybatis简单介绍

  • 什么是Mybatis?
  • Mybatis是一款优秀的持久层框架
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

Mybatis入门

  1. 首先,如果使用Maven来构建项目,要想使用Mybatis,则需要将下面的dependency代码置于pom.xml中,我这里使用的是目前Mybatis的比较稳定的版本3.5.1;
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.1</version>
</dependency>
  1. 我这里先有一个数据库,需要的话,可以用,当然,要导入数据库:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `mybatis`;

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (
  `id` int(20) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `pwd` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user`(`id`,`name`,`pwd`) values (1,'狂神','123456'),(2,'张三','abcdef'),(3,'李四','987654');
  1. 创建一个工具类,构建SQLSessionFactory对象;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

//mybatis的工具类,重复的代码的提纯
public class MyBatisUtils {

    //类变量不需要设置默认值;
    private static SqlSessionFactory sqlSessionFactory;

    static {

        //在maven中,所有的资源文件一般都放在resources目录下,我们可以直接拿到。
        InputStream inputStream = null;
        try {
            String resource = "mybatis-config.xml";
            inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    //设置SqlSessionFactory公共的方法
    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }


}
  1. database.properties :存放关于连接数据库的内容。
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf-8
username=root
password=123456
  1. 创建一个配置文件,mybatis-config.xml,XML 配置文件中包含了对 MyBatis 系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!--配置文件修改-->
    <properties resource="database.properties"/>
    <!--配置别名-->
    <typeAliases>
        <!--
            将com.baidu.pojo.User简化成User,配置指定类的别名
        -->
         <typeAlias type="com.baidu.pojo.User" alias="User"></typeAlias>
        <!--为包指定别名,上下两行是一样的作用-->
        <package name="com.baidu.pojo"/>
    </typeAliases>
    <!--配置环境,这里可以有多套环境 default代表默认的是那一套-->
    <environments default="development">
        <!--配置一套环境 id .环境的名字-->
        <environment id="development">
            <!--transactionManager:事务管理,type:jdbc-->
            <transactionManager type="JDBC"/>
            <!--dataSource 数据源-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <!--xml中不允许&符号直接出现,我们需要使用 & 代替-->
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
  1. 创建实体类User
public class User {

    private int id;
    private String name;
    private String pwd;

    public User() {
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}
  1. 创建dao层,获取所有user的列表
import com.baidu.pojo.User;

import java.util.List;

public interface UserMapper {
    //获取全部的用户
    List<User> selectUser();
}
  1. 创建一个UserMapper的映射文件UserMapping.xml
<?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">

<!--mapper标签的namespace对应Mapper接口的类-->
<mapper namespace="com.baidu.dao.UserMapper">
    <!--select标签的id对应映射接口的方法名字  resultType:返回结果的类型  中间就编写sql语句-->
    <select id="selectUser" resultType="com.baidu.pojo.User">
        select * from user
    </select>

</mapper>
  1. 关联映射文件在刚才创建的文件mybatis-config.xml中,放在这个位置。
<!--关联映射文件-->
    <mappers>
        <mapper resource="com/baidu/dao/userMapping.xml"/>
    </mappers>
  1. 创建test测试文件
import com.baidu.pojo.User;
import com.baidu.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {
    @Test
    public void selectUser(){

        //1.拿到sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
        //2.通过sqlSessionFactory对象openSession()创建一个sqlSession。
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3.通过sqlSession获得mapper对象 , 参数为映射文件对应的接口类的class对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //4.通过mapper对象来执行操作;
        List<User> users = mapper.selectUser();

        //获得结果集
        for (User user : users) {
            System.out.println(user);
        }
    }
}
  1. 出来了数据了,就证明成功了!

Mybatis的增删改查(CRUD)

  1. 首先配置你的dao层代码
import com.baidu.pojo.User;

import java.util.List;

public interface UserMapper {
    //获取全部的用户
    List<User> selectUser();
    User getUserById(int id);
    int insertUser(User user);
    int removeUserById(int id);
    int updateUser(User user);
}
  1. 配置映射文件UserMapping.xml
<select id="getUserById" resultType="com.baidu.pojo.User">
        select * from user where id = #{id}
    </select>
    <!--
    parameterType:参数类型,基本数据类型可以不写
    -->
    <!--这里的com.baidu.pojo.User可以换成User,因为上面的配置文件用 <typeAliases> 将com.baidu.pojo.User可以替换成User-->
    <insert id="insertUser" parameterType="com.baidu.pojo.User">
        insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
    </insert>

    <delete id="removeUserById">
        delete from user where id = #{id}
    </delete>

    <update id="updateUser" parameterType="com.baidu.pojo.User">
        update user set name = #{name},pwd = #{pwd} where id = #{id}
    </update>

Mybatis处理字段名和属性不一致

属性:实体类
字段:数据库

比如说,你在数据库中的字段名是pwd,而你在实体类中写的是password,则在查询的时候,就会出现如下情况:

java 实体类某一个字段为空显示_sql

  1. 解决方法一:将实体类中的setPassword方法,设置成和数据库字段名一样(不推荐使用,代码不美观)

java 实体类某一个字段为空显示_sql_02

  1. 解决方法二:mysql数据库查询时,起别名。(不推荐使用,字段多的情况下,比较乱)
  2. java 实体类某一个字段为空显示_sql_03

  3. 解决方法三:
  4. java 实体类某一个字段为空显示_sql_04