Mybatis入门案例--CRUD

第一个Mybatis程序

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

Mybatis官网:https://mybatis.org/mybatis-3/zh/getting-started.html

1.1、搭建环境

搭建数据库

在这里插入图片描述

新建项目

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

  2. 删除src目录

  3. 导入maven依赖

    这里的build建议先不要配置,等会会报错。

    <?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>com.kuang</groupId>
        <artifactId>mybatis-study</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <modules>
            <module>mybatis-01</module>
        </modules>
    
        <!--父工程-->
    
        <!--导入依赖-->
        <!--mysql驱动-->
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--mybatis-->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.2</version>
            </dependency>
    
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
    
        </dependencies>
    
    <build>
        <resources>
            <resource>
                <directory>${basedir}/src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
            </resource>
        </resources>
    </build>
    
    </project>
    

1.2、创建一个模块

  • 编写mybatis核心配置文件

    mybatis-config.xml

    这里的mappers也建议先不要配置,等会会报错。

    <?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">
    
    <!--conf核心配置文件-->
    <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/kuang/dao/UserMapper.xml"></mapper>
        </mappers>
    
    </configuration>
    
  • 编写mybatis工具类

    MybatisUtils.xml

    package com.kuang.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 ---> sqSession
    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();
            }
        }
    
    
       /**
        * 既然有了 SqlSessionFactory;,顾名思义,我们可以从中获得 SqlSession  的实例。
        * SqlSession 提供了在数据库执行SQL 命令所需的所有方法。
        *你可以通过 SqlSession实例来直接执行已映射的 SQL语句。
        *
        */
       public static SqlSession getSqlSession(){
           return sqlSessionFactory.openSession();
       }
    
    }
    

1.3、编写代码

  • 实体类

    User.java

    package com.kuang.pojo;
    
    /**
     *
     * alt+insert 快速构造方法快捷键
    * */
    
    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;
        }
    }
    
    
  • Dao接口

    UserDao.java

    package com.kuang.dao;
    
    import com.kuang.pojo.User;
    
    import java.util.List;
    
    public interface UserDao {
    
        List<User> getUserList();
    }
    
    
    
  • 接口实现类 由原来的UserDapImp转变为Mapper配置文件

    UserMapper.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.kuang.dao.UserDao">
        <!--id=对应的方法名   resultMap=返回的结果集-->
    <!--    <select id="getUserList" resultMap="com.kuang.pojo.User">-->
    <!--        select * from mybatis.user;-->
    <!--    </select>-->
        <select id="getUserList" resultMap="com.kuang.pojo.User">
            select * from mybatis.user;
        </select>
    </mapper>
    

1.4、测试

junit测试:

package com.kuang.dao;


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

import java.util.List;


public class UserDaoText {

    @Test
    public void Test(){
        //第一步:获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        //执行sql
        //方式一:getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList = userDao.getUserList();
        System.out.println("id\t\tname\t\tpwd");
        for (User user : userList) {
            System.out.print(user.getId()+"\t\t");
            System.out.print(user.getName()+"\t\t");
            System.out.println(user.getPwd());
        }

        //关闭sqlSession
        sqlSession.close();
    }
}

输出结果:

在这里插入图片描述

1.5、报错预警

第一个错:

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

在这里插入图片描述

MapperRegistry是什么?

核心配置文件中注册mapper

解决:

mybatis-conf.xml文件中

 <!--每一个Mapper.xml都需要在Mybatis的核心配置文件中注册-->
    <mappers>
        <mapper resource="com/kuang/dao/UserMapper.xml"></mapper>
    </mappers>

第二个错: org.apache.ibatis.builder.BuilderException

在这里插入图片描述

解决:

由于pom.xml中没有配置build

<build>
    <resources>
        <resource>
            <directory>${basedir}/src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>${basedir}/src/main/resources</directory>
        </resource>
    </resources>
</build>

第三个错误:

java.io.IOException: Could not find resource mybatis-config.xml

在这里插入图片描述

在这里插入图片描述

String resource = "mybatis-config.xml";

这是我的路径代码,可以确定路径没有错误,但还是找不到,说明IDEA根本没有扫描到resources目录下的.xmlwe文件

解决方案一:

将这段代码放入你的maven的pom.xml文件中

<build>
    <resources>
        <resource>
            <directory>${basedir}/src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>${basedir}/src/main/resources</directory>
        </resource>
    </resources>
</build>

解决方案二:

将mybatis-config.xml文件放在java目录下

在这里插入图片描述

