Mybatis

文章目录[x]
  1. 1:1.1、什么是Mybatis
  2. 2:1.2、持久化
  3. 3:1.3、持久层
  4. 4:1.4、为什么需要Mybatis?
  5. 5:2.1、搭建数据库
  6. 6:2.2、创建一个模块
  7. 7:2.3、编写代码
  8. 8:2.4、测试
  9. 9:3.1、namespace
  10. 10:3.2、select Insert update Delect
  11. 11:3.3、万能Map
  12. 12:3.4、思考题

Mybatis

1、简介

1.1、什么是Mybatis

image-20201210111713469

  • 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

  • iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

如何获得Mybatis?

1.2、持久化

数据持久化

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

  • 内存:断电即失

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

  • 生活:冷藏,罐头

为什么需要持久化?

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

  • 内存太贵了

1.3、持久层

Dao层、Service层、Controller层...

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

  • 层界限十分明显

1.4、为什么需要Mybatis?

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

  • 方便

  • 传统的JDBC代码太复杂了.简化.框架.自动化

  • 不用Mybatis也可以.更容易上手.技术没有高低之分

  • 优点 :

    • 简单易学。

    • 灵活

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

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

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

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

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

Spring SpringMVC SpringBoot

2、第一个Mybatis

学习思路:搭建环境-->导入Mybatis-->编写代码-->测试!

2.1、搭建数据库

搭建数据库

image-20201210183818870

新建项目

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

  2. 删除src目录

  3. 导入maven依赖

     <dependencies>
             <!--mysql驱动-->
             <dependency>
                 <groupId>mysql</groupId>
                 <artifactId>mysql-connector-java</artifactId>
                 <version>8.0.22</version>
             </dependency>
             <!--mybatis-->
             <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
             <dependency>
                 <groupId>org.mybatis</groupId>
                 <artifactId>mybatis</artifactId>
                 <version>3.5.6</version>
             </dependency>
             <!--junit-->
             <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
                 <version>4.12</version>
                 <scope>test</scope>
             </dependency>
         </dependencies>

2.2、创建一个模块

  • 编写mybatis的核心配置文件

     <?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.cj.jdbc.Driver"/>
                     <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/>
                     <property name="username" value="root"/>
                     <property name="password" value="123456"/>
                 </dataSource>
             </environment>
         </environments>
         <mappers>
             <mapper resource="com/sajuuk/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 = new SqlSessionFactoryBuilder().build(inputStream);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
         // 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
         public static SqlSession getSqlSession() {
             return sqlSessionFactory.openSession();
         }
     }
     

2.3、编写代码

  • 实体类

     package com.sajuuk.pojo;
     
     //实体类
     public class User {
         private int id;
         private String name;
         private String password;
     
         public User() {
         }
     
         public User(int id, String name, String password) {
             this.id = id;
             this.name = name;
             this.password = password;
         }
     
         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 getPassword() {
             return password;
         }
     
         public void setPassword(String password) {
             this.password = password;
         }
     
         @Override
         public String toString() {
             return "User{" +
                     "id=" + id +
                     ", name='" + name + '\'' +
                     ", password='" + password + '\'' +
                     '}';
         }
     }
     
  • Dao接口

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

     <?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">
     <!--select查询语句-->
     <mapper namespace="org.mybatis.example.BlogMapper">
        <select id="getUserList" resultType="com.sajuuk.pojo.User">
            select * from mybatis.user
        </select>
     </mapper>

2.4、测试

注意点:

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

MapperRegistry是什么?

核心配置文件中注册mappers

  • junit测试

     @Test
     public void test(){
         //第一步: 获取SqlSession对象
         SqlSession sqlSession = MybatisUtils.getSqlSession();
     
         //方式一:getMapper
         UserDao userDao = sqlSession.getMapper(UserDao.class);
         List<User> userList = userDao.getUserList();
     
         for (User user : userList) {
             System.out.println(user);
         }
     
         //关闭SqlSession
         sqlSession.close();
     }

遇到的问题:

  1. 配置文件没有注册

  2. 绑定接口错误

  3. 方法名不对

  4. 返回类型不对

  5. Maven导出资源出错

3、CRUD

3.1、namespace

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

3.2、select Insert update Delect

