Mybatis学习笔记

Posted Vodka~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis学习笔记相关的知识,希望对你有一定的参考价值。

1.持久化:
*持久化就是将程序的数据在持久状态和瞬时状态转化的过程。
*内存(某些):断电即失
*数据库(jdbc),io文件持久化
*生活:冷藏食物

2.持久化的原因:
*有些对象,不能丢失
*内存珍贵

3.持久层:
*Data access object层, service层,controller层。。。
特点:*完成持久化工作的代码块
*层界限十分明显

4.为什么需要Mybatis?
*将数据存入到数据库中。
*方便,简化了传统jdbc代码,框架,自动化。
*不用mybatis也可以,技术没有高低之分。
优点:
*灵活,sql语句和代码分离,提高了可维护性。
*提供映射标签,支持对象与数据库的orm字段关系映射。
*提供对象关系映射标签,支持对象关系组件维护
*提供xml标签,支持编写动态sql。

5.Mybatis程序:
- 创建数据库表时数据存储引擎 engine两种:engine=innodb和engine=myisam。
一, myisam是isam的新版本,默认类型。是存储记录和文件的标准类型,支持全文搜索,可以被压缩,与其他引擎相比,有检查和修复表格 的大部分工具,不支持事务,不支持外键。强调的是性能,执行速度比较快,可以在不同的系统中迁移。ISAM是一个数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。两个主要不足之处在于,它不支持事务处理,也不能够容错:如果硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,mysql能够支持这样的备份应用程序

二,innodb,支持事务处理等高级处理,命令执行错误时,可以回滚数据,支持外键,如果执行大量的select和update语句,出于性能考虑,使用innodb是最好的选择。

三,修改表的引擎类型:ALTER TABLE tablename ENGINE = MyISAM

6.搭建环境:
-创建数据库,表,并输入数据
-新建项目:
-新建一个普通的maven项目
-删除掉父工程的src目录,子工程里面再创建新的src目录
-导入maven依赖

