首页 > 其他 > 详细

第79天学习打卡(Mybatis 持久化 持久化层 第一个Mybatis程序 CRUD)

时间:2021-03-28 23:57:55      阅读:32      评论:0      收藏:0      [点我收藏+]

Mybatis

mybatis:下载地址https://github.com/mybatis/mybatis-3/releases

maven仓库:https://mvnrepository.com/search?q=mybatis

 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
 <dependency>
     <groupId>org.mybatis</groupId>
     <artifactId>mybatis</artifactId>
     <version>3.5.6</version>
 </dependency>
 ?

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搭建环境

搭建数据库:

 CREATE DATABASE `mybatis`;
 USE`mybatis`;
 ?
 CREATE TABLE`user`(`mybatis`
 `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,‘李四‘,‘123890‘)

新建项目:

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

2.删除src目录

3,导入maven依赖

 <?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>
     <dependencies>
 <!--   mysql驱动-->
     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>8.0.23</version>
     </dependency>
 <!--junit-->
     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>4.11</version>
         <scope>test</scope>
     </dependency>
 <!--mybatis-->
     <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.5.3</version>
     </dependency>
 </dependencies>
 ?
     <!--在build中配置resources,来防止我们资源导出的失败的问题-->
     <build>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
                 <includes>
                     <include>**/*.properties</include>
                     <include>**/*.xml</include>
                 </includes>
                 <filtering>true</filtering>
             </resource>
             <resource>
                 <directory>src/main/java</directory>
                 <includes>
                     <include>**/*.properties</include>
                     <include>**/*.xml</include>
                 </includes>
                 <filtering>true</filtering>
             </resource>
         </resources>
     </build>
 ?
 ?
 ?
 ?
 </project>

 

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>
     <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=utf8"/>
                 <property name="username" value="root"/>
                 <property name="password" value="123456"/>
             </dataSource>
         </environment>
     </environments>
     <mappers>
         <mapper resource="com/kuang/dao/UserMapper.xml"/>
     </mappers>
 </configuration>

注意这两行代码:


  • <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

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

  • 编写mybatis工具类

     package com.kuang.utils;
     ?
     import org.apache.ibatis.io.Resources;
     import org.apache.ibatis.session.SqlSession;
     import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     import org.apache.ibatis.session. SqlSessionFactory ;
     ?
     ?
     import java.io.IOException;
     import java.io.InputStream;
     ?
     //工具类
     //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(){
             return sqlSessionFactory.openSession();
     
        }
     ?
     ?
     }
     ?

    2.3编写代码

  • 实体类

     package com.kuang.pojo;
     ?
     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接口

     package com.kuang.dao;
     ?
     import com.kuang.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">
     ?
     <!--namespace=绑定一个对应的Dao/Mapper接口-->
     <mapper namespace="com.kuang.dao.UserDao">
         <select id="getUserList" resultType="com.kuang.pojo.User" >
            select * from mybatis.user;
         </select>
     </mapper>

     

    2.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 UserDaoTest {
         @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();
        }
     }
     ?
     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 UserDaoTest {
         @Test
         public void test(){
             //获得sqlSession对象
             SqlSession sqlSession = MybatisUtils.getSqlSession();
     ?
             //方式一:getMapper
     //       UserDao userDao = sqlSession.getMapper(UserDao.class);
     //       List<User> userList = userDao.getUserList();
     ?
             //方式二:
             List<User> userList = sqlSession.selectList("com.kuang.dao.UserDao.getUserList");
     ?
             for (User user : userList) {
                 System.out.println(user);
            }
             //关闭SqlSession
             sqlSession.close();
     ?
     ?
     ?
        }
     }
     ?

     

    可能会遇到的问题:

    1.配置文件没有注册

    2.绑定接口错误

    3.方法名不对

    4.返回类型不对

    5.Maven导出资源问题

     

     

技术分享图片

测试修改版本:

 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 UserDaoTest {
     @Test
     public void test(){
         //获得sqlSession对象
         SqlSession sqlSession = MybatisUtils.getSqlSession();
 ?
         try {
             sqlSession = MybatisUtils.getSqlSession();
             //方式一:getMapper
 //       UserDao userDao = sqlSession.getMapper(UserDao.class);
 //       List<User> userList = userDao.getUserList();
 ?
             //方式二:
             List<User> userList = sqlSession.selectList("com.kuang.dao.UserDao.getUserList");
 ?
             for (User user : userList) {
                 System.out.println(user);
            }
 ?
        }catch (Exception e){
             e.printStackTrace();
 ?
        }finally {
 ?
             //关闭SqlSession
             sqlSession.close();
 ?
 ?
        }
 ?
    }
 }
 ?

3.CRUD

1.namespace

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

2. select

选择,查询语句;

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

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

  • parameterType:参数类型!

1.编写接口

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

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

     <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 = MybatisUtils.getSqlSession();
         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
         User user = mapper.getUserById(1);
         System.out.println(user);
 ?
         sqlSession.close();
    }

 

3. Insert

     @Test
     public void addUser(){
         SqlSession sqlSession = MybatisUtils.getSqlSession();
         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
         int res = mapper.addUser(new User(4, "哈哈", "123333"));
         if (res>0){
             System.out.println("插入成功!");
        }
 ?
         //提交事物
         sqlSession.commit();
 ?
         sqlSession.close();
 ?
    }

 

4.update

  @Test
     public void updateUser(){
         SqlSession sqlSession = MybatisUtils.getSqlSession();
         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 ?
         mapper.updateUser(new User(4,"doudou","123123"));
 ?
         sqlSession.commit();
         sqlSession.close();
    }

 

5.Delete

   @Test
     public void deleteUser(){
         SqlSession sqlSession = MybatisUtils.getSqlSession();
         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
         mapper.deleteUser(4);
         sqlSession.commit();
         sqlSession.close();
    }

完整代码:

UserMapper:

 package com.kuang.dao;
 ?
 import com.kuang.pojo.User;
 ?
 import java.util.List;
 ?
 public interface UserMapper {
 ?
     //查询全部用户
     List<User> getUserList();
 ?
     //根据ID查询用户
     User getUserById(int id);
 ?
     //insert一个用户名
     int addUser(User user);
 ?
     //修改用户
     int updateUser(User user);
 ?
     //删除一个用户
     int deleteUser(int id);
 ?
 }
 ?

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">
 ?
 ?
 <mapper namespace="com.kuang.dao.UserMapper">
     <select id="getUserList" resultType="com.kuang.pojo.User">
        select * from mybatis.user
     </select>
 ?
     <select id="getUserById" parameterType="int" resultType="com.kuang.pojo.User">
 select * from mybatis.user where id = #{id}
     </select>
 ?
     <insert id="addUser" parameterType="com.kuang.pojo.User">
        insert into mybatis.user(id,`name`,pwd) values(#{id},#{name},#{pwd});
     </insert>
 ?
     <update id="updateUser" parameterType="com.kuang.pojo.User">
        update mybatis.user set `name`=#{name},pwd=#{pwd} where id = #{id}
     </update>
 ?
     <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id = #{id};
     </delete>
 </mapper>

User

 package com.kuang.pojo;
 ?
 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 + ‘\‘‘ +
                 ‘}‘;
    }
 }
 ?

MybatisUtils

 package com.kuang.utils;
 ?
 import org.apache.ibatis.io.Resources;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 import org.apache.ibatis.session. SqlSessionFactory ;
 ?
 ?
 import java.io.IOException;
 import java.io.InputStream;
 ?
 //工具类
 //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 命令所需的所有方法。
     public static SqlSession getSqlSession(){
         return sqlSessionFactory.openSession();
 ?
    }
 ?
 ?
 }
 ?

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>
     <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=utf8"/>
                 <property name="username" value="root"/>
                 <property name="password" value="123456"/>
             </dataSource>
         </environment>
     </environments>
     <mappers>
         <mapper resource="com/kuang/dao/UserMapper.xml"/>
     </mappers>
 </configuration>

UserDaoTest

 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 UserDaoTest {
     @Test
     public void test(){
         //获得sqlSession对象
         SqlSession sqlSession = MybatisUtils.getSqlSession();
 ?
         try {
             sqlSession = MybatisUtils.getSqlSession();
             //方式一:getMapper
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
       List<User> userList = userDao.getUserList();
 ?
             //方式二:
          //   List<User> userList = sqlSession.selectList("com.kuang.dao.UserDao.getUserList");
 ?
             for (User user : userList) {
                 System.out.println(user);
            }
 ?
        }catch (Exception e){
             e.printStackTrace();
 ?
        }finally {
 ?
             //关闭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 res = mapper.addUser(new User(4, "哈哈", "123333"));
         if (res>0){
             System.out.println("插入成功!");
        }
 ?
         //提交事物
         sqlSession.commit();
 ?
         sqlSession.close();
 ?
    }
 ?
     @Test
     public void updateUser(){
         SqlSession sqlSession = MybatisUtils.getSqlSession();
         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
 ?
         mapper.updateUser(new User(4,"doudou","123123"));
 ?
         sqlSession.commit();
         sqlSession.close();
    }
 ?
     @Test
     public void deleteUser(){
         SqlSession sqlSession = MybatisUtils.getSqlSession();
         UserMapper mapper = sqlSession.getMapper(UserMapper.class);
         mapper.deleteUser(4);
         sqlSession.commit();
         sqlSession.close();
    }
 }
 ?

 

注意点:

  • 增删改需要提交事务。

6.分析错误

  • 标签不要匹配错

  • resource绑定mapper,需要使用路径要用/

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

     

  • 程序配置文件必须符合规范!

  • NullPointerException,没有注册到资源!

  • 输出的xml文件中存在中文乱码问题!

  • 输出的xml文件中存在中文乱码问题!

  • maven资源没有导出问题!

     

    7.万能Map

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

      //万能的Map
         int addUser2(Map<String,Object> map);
     ?
     <!--对象中的属性,可以直接取出来  传递map的key-->
     <insert id="addUser" parameterType="com.kuang.pojo.User">
            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",5);
             map.put("userName","Hello");
             map.put("passWord","2222333");
     ?
             mapper.addUser2(map);
             sqlSession.close();
        }

     

Map传递参数,直接在sql中取出key即可!【parameterType="map"】 对象传递参数,直接在sql中取对象的属性即可!【parameterType="Object"】 只有一个基本类型参数的情况下,可以直接在sql中取到!

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

8.思考题

模糊查询怎么写?

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

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

2.在sql拼接中使用通配符

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

 

第79天学习打卡(Mybatis 持久化 持久化层 第一个Mybatis程序 CRUD)

原文:https://www.cnblogs.com/doudoutj/p/14589985.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!