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不在  ②映射文件没有放在配置文件中

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

posted @ 2021-03-19 21:09  橙汁one  阅读(36)  评论(0编辑  收藏  举报