MyBatis(一)--------初识Mybatis

MyBatis(一)--------初识Mybatis

1、简介

1.1 什么是Mybatis

  • MyBatis 是一款优秀的持久层框架;

  • 它支持自定义 SQL、存储过程以及高级映射。

  • MyBatis 免除了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java的POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

  • Mybatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并改名为Mybatis。

  • 2013年11月迁移到Github

如何获得Mybatis

  • maven仓库

<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatisartifactId>
    <version>3.5.7version>
dependency>
  • Github:Releases · mybatis/mybatis-3 (github.com)

  • 中文文档地址:mybatis – MyBatis 3 | 简介

1.2 持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程

  • 内存特性:断电即失

  • 数据库(Jdbc),io文件持久化。

为什么要持久化?

  • 有一些对象,不能让他丢掉

  • 内存太贵了

1.3 持久层

  • Dao层、Service层、Controller层

  • 持久层:完成持久化工作的代码块

  • 层界限十分明显

1.4 为什么需要MyBatis

  • 帮助程序员将数据存入到数据库中

  • 方便

  • 传统的JDBC代码太复杂了。为了简化,出现框架,实现自动化。

  • 不用MyBatis也可以,技术没有高低之分。学习框架更容易上手。

1.5 Mybatis优点

  • 简单易学

  • 灵活

  • sql和代码的分离,提高了可维护性。

  • 提供映射标签,支持对象与数据库的orm字段关系映射

  • 提供对象关系映射标签,支持对象关系组建维护

  • 提供xml标签,支持编写动态sql

  • 使用的人多

1.6 Mybatis三个核心接口,面试会问

  • SqlSessionFactoryBuilder
  • SqlSessionFactory
  • SqlSession:每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中

2、第一个Mybatis程序

  • 思路:搭建环境 —> 导入MyBatis —> 编写代码 —> 测试

2.1 搭建环境

  • 搭建数据库
CREATE DATABASE `mybatis`; 
USE `mybatis`; 

CREATE TABLE `user`( 
    `id` INT(20) NOT NULL PRIMARY KEY, 
    `name` VARCHAR(30) DEFAULT NULL, 
    `pwd` VARCHAR(30) DEFAULT NULL 
)ENGINE = INNODB DEFAULT CHARSET= utf8;

INSERT INTO `user`(`id`,`name`,`pwd`) VALUES 
(1,'张三','123456'), 
(2,'李四','123456'), 
(3,'王五','123456'), 
(4,'赵六','123456'), 
(5,'冯七','123456'), 
(6,'陈八','123456'), 
(7,'楚九','123456'); 
  • 新建普通的maven项目

  • 删除src目录:将此工程当作父工程,然后创建子工程

  • 导入maven依赖


    <dependencies>

        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.21version>
        dependency>

        
        <dependency>
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>3.5.7version>
        dependency>

        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.11version>
        dependency>
    dependencies>

2.2 创建一个模块

  • 编写mybatis的核心配置文件

DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>

    <mappers>
        <mapper resource="com/zmt/dao/UserMapper.xml"/>
    mappers>

configuration>
  • 编写mybatis工具类
//sqlSessionFactory ---> sqlSession
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static{
        try{
            //使用Mybatis第一步:获取sqlSessionFactory对象
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
   // 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
   // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    }
}

2.3 编写代码

  • 实体类
//实体类
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 + '\'' +
                '}';
    }
}
  • Dao接口
//Dao等价之后创建的Mapper,为了方便理解,现在先叫Dao
public interface UserDao {
    List<User> getUserList();
}
  • 接口实现类(由原来的UserDaoImpl转变为一个Mapper.xml配置文件)

DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.zmt.dao.UserDao">
    <select id="getUserList" resultType="com.zmt.pojo.User">
        select * from mybatis.user
    select>
mapper>

2.4 测试

注意(常见报错):

org.apache.ibatis.binding.BindingException: Type interface com.zmt.dao.UserDao is not known to the MapperRegistry.

MapperRegistry是什么?

  • 核心配置文件中注册mappers
java.lang.ExceptionInInitializerError
  • 在pom中加入这行代码
 <build>
        
        <resources>
            <resource>
                <directory>src/main/resourcesdirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
            resource>
            <resource>
                <directory>src/main/javadirectory>
                <includes>
                    <include>**/*.propertiesinclude>
                    <include>**/*.xmlinclude>
                includes>
                <filtering>truefiltering>
            resource>
        resources>
    build>
  • 将核心配置文件中,URL中userSSL的值改为userSSL=false
  • xml文件中不可以加中文注释!!!
空指针异常
  • MybatisUtils中,有两个SqlSessionFactory对象,改为sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

junit测试

  • 测试用的包,最好和项目的包一一对应,规范
