自己看B站视频学习的笔记,看着UP自己手敲的,侵删

目录

 

目录

自己看B站视频学习的笔记,看着UP自己手敲的,侵删

一·简介

二·第一个Mybatis程序

一 新建数据库

二搭建环境

三.CRUD

四·配置解析

1.核心配置文件

2.环境配置(environments)

3.属性(properties)

4.类型别名(typeAliases)

5.设置(settings)

6.其他配置

 

7.映射器

五·解决属性名和字段名不一致的问题

1.问题

resultMap

六·日志

6.1日志工厂

6.1LOG4J



 


一·简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

二·第一个Mybatis程序

一 新建数据库

CREATE DATABASE mybatis;

USE mybatis;

CREATE TABLE user(

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,'李珍','000'),

(2,'王德发','123')

 

二搭建环境

1 新建普通的maven项目

2 删除src目录

3 导入依赖

 <!--父工程-->
    <groupId>org.example</groupId>
    <artifactId>Mybatis_Day01</artifactId>
    <version>1.0-SNAPSHOT</version>
​
    <!--导入依赖-->
    <dependencies>
        <!--mysql驱动-->
        <!--https://downloads.mysql.com/archives/c-j/ -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--mybatis-->
        <!--https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
​
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

4 创建一个模块

4·1编写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">
                <!--数据库配置  在url的后续信息配置中“=”左右不要加空格-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

4·2编写mybatis配置文件

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();
    }
}

4·3编写代码

·实体类

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接口

resultType: 返回一个结果(用的多) resultMap: 返回一个集合

public interface UserDao {
    List<User> getUserlist();
}