选择,查询语句;

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

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

  • parameterType:参数类型!

  1. 编写接口

     public interface UserMapper {
         //查询全部用户
         List<User> getUserList();
     
         //根据ID查询用户
         User getUserByID(int id);
     
         //insert增加一个用户
         int addUser(User user);
     
         //update修改一个用户
         int updateUser(User user);
     
         //delect删除一个用户
         int delectUser(int id);
     }
  2. 编写对应的mapper中的sql语句

     <?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.sajuuk.dao.UserMapper">
         <select id="getUserList" resultType="com.sajuuk.pojo.User">
          select * from mybatis.`user`
       </select>
     
         <select id="getUserByID" parameterType="int" resultType="com.sajuuk.pojo.User">
             select * from mybatis.user where id = #{id}
         </select>
     
         <!--对象中的属性,可以直接取出来-->
         <insert id="addUser" parameterType="com.sajuuk.pojo.User" >
             insert into mybatis.user (id,name,password) values (#{id},#{name},#{password});
         </insert>
     
         <update id="updateUser" parameterType="com.sajuuk.pojo.User">
             update mybatis.user set name=#{name},password=#{password} where id=#{id};
         </update>
     
         <delete id="delectUser" parameterType="int">
             delete from mybatis.user where id=#{id};
         </delete>
     </mapper>
  3. 测试

     package com.sajuuk.dao;
     
     import com.sajuuk.pojo.User;
     import com.sajuuk.utils.MybatisUtils;
     import org.apache.ibatis.session.SqlSession;
     import org.junit.Test;
     
     import java.util.List;
     
     public class UserDaoTest {
     
         @Test
         public void test(){
             //第一步: 获取SqlSession对象
             SqlSession sqlSession = MybatisUtils.getSqlSession();
     
             //方式一:getMapper
             UserMapper userDao = sqlSession.getMapper(UserMapper.class);
             List<User> userList = userDao.getUserList();
     
             for (User user : userList) {
                 System.out.println(user);
             }
     
             //关闭SqlSession
             sqlSession.close();
         }
     
         @Test//查询一个用户
         public void getUserByID(){
             SqlSession sqlSession = MybatisUtils.getSqlSession();
     
             UserMapper mapper = sqlSession.getMapper(UserMapper.class);
     
             User user = mapper.getUserByID(1);
             System.out.println(user);
     
     
             sqlSession.close();
         }
     
         //增删改需要提交事务
         @Test//增加
         public void addUser(){
             SqlSession sqlSession = MybatisUtils.getSqlSession();
     
             UserMapper mapper = sqlSession.getMapper(UserMapper.class);
     
             int add = mapper.addUser(new User(2, "admin", "123456"));
             if(add>0){
                 System.out.println("插入成功!");
             }
     
             //提交事务
             sqlSession.commit();
     
             sqlSession.close();
         }
     
         @Test//修改
         public void updateUser(){
             SqlSession sqlSession = MybatisUtils.getSqlSession();
     
             UserMapper mapper = sqlSession.getMapper(UserMapper.class);
     
             int updateUser = mapper.updateUser(new User(1,"刘浩东","123456"));
             if(updateUser>0){
                 System.out.println("修改成功!");
             }
     
             //提交事务
             sqlSession.commit();
     
             sqlSession.close();
         }
     
         @Test//删除
         public void delectUser(){
             SqlSession sqlSession = MybatisUtils.getSqlSession();
     
             UserMapper mapper = sqlSession.getMapper(UserMapper.class);
     
             int i = mapper.delectUser(2);
     
             if(i>0){
                 System.out.println("删除成功!");
             }
             sqlSession.commit();
             sqlSession.close();
         }
     }
     

注意点:

  • 增删改需要提交事务!

3.3、万能Map

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

 //万能的Map
 int addUser2(Map<String,Object> map);
 <update id="addUser2" parameterType="map">
     insert into mybatis.user (id,name,password) values (#{userid},#{username},#{pwd});
 </update>
 @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",3);
     map.put("username","李斯浪");
     map.put("pwd","123123");
     mapper.addUser2(map);
 
     sqlSession.commit();
 
     sqlSession.close();
 }

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

对象传递数据,直接在sql中取出对象的属性即可! [parameterType="Object"]

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

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

3.4、思考题

模糊查询怎么写?

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

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

     select * from mybatis.user where name like "%"#{value}"%"
点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

Title - Artist
0:00