Day36——MyBatis学习笔记part1

MyBatis初识

文章目录

    • MyBatis初识
      • 1、什么是MyBatis
        • 初识
        • MyBatis特性:
        • MyBatis如何安装
      • 2、第一个程序
      • 3、增删改查
      • 4、配置文件
      • 5、ResultMap结果集映射
      • 6、分页
        • 分页的原因:
        • 办法:

谈谈学习之路:


javacore -->前端–>数据库–>Javaweb

以后在做项目(专注于业务,不应该专注于

  • 配置环境web.xml
  • 配置服务器 Tomcat
  • 固定的套路(eg:JDBC…)


第二阶段:

SSM企业级开发框架

  • MyBatis(简化数据库操作)
  • Spring(粘合框架)
  • SpringMVC(M:实体类,V:试图,C:控制(Controller(servlet)))

解释Spring:原来我们需要自己创建对象,现在我们只要集成了Spring,我们就可以在Spring中拿取对象

学习了框架之后,我们开发方式就会发生变化,越来越简单


前后端分离

后端:SpringBoot提供一些数据

前端:Vue,视图层框架,接收后台给他的json数据,响应并加载到前端页面


现在开始初识MyBatis,

首先!MyBatis就是与数据库打交道的!


1、什么是MyBatis

初识

在官网,百度百科都有介绍,先了解是个啥

  • MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

前身:iBatis!在后面编写代码时,导入包的时候,会发现iBatis这个词。

下载:Github

版本:最新3.5.4

MyBatis特性:

  • 一个基于持久层的框架
  • 支持定制化SQL,存储过程以及高级映射
  • 避免了几乎所有的JDBC代码与手动设置参数以及获取结果集

在特性中说到,它是一个持久层的框架,那

说一说什么是Java的持久层?

  • 所谓持久,就是把数据保存到可以永久保持的存储设备当中。一般来说,持久更为直接的理解就是对数据库的各种操作,如CRUD(增加,删除,修改,查询),更新等操作。
  • 持久层,就是把持久的动作封装成一个独立的层,这是为了降低功能代码之间的关联。创建一个更清晰的抽象,提高代码的内聚力,降低代码的耦合度,从而增强代码的要劳动局生和可重用性。
  • 实现持久层的框架有: JDBC, Hibernate,Mybatis,JPA等技术

MyBatis如何安装

如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatisartifactId>
    <version>3.5.4version>
dependency>

2、第一个程序

搭建环境,导入包,写代码,测试

这里现在IDEA中建立一个Maven项目

1、准备一个数据

CREATE DATABASE `mybatis`;
USE `mybatis`;

CREATE TABLE `User`(
	`id` INT(20) NOT NULL,
	`name` VARCHAR(30) DEFAULT NULL,
	`pwd` VARCHAR(30) DEFAULT NULL,
	PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

在插入自己的一些数据

2、准备jar包(Maven仓库中找)




<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <version>5.1.47version>
dependency>

3、第一步写配置文件mybatis-config.xml,此文件建在src/resources下



<configuration>
    <environments default="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/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>
    
configuration>

4、编写工具类,操作数据库

在src/项目路径/utils下建立MyBatisUtils工具类

public class MyBatisUtils {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 工厂模式
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    // 获取sqlSession的连接
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }
}

5、配置实体类,引入Lombok

建立刚与数据库表中所对应的实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private int id;
    private String name;
    //private String pwd;
   private String password;//用来测试结果集映射
}
//这里使用了lombok依赖,用注解构建了有参无参,getset等方法
//也是将lombok依赖导入pom.xml中即可

6、编写持久层的操作接口

在src/项目路径/mapper下建立操作接口

// 操作用户的接口类
public interface UserMapper {
    List<User> getUserList();
}

7、之前需要编写接口实现类,使用MyBatis后,专注编写sql,使用配置文件

在resources目录下须建立与Java目录下相同的目录结构:建立UserMapper.xml

Day36——MyBatis学习笔记part1_第1张图片




<mapper namespace="com.feng.mapper.UserMapper">
    <select id="getUserList" resultType="com.feng.pojo.User">
        select * from user;
    select>
mapper>
  • 好处,程序运行后,依旧可以修改代码,解耦
  • 注意:namespace绑定对应的接口;具体操作(CRUD)表对应的id,为接口的方法

8、这个配置文件一定要注册到MyBatis的配置文件中

在mybatis-config.xml中一定要把刚才UserMapper.xml注册上

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

9、在Test类中进行测试