·接口实现类(由原来的UserDaolmpl装变为一个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">
<!--绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.li.dao.UserDao">
    <!--select 查询-->
    <select id="getUserList" resultType="com.li.pojo.User">
    select * from mybatis.user
  </select>
</mapper>

·4.4测试(junit)

注意:Could not find resource mybatis.config.xml

maven由于约定大于配置,配置文件无法被导出或生效。解决方案 在pom.xml下加入一下代码

<!--在build中配置resources,防止资源导出失败   手动导出资源到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>

常见问题:

1.配置文件没有 注册

2.绑定接口错误

3.方法名不对

4.返回类型不对

5.Maven导出资源问题

三.CRUD

1.namespace

中的报名要和Dao/mapper接口名一致

2.select 选择查询

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

resultType:Sql语句执行的返回值!parameterType:参数类型!

1.编写接口

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

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

<!--select 根据id查询-->
<select id="getUserById" parameterType="int" resultType="com.li.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

<!--insert一个用户(通过对象) 其中对象中的属性可以直接取出来-->
<insert id="addUser" parameterType="com.li.pojo.User">
    insert into mybatis.user (id, name ,pwd) value (#{id}, #{name}, #{pwd});
</insert>

4.update

<!--update一个用户(通过对象) 其中对象中的属性可以直接取出来-->
<update id="updateUser" parameterType="com.li.pojo.User">
    update mybatis.user set name = #{name}, pwd = #{pwd}  where id = #{id};
</update>

5.Delete

<!--delete一个用户-->
<delete id="deleteUser" parameterType="com.li.pojo.User">
    delete from mybatis.user where id = #{id}
</delete>

 

·增删改查需要提交事务! sqlSession.commit();

 

四·配置解析

1.核心配置文件

  • mybatis-config.xml

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

    configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
    environment(环境变量)
    transactionManager(事务管理器)
    dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)

2.环境配置(environments)

mybatis可以配置成多种环境

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

学会使用配置多套运行环境

Mybatis默认的事务管理器是JDBC, 连接池:POOLED

 

3.属性(properties)

可以通过properties属性来实现引用配置文件

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置

编写一个配置文件

db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123

在核心配置文件中引入

<!--引入外部文件-->
<properties resource="db.properties">
    <property name="username" value="root"/>
    <property name="password" value="123"/>
</properties>
  • 可以直接引入外部文件

  • 可以在其中增加一些属性配置

  • 如果两个文件有同一字段,优先使用外部配置文件

    个人犯的错误:在配置完properties文件后测试发现并不能导出数据库信息,查询后发现在db.properties文件中的url地址是不需要加 “” 及其 amp字符,且每个属性应该用 & 连接,而不应该用

    需要注意的就是&amp转义字符的使用

    xml文件中url的设置

    url="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"

 

4.类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

<!--给实体类起别名-->
<typeAliases>
    <typeAlias type="com.li.pojo.User" alias="User"/>
</typeAliases>

也可以指定一个包名,MyBatis会在包名下搜索需要的JavaBean:

扫描实体类的包,默认别名就为这个类的 类名,首字母小写

<!--给实体类起别名-->
<typeAliases>
    <typeAlias type="com.li.pojo"/>
</typeAliases>

实体类比较少时推荐使用第一种方式;

实体类比较多时使用第二种方式

第一种可以DIY别名,第二种不行,如要强行给需在实体上增加注解

@Alias("user")
public class User{}

 

5.设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为

 

 

 

6.其他配置

 

7.映射器

MapperRegistry: 注册绑定我们的Mapper文件;

方式一:【推荐使用】

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

 

方式二:使用class文件绑定注册

 <mappers>
        <mapper class="com.li.dao.UserMapper"/>
 </mappers>

注意点:

  • 接口和他的Mapper配置文件必须同名

  • 接口和他的Mapper配置文件必须在同一个包下

 

方式三:使用扫描包进行注入绑定

<mappers>
     <package name="com.li.dao"/>
 </mappers>

注意点:

  • 接口和他的Mapper配置文件必须同名

  • 接口和他的Mapper配置文件必须在同一个包下

五·解决属性名和字段名不一致的问题

1.问题

数据库中字段

项目中字段

public class User {
    private int id;
    private String name;
    private String passWord;
}

测试出现问题

    select * from mybatis.user where id = #{id}
//类处理器
     select id,name,pwd from mybatis.user where id = #{id}

解决方法:

  • 起别名

<!--select 根据id查询-->
    <select id="getUserById" parameterType="int" resultType="com.li.pojo.User">
              select id,name,pwd as passWord from mybatis.user where id = #{id}
    </select>
  • resultMap

    结果集映射

    id name pwd
    id name passWord
    
    <!--结果集映射-->
        <resultMap id="UserMap" type="User">
            <!--column数据库中的字段,property实体类中的属性-->
            <result column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="pwd" property="passWord"/>
        </resultMap>
    ​
        <!--select 根据id查询-->
        <select id="getUserById" parameterType="int" resultMap="UserMap">
                  select * from mybatis.user where id = #{id}
        </select>

     

  • resultMap元素是MyBatis中最重要最强大的元素

  • ResultMap的设计思想是,对于简单的语句根本不需要配置显示的结果映射,而对于复杂一点的语句只要描述它们的关系就行了

  • ResultMap 最优的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他们。(哪个字段不一样映射哪个)

六·日志

6.1日志工厂

如果一个数据库操作,出现了异常,我们需要排错。日志就是最好的助手!

曾经:sout、debug

现在:日志工厂

 

 

  • SLF4J

  • LOG4J 【掌握】

  • JDK_LOGGING

  • COMMONS_LOGGING

  • STDOUT_LOGGING 【掌握】

  • NO_LOGGING

 

在设置中设定具体使用哪个日志在Mybatis中实现

STDOUT_LOGGING标准日志输出

在mybatis核心配置文件中,配置我们的日志!

 

 

6.1LOG4J

  • 什么是LOG4J?

  • LOG4J是Apache的一个开源项目,通过使用LOG4J,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件

  • 我们也可以控制每一条日志输出格式

  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程

  • 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

1.导入LOG4J的包(导入到总项目xml文件配置下)

<dependencies>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
</dependencies>

2.log4j.properties

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
​
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
​
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/li.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
​
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

3.配置log4j为日志的实现

<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

4.Log4j的使用!,直接测试运行刚才的查询

 

 

包含JDBC池的连接与断开

  • 简单使用步骤

  1. 在要使用Log4j 的类中,导入包 import org.apache.log4j.Logger;

  2. 日志对象的参数为当前类class

    static Logger logger = Logger.getLogger(UserMapperTest.class);
    

     

  3. 日志级别

logger.info("info:进入了testLog4j");
        logger.debug("debug:进入了testLog4J");
        logger.error("error:进入了testLog4J");