Mybatis入门、配置及搭建增删改查demo

Mybatis

1. 简介

1.1 什么是Mybatis

​ MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

配置Mybatis:

  1. mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。

  2. 如果使用Maven构建项目则将依赖配置到pom.xml文件中。

    依赖搜索网站:

    https://mvnrepository.com/search?q=mybatis

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    
  3. 官方文档:https://mybatis.org/mybatis-3/zh/getting-started.html

1.2 持久化

数据持久化

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

为什么需要持久化?

由于内存断电即失,有些对象,不能让他丢掉。

1.3 持久层

Dao层,Service层,Controller层

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

2.第一个Mybatis程序

思路:搭建环境–>导入Mybatis–>编写代码–>测试

2.1 搭建环境

1.搭建数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PXGZ5r4x-1591430014169)(C:\Users\dell\Desktop\技术栈\JAVA\Mybatis\Mybatis.assets\image-20200409192623831.png)]

  1. 创建项目
  2. 添加依赖
<!--导入依赖-->
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

2.2 创建模块(配置)

新建一个moudle

  1. 编写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?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>
    <!--    每个Mapper.xml都需要在Mybatis核心配置文件中注册-->
        <mappers>
            <mapper resource="com/dao/UserDao.xml"/>
        </mappers>
    </configuration>
    
  2. 编写mybatis工具类

    MybatisUtils

    package com.utils;
    
    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;
    
    //sqlSessionFactory
    public class MybatisUtils {
        private  static SqlSessionFactory sqlSessionFactory;
        static {
            try {
                // 第一步 必备
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
        // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
        // 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。例如:
        public  static SqlSession getSqlSession(){
            return sqlSessionFactory.openSession();
        }
    }
    
    

2.3 编写代码

  1. 实体类

    package com.pojo;
    public class User {
        private int id;
        private String name;
        private  String pwd;
        public User(){
        }
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", pwd='" + pwd + '\'' +
                    '}';
        }
        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;
        }
    }
    
    
  2. dao接口

    Userdao.java

    package com.dao;
    import com.pojo.User;
    import java.util.List;
    public interface UserDao {
        List<User> getUserList();
    }
    
    
  3. 实现接口的类由UserDaoimp转换成为一个.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">
    <!--    namespace 绑定一个对应的dao/mapper接口-->
    <mapper namespace="com.dao.UserDao">
    <!--    select查询语句  resultType返回结果集-->
        <select id="getUserList" resultType="com.pojo.User">
            select * from mybatis.user
        </select>
    </mapper>
    

2.3 测试

package com;

import com.dao.UserDao;
import com.pojo.User;
import com.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserDaoTest {
    @Test
    public void test(){
        //第一步 通过MybatisUtils工具类获取SqlSession对象
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        //执行sql
        UserDao userDao=sqlSession.getMapper(UserDao.class);
        List<User> userList=userDao.getUserList();
        //遍历user表
        for (User user:userList){
            System.out.println(user);
        }
        //关闭 sqlSession
        sqlSession.close();
    }
}

2.4 常见错误

错误1:

org.apache.ibatis.binding.BindingException: 

Type interface com.dao.UserDao is not known to the MapperRegistry.

原因:没有在Mybatis核心配置文件

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

错误2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X15LW9BN-1591430014172)(C:\Users\dell\Desktop\技术栈\JAVA\Mybatis\Mybatis.assets\image-20200410135615229.png)]

java.lang.ExceptionInInitializerError
at com.UserDaoTest.test(UserDaoTest.java:15)

原因:在maven 中没有xml文件没有生效(在target/classes目录中没有此配置文件)

解决:在resources目录下 创建一个跟java目录一样的文件夹把xml文件放在resources的子目录下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sSuLhOLR-1591430014173)(C:\Users\dell\Desktop\技术栈\JAVA\Mybatis\Mybatis.assets\image-20200410135933351.png)]

此时会自动在target/classes目录中生成该配置文件

注意3:

namespace 中 的包名要跟Dao/Mapper中的接口包名一致。

2.5Mybatis 环境搭建总结

搭建环境–>导入Mybatis–>编写代码–>测试

搭建环境

  1. 搭建数据库

  2. 创建项目(maven)

  3. 在pom.xml中添加依赖

    依赖搜索网站:https://mvnrepository.com/search?q=mybatis

导入Mybatis

  1. 创建一个新的模块
  2. 创建mybatis核心配置文件 mybatis-config.xml
  3. 编写mybatis工具类