这里提供一个错误的解决方案:
在这里插入图片描述
这样改是从类路径加载,虽然解决了mybatis-config.xml文件找不到的问题,但是你会陷入一个无尽的一个空指针异常如下图。

在这里插入图片描述

这个错误可是让我好改呀(我花了三天多也没解决)彻底疯啦……。

最后就是靠解决方案一,活下来的。

这里我也提供一个**错误的配置**,因为我就是被骗才导致我疯啦三天,之前一直以为这里没有问题。啊啊啊啊……

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <excludes>
                <exclude>**/*.properties</exclude>
                <exclude>**/*.xml</exclude>
            </excludes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>false</filtering>
        </resource>
    </resources>
</build>

2.1 CRUD

增删改查

写个CRUD拿来练手

1、namespace

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

2、select

选择,查询语句

  • id:就是namespace中的方法名
  • resultType:Sql语句执行的返回值
  • parameterType:参数类型
  • mybatis.user这是IDEA中的操作,如果IDEA没连数据库,直接写表名就可以啦。
  • #{id}, #{name}, #{pwd}这个名字要和字段名一致,但Map中可以随便起

1、编写接口

    //根据id查询用户
    User getUserById(int id);

2、编写对应的mapper中的sql语句

<!--根据ID查询用户-->
<select id="getUserById" parameterType="int" resultType="com.kuang.pojo.User">
    select * from mybatis.user where id = #{id};
</select>

3、测试

@Test
public void getUserById(){
    //获取SQLSession对象
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    User user = mapper.getUserById(1);
    System.out.println(user);

    sqlSession.close();
}

3、Insert

1、编写接口

//insert一个用户
int addUser(User user);

2、编写对应的mapper中的sql语句

<!--插入一个User-->
<insert id="addUser" parameterType="com.kuang.pojo.User">
    insert into mybatis.user(id, name, pwd) values (#{id}, #{name}, #{pwd});
</insert>

3、测试

    //增删改需要事务
    @Test
    public void addUser(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int res = mapper.addUser(new User(4, "哈哈哈", "123333"));
        if (res > 0) {
            System.out.println("插入成功!");
        }
        //提交事务
        sqlSession.commit();

        sqlSession.close();
    }

4、Update

1、编写接口

//修改用户
int updateUser(User user);

2、编写对应的mapper中的sql语句

<!--修改用户-->
<update id="updateUser" parameterType="com.kuang.pojo.User">
    update mybatis.user set name=#{name}, pwd=#{pwd} where id = #{id};
</update>

3、测试

@Test
public void updateUser(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    int res = mapper.updateUser(new User(4, "呵呵", "111111"));
    if (res > 0){
        System.out.println("更新成功");
    }
    sqlSession.commit();
    sqlSession.close();
}

5、Delete

1、编写接口

//删除一个用户
int deleteUser(int id);

2、编写对应的mapper中的sql语句

<!--删除一个用户-->
<delete id="deleteUser" parameterType="int">
    delete from mybatis.user where id = #{id};
</delete>

3、测试

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

    UserDao mapper = sqlSession.getMapper(UserDao.class);

    mapper.deleteUser(4);
	
    sqlSession.commit();

    sqlSession.close();
}

注意点:

  • 增删改查需要提交事务

    sqlSession.commit();

6、分析错误

  • ​ 标签不要匹配错
  • resource绑定mapper需要使用路径,即 /
  • 程序配置文件必须符合规范
  • NullPointerException异常
  • xml文件中乱码问题
  • maven资源没有到处问题

7、万能的Map(扩展)

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

1、编写接口

//万能的Map
int addUserMap(Map<String, Object> map);

2、编写对应的mapper中的sql语句

    <!--万能的Map插入-->
    <!--插入一个User-->
    <insert id="addUserMap" parameterType="map">
        insert into mybatis.user(id, name, pwd) values (#{userId}, #{userName}, #{password});
    </insert>

3、测试

@Test
public void addUserMap(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserDao mapper = sqlSession.getMapper(UserDao.class);

    Map<String, Object> map = new HashMap<String, Object>();

    map.put("userId",5);
    map.put("userName","hello");
    map.put("password","123456");
    mapper.addUserMap(map);

    sqlSession.commit();

    sqlSession.commit();
}

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

对象传递参数,直接在对象中取对象的属性即可!【parameterType=“Object”】

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

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

8、思考题

模糊查询怎么写?

1、java执行代码的时候,传递通配符% %

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

2、在SQL拼接中使用通配符!

select * from mybatis.user 	where name like "%"#{value}"%"
原创文章 76 获赞 97 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43671437/article/details/105229243