• Mybatis第一天


    一、什么是mybatis?

      Mybatis是一个支持普通sql查询、存储过程和高级映射的优秀持久层框架。Mybatis几乎省略了所有的jdbc代码和参数的手动设计以及对结果集的检索封装。Mybatis可以使用简单的XML和注解用于配置和原始映射,将接口和Java的pojo映射成数据库中的记录。

    二、mybatis和jdbc的区别

      mybatis作为一个框架,肯定是方便了大家的使用。我们先回顾jdbc的使用过程,我们要自己加载驱动,创建连接,写sql,调用setObject()方法对sql传参,对于查询语句,最最要的是对查询结果的遍历分装,才能得到我们所需要的结果类型。这些都太麻烦,为了避免数据库连接关闭过程中所消耗的资源过大,我们还要用数据库连接池。

      现在,mybatis将所有的问题都解决了,传参,封装结果,都交给了mybatis解决。

    三、使用(使用maven+idea创建Mybatis项目,普通的java工程)

    1、没有dao层的

    项目结构:

      Ⅰ、在pom.xml中引入mybatis的依赖包

    <?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.fy</groupId>
        <artifactId>day01</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.26</version>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.3</version>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.16</version>
            </dependency>
        </dependencies>
    
    
    </project>
    View Code

      Ⅱ、配置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">
    <!--        配置数据源 ,id="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/test" />
                    <property name="username" value="root" />
                    <property name="password" value="root" />
                </dataSource>
            </environment>
        </environments>
    
    <!--    mappers中配置映射文件-->
        <mappers>
            <mapper resource="mapper/SalGradeMapper.xml"></mapper>
        </mappers>
    </configuration>
    View Code

      Ⅲ、配置映射文件(SalGradeMapper.xml),映射文件写sql语句,该文件和dao层对应,第一个示例先不写dao层,所以映射文件的namespace的属性可以随意写。如果有dao,映射文件的namespace属性就要写对应的dao层全路径名。(该映射文件要在配置文件中配置,我们项目启动时找的时配置文件,配置文件再找映射文件) 

    <?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="fy">
        <select id="getAll" parameterType="int" resultType="com.fy.entity.SalGrade">
            select * from salgrade
        </select>
        <insert id="insertInto">
    -- 当传入实体类参数时,会自动匹配实体类中的字段和 #{}中的字段
            insert into salgrade(grade,losal,hisal) values (#{grade},#{losal},#{hisal});
        </insert>
        <update id="updateOne">
    --当要穿实体类作为参数时, #{}中的参数要和实体类中的字段对应
             update salgrade set grade=#{grade} where id=#{id}
        </update>
        <delete id="deleteById">
            delete from salgrade where id=#{id}
        </delete>
    </mapper>
    View Code

      Ⅳ、实体类

    package com.fy.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * @Description:
     * @ClassName: SalGrade
     * @Author: fengyun
     * @Date: 2021/3/19 14:40
     * @Version: 1.0
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class SalGrade {
        private int id;
        private int grade;
        private Double losal;
        private Double hisal;
    }
    View Code

      Ⅴ、测试类

    import com.fy.entity.SalGrade;
    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.Reader;
    import java.util.List;
    
    /**
     * @Description:
     * @ClassName: Demo1Test
     * @Author: fengyun
     * @Date: 2021/3/19 14:48
     * @Version: 1.0
     */
    public class Demo1Test {
        public static void main(String[] args) throws Exception {
    //        读取配置文件
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
    //        使用工厂类创建sqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    //        打开数据库连接,这是开启了事务,当增改删时要关闭连接
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            /*List<SalGrade> list = sqlSession.selectList("fy.getAll");
            System.out.println(list);*/
    
           /* sqlSession.insert("fy.insertInto",new SalGrade(1,10,600.00,1900.00));
            sqlSession.update("fy.updateOne",new SalGrade(6,19,300.00,600.00));*/
    
    //        方法的第一个参数是配置文件中的  namespace+标签id,第二个是sql需要的参数
            sqlSession.delete("fy.deleteById",7);
            sqlSession.commit();
        }
    }
    View Code

    2、加上dao层

    所有文件都一样,更改的地方在两个文件。新增的dao,更改了映射文件以及测试类

      dao层:

    public interface SalGradeDao {
        public List<SalGrade> getAll();
        public int updateOne(@Param("id") int id,@Param("losal") double losal);
    }
    View Code

      映射文件:该文件中主要更改 namespace 属性,现在该属性值要和dao层的接口全路径对应,一个映射文件对应一个dao层的接口

    <?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.fy.bbb.dao.SalGradeDao">
       <select id="getAll" resultType="com.fy.bbb.entiry.SalGrade">
           select * from salgrade
       </select>
        <update id="updateOne">
            update salgrade set losal=#{param2} where id=#{param1}
        </update>
    </mapper>
    View Code

      测试类:

    public class DemoTest {
        public static void main(String[] args) throws Exception{
    //        读取配置文件
            Reader reader = Resources.getResourceAsReader("config.xml");
            SqlSessionFactory build = new SqlSessionFactoryBuilder().build(reader);
            SqlSession sqlSession = build.openSession();
    //        通过sqlsession获取接口的映射
            SalGradeDao mapper = sqlSession.getMapper(SalGradeDao.class);
           /* List<SalGrade> all = mapper.getAll();
            System.out.println(all);*/
            int i = mapper.updateOne(3, 9000.00);
            System.out.println(i);
        }
    }
    View Code

    四、可能出现的错误

    1、数据连接出现时区问题

      改,在连接语句上加上时区限制:jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai

    2、文件绑定问题

      解决:查找各个路径引用的地方,看是否将文件名写错

     3、main方法无法测试

      解决:使用junit,测试单元

     4、

     原因:①查找的id不在  ②映射文件没有放在配置文件中

      

  • 相关阅读:
    jqyery dataTable 基本用法
    linux 下两台电脑之间ssh无密码连接
    javascript 高级程序设计 十二
    javascript 高级程序设计 十一
    javascript 高级程序设计 十
    小程序笔记
    表单提交 fastadmin form
    fastadmin表单验证
    sbadmin表单事件
    fastadmin模态框(弹出框)
  • 原文地址:https://www.cnblogs.com/fbbg/p/14559342.html
Copyright © 2020-2023  润新知