<!--导入依赖-->
<dependencies>
<!--    mysql驱动  -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
<!--    mybatis   -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
<!--  junit   -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>
 -创建一个模块:
      1.编写mybatis的核心配置文件(去官网找):XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源  
      (DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
      2.编写mybatis工具类
      3.实体类
      4.Dao接口
      5.接口实现类
<?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/databaseName?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
                <property name="username" value="vodka"/>
                <property name="password" value="xxxxxx"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

//utils.MybatisUtil
package vodka.utils;
import jdk.internal.loader.Resource;
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;

/**
 * @author Vodka
 * @date 2021/08//17:27
 */

public class MybatisUtils 
    private static SqlSessionFactory ssf;  //定义全局工厂变量
    //SqlSessionFactory --> SqlSession ,该工厂对象只创建一次就就够了,所以用static
    static
        try 
            //使用配置好的Mybatis文件获取SqlSessionFactory对象
            String resource = "mybatis-config-xml.tld";
            InputStream is = Resources.getResourceAsStream(resource);
            ssf = new SqlSessionFactoryBuilder().build(is);
         catch (Exception e) 
            e.printStackTrace();
        
    

    //有了SqlSessionFactory之后,就可以创建SqlSession实例,该实例包含了所有面向数据库执行sql命令的方法
    private static  SqlSession  HaveSqlSession()
        return ssf.openSession();
    




//entity.UserInfo
package vodka.entity;

/**
 * @author Vodka
 * @date 2021/08//17:47
 */
public class UserInfo 
    private String UserName;
    private String UserAge;
    private String Password;
    private String UserAccount;

    public String getUserName() 
        return UserName;
    

    public void setUserName(String userName) 
        UserName = userName;
    

    public String getUserAge() 
        return UserAge;
    

    public void setUserAge(String userAge) 
        UserAge = userAge;
    

    public String getPassword() 
        return Password;
    

    public void setPassword(String password) 
        Password = password;
    

    public String getUserAccount() 
        return UserAccount;
    

    public void setUserAccount(String userAccount) 
        UserAccount = userAccount;
    

    @Override
    public String toString() 
        return "UserInfo" +
                "UserName='" + UserName + '\\'' +
                ", UserAge='" + UserAge + '\\'' +
                ", Password='" + Password + '\\'' +
                ", UserAccount='" + UserAccount + '\\'' +
                '';
    




//Dao接口
public interface UserMapper 
    //接口包含各种数据库相应操作的方法
    List<UserInfo> getUserlist();


//由原来的接口实现类,变为Mapper配置文件
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="vodka.mapper.UserMapper">
<!--   id指向Dao接口相应的方法,并且在这里重写   -->
    <select id="getUserList" resultType="vodka.entity.UserInfo">
        select * from Userinfo
    </select>
</mapper>


!!!!!!注意点:
一. maven由于约定大于配置,当自己写配置文件时,会遇到无法被导出或生效的问题(因为maven只会执行src/main/java/中的java代码,而xml等资源只会在resoures目录下找,这时就需要自行配置),解决方案,在pom配置文件中添加代码:
   <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

二:org.apache.ibatis.binding.BindingException: Type interface vodka.mapper.UserMapper is not known to the MapperRegistry.
解决方案: 
在mybatis-config.xml文件加相应的映射文件路径
 <!--        三种映射方式:
          1.<mapper resource="com/xxx/mapper/UserMapper.xml"/>
          2.<mapper class="com.xxx.mapper.UserMapper.xml"/>
-->
<!--        3.自动扫描包内的Mapper接口与配置文件 -->
        <package name="com.xxx.mapper"/>


//UserMapperTest.java
    public  void test()
        try
            //从SqlSessionFactory中获取数据库的Session连接
          ss = MybatisUtils.HaveSqlSession();
//       方式一:getMapper
            UserMapper UM = ss.getMapper(UserMapper.class);
            List<UserInfo> UI = UM.getUserlist();
            for(UserInfo item: UI)
                System.out.println(item);
            
         catch (Exception e)
            e.printStackTrace();
        finally
            //      用完关闭
            ss.close();
        
       

    


三:方法名不对,接口名不对应,返回类型不对

!!!!关于遇到Cause: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 51 字节的 UTF-8 序列的字节 1 无效。的问题
解决方案:在实现接口类的Mapper.xml文件中,把下面这个改一改
<?xml version="1.0" encoding="UTF-8"?>
改为:
<?xml version="1.0" encoding="UTF8"?>

7.CRUD:
*namespace:
-namespace中的包名要与Dao/mapper接口的包名一致
*select:
-选择查询语句:
id: 就是对应命名空间(Dao接口实现类,或者说mapper) 中相应的方法名
resultType: Sql语句执行的返回值
parameter:Dao方法的参数类型

<--UserMapper.xml -->
<?xml version="1.0" encoding="UTF8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="vodka.mapper.UserMapper">
<!--    查询全部用户-->
    <select id="getUserList" resultType="vodka.entity.UserInfo">
        select * from userinfo;
    </select>
<!--    根据账号查询一个用户-->
    <select id="getOneUser" parameterType="string" resultType="vodka.entity.UserInfo">
        select * from userinfo
        where userAccount = #id;
    </select>
<!--    添加用户-->
    <insert id="AddUserInfo" parameterType="vodka.entity.UserInfo">
         insert into userinfo (UserAccount,UserName,UserAge,UserPassword)values(#UserAccount,#UserName,#UserAge,#UserPassword);
    </insert>
<!--    删除用户-->
    <delete id="DeleteUserInfo" parameterType="string">
        delete from userinfo where
        UserAccount = #Account;
    </delete>
<!--    修改用户信息-->
    <update id="UpdateUserInfo" parameterType="vodka.entity.UserInfo">
        update userinfo
        set  UserAge = UserAge + #UserAge,UserName = #UserName,UserPassword = #UserPassword
        where UserAccount = #UserAccount
    </update>
</mapper>




//UserDao interface
public interface UserMapper 
    //接口包含各种数据库相应操作的方法
//    查询全部用户数据
    List<UserInfo> getUserList();
//    根据账号查询用户
    UserInfo getOneUser(String id);

//    添加用户
    int AddUserInfo(UserInfo user);

//    删除用户
    int DeleteUserInfo(String Account);

//    修改用户
    int UpdateUserInfo(UserInfo UI);





public class UserMapperTest 
      //从SqlSessionFactory中获取数据库的Session连接
    SqlSession ss = MybatisUtils.HaveSqlSession();

    @Test
    public  void test()
        try
//       方式一:getMapper
            UserMapper UM = ss.getMapper(UserMapper.class);

//          测试获取全部用户的数据
            List<UserInfo> UI = UM.getUserList();
            for(UserInfo item: UI)
                System.out.println(item);
            
         catch (Exception e)
            e.printStackTrace();
        
    

    @Test
    public  void getUserByAccount()
        UserMapper UM = ss.getMapper(UserMapper.class);
        //           测试获取单个用户数据
            UserInfo oneUser = UM.getOneUser("458");
            System.out.println("单个用户数据: " + oneUser);
            ss.close();
    

    @Test
    public void TestAdd()
        UserMapper UM  = ss.getMapper(UserMapper.class);
        int res = UM.AddUserInfo(new UserInfo("4697","李袁冲",29,"1579645"));
        if(res > 0)
            System.out.println("用户信息插入成功");
            ss.commit();  //插入成功后,提交到数据库管理系统
            ss.close();
        
    

//    测试修改用户信息
    @Test
    public void TestUpdate()
        UserMapper UM = ss.getMapper(UserMapper.class);
        int res = UM.UpdateUserInfo(new UserInfo("4697","李袁冲",1,"1579645"));
        if(res > 0)
            System.out.println("用户信息修改成功");
            ss.commit();  //修改成功后,提交到数据库管理系统
            ss.close();
        
    
//    测试删除用户信息
    @Test
    public void TestDelete()
        UserMapper UM = ss.getMapper(UserMapper.class);
        int res = UM.DeleteUserInfo("546");
        if(res > 0)
            System.out.println("用户信息删除成功");
            ss.commit();  //删除成功后,提交到数据库管理系统
            ss.close();
        
    


以上是关于Mybatis学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis-05-笔记

学习笔记:python3,代码片段(2017)

mybatis学习(39):动态sql片段

mybatis学习笔记使用generator生成mybatis基础配置代码和目录结构

Mybatis学习笔记-增删改的操作 -对SqlSession的优化封装-优化代码

MyBatis学习笔记