MyBatis简介与CRUD

MyBatis

环境:

  • JDK1.8
  • Mysql 5.7
  • maven 3.6.1
  • IDEA

回顾:

  • JDBC
  • Mysql
  • java基础
  • Maven
  • Junit

框架:配置文件的最好学习方式。最好是:看官网文档;

1、简介

1.1、什么是Mybatis

MyBatis简介与CRUD

  • MyBatis 是一款优秀的持久层框架
  • 它支持自定义 SQL、存储过程以及高级映射。
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
  • MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了[google code](https://baike.baidu.com/item/google code/2346604),并且改名为MyBatis 。
  • 2013年11月迁移到Github

如何获得Mybatis?

  • maven仓库:
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

1.2、持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和瞬时状态转化的过程
  • 内存:断电即失
  • 数据库(jdbc),io文件持久化。
  • 生活:冷藏、罐头。

为什么我们需要持久化?

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

  • 内存太贵了

1.3、持久层

Dao层,Service层,Controller层,View层....

  • 完成持久化工作的代码块
  • 层界限十分明显。

1.4、为什么需要MyBatis?

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

  • 方便。

  • 传统的JDBC代码太复杂了,简化,框架。

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

  • 优点:

    • 简单易学。
    • 灵活。
    • sql和代码的分离,提高了可维护性。
    • 提供映射标签,支持对象与数据库的orm字段关系映射。
    • 提供对象关系映射标签,支持对象关系组建维护。
    • 提供xml标签,支持编写动态sql。

最重要的一点:使用的人多!

Spring SpringMVC SpringBoot SpringCloud

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,'李四','654321'),(4,'刘畅','19960503'),(5,'胡秀睿','19980217')

创建项目