public class UserDaoTest {
    @Test
    public void test(){
        //第一步:获取SqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();

        for (User user : userList) {
            System.out.println(user);
        }
        
        //方式二:不常用了,不推荐
        List<User> userList = sqlSession.selectList("com.zmt.dao.UserDao.getUserList");
        for (User user : userList) {
            System.out.println(user);
        }
        
        //关闭SqlSession
        sqlSession.close();
    }
}
  • 固定语句:
  • SqlSession sqlSession = MybatisUtils.getSqlSession();
  • UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  • sqlSession.close();

2.5 创建Mybatis程序具体步骤

  • 第一步:构建工具类MybatisUtils
  • 第二步:编写resourcer中的配置文件mybatis-config.xml
  • 第三步:编写pojo实体类,User
  • 第四步:编写接口,UserDao或UserMapper
  • 第五步:编写接口实现类,UserMapper.xml
  • 第六步:进行测试,编写test文件
  • 注:之后实体类(第三步)和工具类(第一步)几乎不会改变

3、CRUD

3.1 namespace

  • 指的是UserMapper.xml中的mapper namespace:

  • namespace中的包名,要和Dao/mapper 接口的包名一致

3.2 select

  • 查询语句
<select id="getUserById" resultType="com.zmt.pojo.User" parameterType="int">

select>
  • id:对应的namespace中的方法名

  • resultType:sql语句执行的返回值!

  • parameterType:参数类型

  • 按Id查询,测试

    @Test
    public void getUserById(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User userById = mapper.getUserById(1);

        System.out.println(userById);

        sqlSession.close();
    }

  • 对应mapper文件中的sql语句
<select id="getUserById" resultType="com.zmt.pojo.User" parameterType="int">
        select * from mybatis.user where id = #{id}
select>
  • 接口
//根据ID查询用户
    User getUserById(int id);

3.3 Insert

注意:增删改一定要提交事务

sqlSession.commit();

  • 增加一个新用户,测试
//增删改需要提交事务
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.addUser(new User(8,"卫十","123456"));

        //提交事务
        sqlSession.commit();

        sqlSession.close();
    }
  • 对应mapper文件中的sql语句

    <insert id="addUser" parameterType="com.zmt.pojo.User" >
        insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd})
    insert>
  • 接口
//插入一个用户
    int addUser(User user);

3.4 Update

  • 修改一个用户信息,测试
 @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.updateUser(new User(8,"卫十十","123456"));

        // 提交事务
        sqlSession.commit();
        sqlSession.close();
    }
  • 对应mapper文件中的sql语句
<update id="updateUser" parameterType="com.zmt.pojo.User" >
        update mybatis.user set name = #{name},pwd = #{pwd} where id = #{id}
    update>
  • 接口
//修改用户
    int updateUser(User user);

3.5 Delete

  • 根据Id删除用户,测试
    @Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        mapper.deleteUser(8);

        // 提交事务
        sqlSession.commit();
        sqlSession.close();
    }
  • 对应mapper文件中的sql语句
<delete id="deleteUser" parameterType="int">
    delete from mybatis.user where id = #{id};
delete>
  • 接口
    //删除一个用户
    int deleteUser(int id);

3.6 统一步骤

  • 第一步:编写接口
  • 第二步:编写对应mapper文件中的sql语句
  • 第三步:编写测试代码

3.7 万能的Map

  • 假设我们的实体类,或数据库中的表、字段或参数过多,我们应当考虑Map
  • 接口
 //万能的Map,不需要知道数据库中有什么,只需要查询对应字段
    int addUser2(Map<String,Object> map);
  • 对应mapper中的sql语句

    <insert id="addUser2" parameterType="map" >
        insert into mybatis.user (id,name,pwd) values (#{userId},#{userName},#{password})
    insert>
  • 测试
 @Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        Map<String, Object> map = new HashMap<String,Object>();
        map.put("userId",8);
        map.put("userName","卫十");
        map.put("password","123456");
        
        mapper.addUser2(map);

        // 提交事务
        sqlSession.commit();
        sqlSession.close();
    }
  • Map传递参数,直接在sql中取出key即可【parameter=“map”】

  • 对象传递参数,直接在sql中取出对象的属性即可【parameter=“Object”】

  • 只有一个基本类型参数的情况下,可以直接在sql中取到

  • 多个参数用Map , 或者注解

3.8 模糊查询

  • 接口
// 模糊查询
List<User> getUserLike(String value);
  • 对应mapper文件中的sql语句
<select id="getUserLike" resultType="com.zmt.pojo.User">
    select * from user where name like "%"#{value}"%"
select>
  • 测试
@Test
public void getUserLike(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);

    List<User> userList = mapper.getUserLike("%李%");

    for (User user : userList) {
        System.out.println(user);
    }

    // 提交事务
    sqlSession.commit();
    sqlSession.close();
}

模糊查询怎么写?

  • java代码执行的时候,传递通配符%%(安全,但不常用)

List userList = mapper.getUserLike("%李%");

  • 在sql拼接中使用通配符

select * from user where name like "%"#{value}"%"

你可能感兴趣的:(Mybatis学习笔记,mybatis,java)