编写代码

  1. 实体类创建
  2. dao层接口
  3. 实现dao层接口的配置文件(实现接口的类由UserDaoimp转换成为一个.xml文件)

测试类及常见问题

  1. 测试类 中不要忘记关闭流
  2. .xml文件可能会存在不生效的问题,解决:在resources目录下 创建一个跟java目录一样的文件夹把xml文件放在resources的子目录下

3.增删改查

增删改需要提交事务

  • namespace 绑定一个对应的dao/mapper接口

  • select查询语句 resultType返回结果集

  • id:对应的namespace中的方法名;

  • resultType :sql语句执行的返回类型

  • parameterType :参数类型

1.UserDao/Mapper接口类:

UserDao.java

public interface UserDao {
    List<User> getUserList();
    //查询
    User getUserById(int id);
    //增加
    int addUser(User user);
    //删除
    int deleteUser(int id);
    //修改
    int updateUser(User user);
}

2.UserDao.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">
<!--    namespace 绑定一个对应的dao/mapper接口-->
<mapper namespace="com.dao.UserDao">
<!--    select查询语句  resultType返回结果集-->
    <select id="getUserList" resultType="com.pojo.User">
        select * from mybatis.user
    </select>
<!--    根据id查询-->
    <select id="getUserById" parameterType="int" resultType="com.pojo.User">
        select * from mybatis.user where id = #{id};
    </select>
<!--    增加一个用户-->
    <insert id="addUser" parameterType="com.pojo.User">
        insert into mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd});
    </insert>
<!--    修改一个用户-->
    <update id="updateUser" parameterType="com.pojo.User">
       update mybatis.user set name=#{name},pwd=#{pwd} where id= #{id};
    </update>
<!--    删除一个用户-->
    <delete id="deleteUser" parameterType="com.pojo.User">
        delete from mybatis.user where id=#{id};
    </delete>
</mapper>

3.测试类

public class UserDaoTest {

    //查询用户信息
    @Test
    public void test(){
        //第一步 通过MybatisUtils工具类获取SqlSession对象
        SqlSession sqlSession= MybatisUtils.getSqlSession();
        try {
            //执行sql
            UserDao userDao=sqlSession.getMapper(UserDao.class);
            List<User> userList=userDao.getUserList();
            //遍历user表
            for (User user:userList){
                System.out.println(user);
            }
        }
        finally {
            //关闭 sqlSession
            sqlSession.close();
        }
    }


    //根据id查询用户信息
    @Test
    public void getUserByid(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao dao = sqlSession.getMapper(UserDao.class);

        User user = dao.getUserById(2);
        System.out.println(user);
        sqlSession.close();
    }


    //增加用户
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao dao = sqlSession.getMapper(UserDao.class);

        int add = dao.addUser(new User(4, "张三", "12345"));
        //提交事务
        sqlSession.commit();
        sqlSession.close();
    }


    //删除用户
    @Test
    public void deleteUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao dao = sqlSession.getMapper(UserDao.class);

        int i = dao.deleteUser(3);
        sqlSession.commit();
        sqlSession.close();
    }


    //修改用户信息
    @Test
    public void updateUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao dao = sqlSession.getMapper(UserDao.class);
        dao.updateUser(new User(2,"李四","12345"));
        sqlSession.commit();
        sqlSession.close();


    }
}

4.万能Map

如果实体类或者数据库中的表,字段或者参数过多,应考虑使用Map!

用Map 避免了用实体类(实体类会调用构造方法,所有传递参数是固定的),即想传几个参数就传递几个参数

接口:

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

xml:

<!--对象中的属性,可以直接取出来 传递map的key-->
<insert id="addUser2" parameterType="map">
    insert into mybatis.user(id,name) values (#{id},#{name});
</insert>

测试类:

//使用map增加
@Test
public void mapAddUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserDao dao = sqlSession.getMapper(UserDao.class);

    Map<String,Object>map=new HashMap<String, Object>();
    map.put("id",6);
    map.put("name","map增加");
    dao.addUser2(map);
    sqlSession.commit();
    sqlSession.close();
}

5.模糊查询

  1. java代码执行的时候,传递通配符
  2. sql拼接的时候写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9McUyAmB-1591430014176)(C:\Users\dell\Desktop\技术栈\JAVA\Mybatis\Mybatis.assets\image-20200410200922863.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXQAgBqd-1591430014177)(C:\Users\dell\Desktop\技术栈\JAVA\Mybatis\Mybatis.assets\image-20200410201128846.png)]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章