新建项目

  1. 新建一个普通的maven项目

  2. 删除src目录

  3. 导入maven依赖(上面所说的mysql驱动mybatisjunit

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <!--父工程-->
        <groupId>org.example</groupId>
        <artifactId>Mybatis-Study</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--导入依赖-->
        <dependencies>
            <!--mysql驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.49</version>
            </dependency>
            <!--mybatis-->
            <!--https://mybatis.org/mybatis-3/zh/getting-started.html-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.7</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>3.8.2</version>
                <scope>test</scope>
            </dependency>
    
        </dependencies>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
    </project>
    

2.2、创建一个模块

  • 编写mybatis的核心配置文件,文件名必须是:mybatis-config.xml

    <?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核心配置文件-->
    <configuration>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?userSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
    
    
    </configuration>
    
  • 编写Java工具类,用来获得sqlSession。(其是由sqlSessionFactory生产的,而sqlSessionFactory是由sqlSessionFactoryBuilder创建的。其需要调用其build()方法,传入一个InputStream,而这个输入流对象是使用ibatis的Resources类getResourcesAsStream(resource)获得的。这个resourcemybatis-config.xml即上述核心配置文件的地址。

    public class MybatisUtils {
        private static SqlSessionFactory sqlSessionFactory;
    
        static{
            try{
                // 使用Mybatis第一步:获取sqlSessionFactory对象
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    
    }
    

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接口(Data Access Object)

    public interface UserMapper {
        List<User> getUserList();
    }
    
  • 接口实现类由原来的UserDaoImpl转变为一个Mapper配置文件。

    原(例):

    public class UserDaoImpl implements UserMapper{
        @Override
        public List<User> getUserList() {
            //执行sql语句
            String sql = "select * from mybatis.user";
            //结果集 ResultSet
    
            return null;
        }
    }
    

    现在配置:

    <?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">
    
    <!--namespace=绑定一个对应的DAO/MAPPER接口-->
    <mapper namespace="com.dogeleft.dao.UserMapper">
        <!--select查询语句-->
        <select id="getUserList" resultType="com.dogeleft.pojo.User">
            select * from mybatis.user
        </select>
    </mapper>
    

2.4、测试

注意点:

错误1:org.apache.ibatis.binding.BindingException: Type interface com.dogeleft.dao.UserDao is not known to the MapperRegistry.

解决方法:在mybatis核心配置文件中去添加mapper。

MapperRegistry

即要在核心配置文件中注册mappers

错误2:资源过滤问题,在写MybatisConfig.xml中的mapper,注册Mapper的时候。resource的xml路径,在target生成目录中是被过滤掉的。

解决方法:要在maven的配置文件pom.xml,在build中配置resources,来防止我们资源导出失败的问题。

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                
            </resource>
        </resources>
    </build>
  • junit测试

    原来是要获取preparestatement。现在是去获取sqlSession

    public class UserDaoTest {
        @Test
        public void test(){
            // 第一步:获得sqlSession对象
            SqlSession sqlSession = MybatisUtils.getSqlSession();
    
            //  执行SQL
            // 方式一:getMapper
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = mapper.getUserList();
    
            for(User user : userList){
                System.out.println(user);
            }
    
            sqlSession.close();
    
        }
    }
    

    可能会遇到的问题:

    1. 配置文件没有注册
    2. 绑定接口错误
    3. 方法名不对
    4. 返回类型不对
    5. Maven导出资源问题

总结

  1. mybatis核心配置文件

    即配置主题

    下面是

    一个enviroment中有:

    • <property中 name=drive、url、username、password>
    • 下面还要配置Mappers
  2. mybatis工具类

    核心的三个类对象:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。

  3. pojo实体类

    数据的实体,对应于数据库中的字段

  4. dao接口

    data access object操作接口,定义了操作数据库的方法,需要daoImpl或mapper.xml去实现

  5. dao的mapper.xml

    (替代了数据操作接口的实现类,通过配置文件来写sql,在其中实现dao的接口方法)

  6. 测试

  7. 还有额外的需要配置一下maven

3、CRUD

1、namespace

namespace中的包名要和Dao/Mapper接口的包名一致!

而下面标签中的id即具体接口中的方法名。

2、select

选择,查询语句;

  • id:就是对应的namespace中的方法名;
  • resultType:Sql语句执行的返回值!
  • parameterType:参数类型!
  1. 编写接口

    public interface UserMapper {
        List<User> getUserList();
        int insertUser(User user);
        int updateUser(User user);
        int deleteUser(int id);
    
        int updateUserId(int id);
    }
    
  2. 编写对应的mapper中的sql语句

    <mapper namespace="com.dogeleft.dao.UserMapper">
        <!--select查询语句-->
        <select id="getUserList" resultType="com.dogeleft.pojo.User">
            select * from mybatis.user
        </select>
    </mapper>
    
  3. 测试

    public void test(){
            SqlSession sqlSession;
    
    
            // 第一步:获得sqlSession对象
            sqlSession = MybatisUtils.getSqlSession();
    
            //  执行SQL
            // 方式一:getMapper
                UserMapper mapper = sqlSession.getMapper(UserMapper.class);
                List<User> userList = mapper.getUserList();
    
                // 方式二:
    //        List<User> userList = sqlSession.selectList("com.dogeleft.dao.UserDao.getUserList");
    
                for(User user : userList){
                    System.out.println(user);
                }
    
            sqlSession.close();
        }
    

3、insert

<insert id="insertUser" parameterType="com.dogeleft.pojo.User">
        insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd});
</insert>

4、update

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

<update id="updateUserId" >
        update mybatis.user set id=#{id} where id=6;
</update>

5、delete

<delete id="deleteUser">
        delete from mybatis.user where id=#{id};
</delete>

注意点:

  • 增删改需要提交事务!

6、分析错误

  • 标签不要匹配错
  • resource绑定mapper,需要使用路径!
  • 程序配置文件必须符合规范!
  • NullPointerException,没有注册到资源!
  • 输出的xml文件中存在中文乱码问题!
  • maven资源没有导出问题!

7、万能Map

假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map!

Mapper类中的方法接口

int addUser2(Map<String,Object> map);

XML实现该接口

   <!-- 好处在于可以根据自己的需要更改values中,存储进去的字段了-->
	<insert id="addUser2">
        insert into mybatis.user(id,name,pwd) values(#{userid},#{username},#{password});   
    </insert>

Java测试类

    @Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("userid",2);
        map.put("username","胡秀睿");
        map.put("password","123456789");
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        mapper.addUser2(map);
        sqlSession.commit();
        sqlSession.close();
    }

Map传递传递参数,直接在sql中取出key即可! 【parameterType="map"】

对象传递参数,直接在sql中取对象的属性即可!【parameterType="Obejct"】

只有一个基本类型参数的情况下,可以直接在sql中取到!【可以省略int】

多个参数用map或者注解!

8、思考题

模糊查询怎么写?

  1. Java代码执行的时候,传递通配符% %

    List<User> userList = mapper.getUserLike("%李%");
    
  2. 在sql拼接中使用通配符!

    <select id="getUserLike" resultType="com.dogeleft.pojo.User">
        select * from user where name like "%"#{value}"%"
    </select>
上一篇:【硬刚ES】ES基础(三)文档的基本 CRUD 与批量操作


下一篇:吐槽 | 做增删改查有前途么?