public class Test {
    public static void main(String[] args) {
        // 如何获取接口

        // 1、 获取SqlSession, 执行sql使用的
        SqlSession session = MyBatisUtils.getSession();
        // 2、通过 session.getMapper(Class ) 获得接口
        UserMapper mapper = session.getMapper(UserMapper.class);

        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

第一个程序运行结果:


3、增删改查

当第一个程序成功之后,那这些数据库的操作就变得轻松一些,在增删改查中会有一些注意点,在下面会说到。先来测试下对数据库的增删改查效果。

1、在上面的栗子中,将接口进行继续编写所要执行的方法

public interface UserMapper {
    List<User> getUserList();

    User selectById(int id); // 在xml 中获取这个id #{id}

    // 多个参数如何操作,必须要增加注解 @Param
    User selectByUsernamePwd(@Param("username") String username, @Param("pwd")String pwd);
    
    // 新增一个用户 , 对象的情况下,直接可以拿到对象的属性
    int addUser(User user);

    // 修改用户信息
    int updateUser(User user);

    // 删除用户
    int deleteUserByID(int id);
}

2、在接口对应的SQL配置文件内中,也要进行编写,并要确保配置文件与SQL的正确性

这里的resultType="User"写成这样是因为在mybatis-config.xml文件中,将mapping映射改为

    <mappers>
        
        <package name="com.feng.mapper"/>
    mappers>


<mapper namespace="com.feng.mapper.UserMapper">

    <select id="getUserList" resultType="User">
        select * from user;
    select>

    <select id="selectById" resultType="User">
        select * from user where id = #{id}
    select>

    <select id="selectByUsernamePwd" resultType="User">
        select * from user where name = #{username} and pwd = #{pwd}
    select>

    <insert id="addUser" parameterType="User">
        insert into `user`(`id`,`name`,`pwd`) values (#{id},#{name},#{pwd});
    insert>

    <update id="updateUser" parameterType="User">
        update `user` set `name` = #{name},pwd = #{pwd}  where id = #{id} ;
    update>

    <delete id="deleteUserByID" parameterType="int">
        delete from user where id = #{id}
    delete>

mapper>

3、在Test类中进行测试

public class Test {
    public static void main(String[] args) {
        // 如何获取接口

        // 1、 获取SqlSession, 执行sql使用的
        SqlSession session = MyBatisUtils.getSession();
        // 2、通过 session.getMapper(Class ) 获得接口
        UserMapper mapper = session.getMapper(UserMapper.class);

//        查看所有用户
//        for (User user : mapper.getUserList()) {
//            System.out.println(user);
//        }

//        通过id查用户
//        User user = mapper.selectById(1);
//        System.out.println(user);

//        通过用户名与密码查用户
//        User user = mapper.selectByUsernamePwd("小子", "123111");
//        System.out.println(user);

//        增加用户
//        int user = mapper.addUser(new User(4, "小蓝", "000000"));
//        session.commit();
//        if (user>0){
//            System.out.println("增加成功");
//        }

//        修改用户
//        int user = mapper.updateUser(new User(4, "小黑", "000000"));
//        session.commit();
//        if (user>0){
//            System.out.println("修改成功");
//        }

//        通过id删除用户
//        int id = mapper.deleteUserByID(4);
//        session.commit();
//        if (id>0){
//            System.out.println("删除成功");
//        }
    }
}

注意点

1、多个参数一定要增加 @Param 注解

2、增删改一定要增加事务提交

3、增删改,标签一定要对应,参数类型必须要写

4、增删改不用写返回值,查询,必须写返回值,集合、泛型中的内容(具体的对象)

测试结果:


4、配置文件

MyBatis的核心配置文件就是mybatis-config.xml了,我们来康康MyBatis的核心配置结构:

配置文件在前面,知道要配置JDBC连接,SqlMap映射文件等信息,当然这都是非常基本的配置,现在要探究一下mybatis-config.xml的详细配置,如图:

Day36——MyBatis学习笔记part1_第2张图片

这些配置都是有次序的!!按照图上结构放置!

< properties>元素的配置,它提供了允许在主配置文件之外的一个“名值对”列表,可以将其中的配置信息加载进来,而这些配置信息可以放在任何一个地方。使用properties元素,其中有两个属性,分别是:resource和url。

1、可配置db.properties 让配置文件读取:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8
username=root
password=123456

mybatis-config.xml中部分配置为:

<properties resource="db.properties"/>
...
...
<dataSource type="POOLED">
    
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
dataSource>

< settings>元素的配置,这个元素即设置MyBatis的全局配置信息:

2、通过settings配置日志

<settings>
    <!--配置日志,就可以看到具体的SQL信息,从而找到出错的原因!
         name="logImpl" value="LOG4J"/>
settings>

3、配置mapper映射器,为扫描包的

<mappers>
    <package name="com.feng.mapper"/>
mappers>

< typeAlias>元素,就是起别名,很容易理解,我们不想使用过长的类名时,可以用它来起个别名,之后我们使用别名就可以了。比如:

4、通过配置类型的别名来简化开发


<typeAliases>
    <package name="com.feng.pojo"/>

typeAliases>

5、ResultMap结果集映射

假设存在一个问题:实体类的属性和数据库中所对应的名字不一致时,如何返回正确的查找对象??

如果属性名和数据库的列名,一致 ,这个时候mybatis 会帮我们自动推断!=>自动映射

如果属性名和数据库的列名,不一致 ,手动实现映射


手动映射步骤:

1、先修改实体类的属性名和数据库中的不一致

public class User {
    private int id;
    private String name;
    //private String pwd;
   private String password;//用来测试结果集映射
}

2、新增一个接口

public interface RUserMapper {
    User selectUserById(int id);
}

3、编写对应接口的SQL配置文件



<mapper namespace="com.feng.mapper.RUserMapper">
    
    <resultMap id="UserMap" type="User">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="pwd" property="password"/>
    resultMap>
    <select id="selectUserById" resultMap="UserMap">
        select id,name,pwd from user where id = #{id};
    select>
mapper>

4、测试resultMap

public class Test1 {
    // 注意导入包的问题  org.apache.log4j.Logger
    //日志,这里可不用
    static Logger logger = Logger.getLogger(Test1.class);

    public static void main(String[] args) {
        SqlSession session = MyBatisUtils.getSession();
        RUserMapper mapper = session.getMapper(RUserMapper.class);

//        属性名和数据库的列名,不一致 ,手动实现映射,结果集映射
        User user = mapper.selectUserById(1);
        System.out.println(user);
        }
}

测试结果:

可以看到,数据库中虽然是pwd,但是打印出来还时password

一般,SQL配置文件中,主键一般使用id标签

6、分页

先说说,日志Logging

Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

具体选择哪个日志实现工具由MyBatis的内置日志工厂确定。它会使用最先找到的(按上文列举的顺序查找)。

这里我们选择日志:Log4j

使用日志的原因:

  • 排查错误

如何使用Log4j:

1、导入依赖


<dependency>
    <groupId>log4jgroupId>
    <artifactId>log4jartifactId>
    <version>1.2.17version>
dependency>

2、编写log4j的配置文件,路径与mybatis-config.xml一致

### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = ./log/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =./log/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout

3、在mybatis-config.xml修改日志实现为 Log4j,注意大小写问题即可

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

4、测试一下,假设要使用Log4j 的类去打印日志

public class Test1 {
    // 注意导入包的问题  org.apache.log4j.Logger
    static Logger logger = Logger.getLogger(Test1.class);

    public static void main(String[] args) {
        SqlSession session = MyBatisUtils.getSession();
        RUserMapper mapper = session.getMapper(RUserMapper.class);

//        属性名和数据库的列名,不一致 ,手动实现映射,结果集映射
         User user = mapper.selectUserById(1);
         System.out.println(user);

//        测试:使用log4j打印日志
        System.out.println("1111222");//普通输出
//        通过log4j 可以将日志实现细粒度的控制
        logger.error("0123");
        logger.info("4567");
        logger.debug("8989");
    }
}

测试,控制台打印


分页的原因:

重点在提高服务器性能!按照一小部分一小部分来处理数据

办法:

方法一:在SQl中有limit用来分页

-- 语法
Select * from user limit startIndex,Pagesize

1、在实现实体类的接口中编写方法

 List<User> selectUserByLimit(Map<String,Integer> map);

2、在接口对应的配置文件中编写

<select id="selectUserByLimit" parameterType="map" resultMap="UserMap">
    select * from user limit #{startIndex},#{pageSize}
select>

3、测试类编写

// map 中的key,必须要和 sql 中接收的参数一致
public static void main(String[] args) {

    SqlSession session = MyBatisUtils.getSession();
    RMapper mapper = session.getMapper(RMapper.class);

    int currentPage = 1; //第几页
    int pageSize = 3; //每页显示几个

    HashMap<String, Integer> map = new HashMap<String, Integer>();
    // 分页     第几页    每页显示几个
    map.put("startIndex",(currentPage-1)*pageSize);
    map.put("pageSize",pageSize);

    List<User> users = mapper.selectUserByLimit(map);
    for (User user : users) {
        logger.debug(user);
    }
}

运行结果:

方法二:在 java 层面分页,使用Mybatis中的RowBounds (分页)对象

1、在实现实体类的接口中重新写方法

List selectUserByLimit();

2、在对应的配置文件中配置

<select id="selectUserByLimit" parameterType="map" resultMap="UserMap">
    select * from user;
select>

3、在编写测试类

public class Test1 {
    // 注意导入包的问题  org.apache.log4j.Logger
    static Logger logger = Logger.getLogger(Test1.class);

    public static void main(String[] args) {
        SqlSession session = MyBatisUtils.getSession();

        int currentPage = 1; //第几页
        int pageSize = 3; //每页显示几个

        RowBounds rowBounds = new RowBounds((currentPage-1)*pageSize,pageSize);

        // selectList(方法的路径)
        // 通过Java操作查询
        //我们可以通过 selectXXX 执行具体的某一个方法,得到结果,在这种方式下,可以通过Java实现分页!
        //session.selectList("com.feng.mapper.RUesrMapper.selectUserByLimit", null, rowBounds);
        List<User> users = session.selectList("com.feng.mapper.RUesrMapper.selectUserByLimit", null, rowBounds);

        for (User user : users) {
            System.out.println(user);
        }
    }
}

运行测试:

方法三: 分页插件 PageHelper

这里还未学习,谅解

你可能感兴趣的:(Day36——MyBatis学习笔记part1)