• Mybatis总结(持续补充)


    1.了解Mybatis
    是一个对于JDBC的封装的框架
    2.使用思路
    配置环境:需要引入Mybatis的一个jar包
    然后写一个mybatis-config.xml的配置文件里面写着mybatis的核心配置文件,例如:连接的哪个数据库,资源文件的注册(Mapper.xml等)
    书写一个MybatsiUtils工具类封装一个方法返回sqlsession,底层的SqlSessionBuider读取配置文件mybatis-config.xm拿到sqlsessionFactory相当于一个工厂生产sqlsession(封装着对数据库的所有操作的方法)
    正常的书写Dao层的接口,
    Dao层当中的每一个Mapper都注册与之对应的Mapper.xml文件,每一个xml中都绑定着每个Dao层的Mapper中方法,以及绑定对应的sql语句
    调用的时候是先拿到sqlsession对象,然后调用其的getMapper(对应的Mapper接口)方法拿到接口,接下来接口调用接口中的方法就会执行其绑定的xml文件中的sql语句,然后可以对sql语句执行后拿到数据进行处理。
    最后关闭sqlsession
    3.代码样例
    1,核心配置文件Mybatis-config.xml

    2.MybatisUtils

    public class MybatisUtils {
        //开始执行一次读取配置文件信息
        private static  SqlSessionFactory sqlSessionFactory;
        static {
            try {
                //获取SqlSessionFactory对象(相当于一个工厂产出SqlSession(产品))
                String resource = "mybatis-config.xml";
                InputStream inputStream= Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
        //既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。
        // SqlSession 提供了在数据库执行 SQL 命令所需的所有方法
        public static SqlSession getSqlSession(){
            return  sqlSessionFactory.openSession();
        }
    
    }
    

    3.UserMapper

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

    4.UserMapper.xml

    <!--映射接口,相当于实现接口-->
    <mapper namespace="com.sqx.dao.UserDao">
        <!--id表示对应接口中的方法,result type是返回值类型-->
        <select id="getListUser" resultType="com.sqx.pojo.User">
        select * from mybatis.user
        </select>
    </mapper>
    
    5.Test
    @Test
    public  void test(){
        //第一步获取sqlSession对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List<User> userList =userDao.getListUser();
        for (User user : userList) {
            System.out.println(user);
        }
        //关闭sqlSession
        sqlSession.close();
    }
    

    4.配置解析

    MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
    configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
    environment(环境变量)
    transactionManager(事务管理器)
    dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)
    

    4.1环境配置(environments)
    Mybatis可以配置多套环境
    不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。(学会使用配置多套环境)

    事务管理器(transactionManager)
    在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):默认为JDBC
    数据源(dataSource)
    dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
    大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。
    有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):默认为POOLED

    4.2xml文件当中所有配置都具有一定的顺序

    4.3properties(属性)
    外部引入
    第一步:编写配置文件
    使得这些属性可以在外部进行配置,并可以进行动态替换。

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

    然后再在mybatis-config.xml当中连接配置文件

    <properties resource="db.properties"/>
    

    可以直接引入配置文件
    可以在其中添加一些属性
    如果2个文件(db.properties和mybatis-config.xml)当中都存在共同的字段,优先采用外部的

    4.4类型别名(typeAliases)
    存在的意义为了减少类名存在的冗余
    为每一个类名直接DIY一个别名

    <typeAliases>
        <typeAlias type="com.sqx.pojo.User" alias="User"/>
    </typeAliases>
    

    2.扫描某个包,Mybatis会在这个包下搜索需要的javaBean所有的实体类名字首字母小写就是别名


    3.对实体类使用注解,注解名就是别名

    //user实体类import org.apache.ibatis.type.Alias;注解的包
    @Alias("hello")
    public class User {}
    

    4.5设置(setting)
    这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。
    4.6其他配置
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)

    4.7注册Mapper文件的三种方式
    推荐使用第一种

    第一种:<!-- <mapper resource="com/sqx/dao/UserMapper.xml"/>-->
    第二种:<!-- <mapper class="com.sqx.dao.UserMapper"/>-->
     第三种:<!--<package name="com.sqx.dao"/>-->
    

    使用后两种需要注意的的点
    接口和它的Mapper.xml文件必须同名
    接口和它的Mapper.xml文件必须在同一个包下

    作用域和生命周期

    5.解决属性名和字段名不一致的问题
    问题:数据库当中的字段与返回的实体类的属性不一致

    1.可以在sql语句当中起一个别名(最简单的,无脑的方法)
    2.使用通过结果集映射
    将sql语句的字段映射到一个实体类的属性
    ResultMap(结果集映射)

    //字段与属性相同的可以不映射(省略不写)
    <resultMap id="UserMap" type="User">
        <id column="id" property="id"/>
        <id column="name" property="name"/>
        <id column="pwd" property="password"/>
    </resultMap>
    
    使用结果集映射
    <select id="getUserById" resultMap="UserMap" parameterType="int">
        select  * from mybatis.user where id=#{id}
    </select>
    

    6.日志工厂
    6.1标准模式
    在Mybatis-config.xml核心配置文件当中setting日志模式(不设置没有默认值)
    标准的是STDOUT_LOGGING
    logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 未设置

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

    结果展示

    6.2Log4j日志(掌握)
    什么是Log4j

    1.先导入jar包

    log4j log4j 1.2.17

    2.核心配置文件中写入setting


    3.写一个配置文件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/kuang.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
    

    4.调用Log4j

    public class UserMapperTest {
    
        //注意导包:org.apache.log4j.Logger
        static Logger logger = Logger.getLogger(UserMapperTest.class);//此处是类名.class
    
        @Test
        public void test01(){
            logger.info("info:进入selectUser方法");
            logger.debug("debug:进入selectUser方法");
            logger.error("error: 进入selectUser方法");
    
            SqlSession sqlSession =MybatisUtils.getSqlSession();
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            User user = mapper.getUserById(1);
            System.out.println(user);
            sqlSession.close();
        }
    
    }
    

    5.完成

    7.分页
    为什么要使用分页?
    减少数据的处理量

    使用Limit分页
    语法:SELECT * from user limit startIndex,pageSize;
    SELECT * from user limit 3; #[0,n]

    使用Mybatis实现分页查询
    7.1通过sql来实现分页(掌握)
    1.编写Dao层的Mapper接口

    //实现分页查询
    List<User> queryByLimit(Map<String,Integer> map);
    
    
    2.对应的Mapper.xml文件当中绑定,书写对应的sql
    <resultMap id="UserMap" type="User">
        <id column="id" property="id"/>
        <id column="name" property="name"/>
        <id column="pwd" property="password"/>
    </resultMap>
    
    <select id="queryByLimit" resultMap="UserMap" parameterType="map">
        select * from mybatis.user limit #{startIndex},#{pageSize}
    </select>
    

    3.直接调用即可

    @Test
    public void queryByLimitTest(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map<String,Integer> map =new HashMap<String, Integer>();
        map.put("startIndex",1);
        map.put("pageSize",2);
        List<User> userList = mapper.queryByLimit(map);
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    

    7.2使用RowBounds进行分页(了解)
    1.第一步同样是在Dao层写一个接口方法
    //通过来实RowBounds现分页
    List queryByRowBounds();

    2.绑定接口的Mapper文件
    直接查询全部,分页由java代码来操作

    <select id="queryByRowBounds" resultMap="UserMap">
        select * from mybatis.user
    </select>
    

    3.执行分页操作

    @Test
    public  void queryByRowBounds(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        RowBounds rowBounds = new RowBounds(0, 2);
        List<User> list = sqlSession.selectList("com.sqx.dao.UserMapper.queryByRowBounds", null, rowBounds);
        for (User user : list) {
            System.out.println(user);
        }
        sqlSession.close();
    
    }
    

    7.3分页插件(了解即可)

    8.使用注解开发
    8.1、面向接口编程

    • 大家之前都学过面向对象编程,也学习过接口,但在真正的开发中,很多时候我们会选择面向接口编程
    • 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的实现 , 大家都遵守共同的标准 , 使得开发变得容易 , 规范性更好
    • 在一个面向对象的系统中,系统的各种功能是由许许多多的不同对象协作完成的。在这种情况下,各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;
    • 而各个对象之间的协作关系则成为系统设计的关键。小到不同类之间的通信,大到各模块之间的交互,在系统设计之初都是要着重考虑的,这也是系统设计的主要工作内容。面向接口编程就是指按照这种思想来编程。

    关于接口的理解

    • 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
    • 接口的本身反映了系统设计人员对系统的抽象理解。
    • 接口应有两类:
      • 第一类是对一个个体的抽象,它可对应为一个抽象体(abstract class);
      • 第二类是对一个个体某一方面的抽象,即形成一个抽象面(interface);
    • 一个体有可能有多个抽象面。抽象体与抽象面是有区别的。

    三个面向区别

    • 面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法 .
    • 面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现 .
    • 接口设计与非接口设计是针对复用技术而言的,与面向对象(过程)不是一个问题.更多的体现就是对系统整体的架构

    8.2使用注解开发
    1.注解在接口上实现
    @Select(“select * from user”)
    List getUsers();

    2.再在核心配置文件当中注册接口

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

    3.调用接口

    //优点:可以更加便捷的开发,处理一些简单的sql,复杂的就不推荐
    //缺点:表中字段与实体类的属性不一致,存在结果集映射问题无法修改。
    @Test
        public void getUsers(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.getUsers();
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
    

    本质:反射机制实现
    底层:动态代理

    Mybatis详细的执行流程

    8.3使用注解进行CRUD
    我们可以在拿到sqlsession时候配置事务的自动提交

    //此时设置了事务的自动提交,不需要手动commit
    public static SqlSession getSqlSession(){
        return  sqlSessionFactory.openSession(true);
    }
    
    
    编写接口使用注解
    public interface UserMapper {
    
        @Select("select * from user")
        List<User> getUsers();
    
        @Select("select * from user where id=#{id}")
        User getUser(@Param("id") int id);
    
        //插入一条数据
        @Insert("insert into user(id,name,pwd)values(#{id},#{name},#{password})")
        int addUser( User user);
    
        //修改一条数据
        @Update("update user set name=#{name},pwd=#{password} where id=#{id}")
        int UpdateUser(User user);
    
        //删除一条数据
        @Delete("delete from user where id =#{uid}")
        int DeleteById(@Param("uid") int id);
    }
    

    测试类

    【注意:我们必须要讲接口注册绑定到我们的核心配置文件中!】

    关于@Param() 注解
    基本类型的参数或者String类型,需要加上
    引用类型不需要加
    如果只有一个基本类型的话,可以忽略,但是建议大家都加上!
    我们在SQL中引用的就是我们这里的 @Param() 中设定的属性名!

    9.Lombok
    一个插件通过使用注解来代替set get tostring hashcode constructor…一系列的操作
    Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
    Never write another getter or equals method again, with one annotation your class has a fully featured builder,
    Automate your logging variables, and much more.

    java library
    plugs
    build tools
    with one annotation your class
    1.使用步骤
    在IDEA当导入插件lombok

    2.导入依赖

    org.projectlombok
    lombok
    1.18.10
    provided

    3.在实体类上加注解即可!
    @Data
    @AllArgsConstructor
    @NoArgsConstructor

    Lombok中的注解:
    Features
    @Getter and @Setter
    @FieldNameConstants
    @ToString
    @EqualsAndHashCode
    @AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
    @Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
    @Data
    @Builder
    @SuperBuilder
    @Singular
    @Delegate
    @Value
    @Accessors
    @Wither
    @With
    @SneakyThrows
    @val
    @var
    experimental @var
    @UtilityClass
    Lombok config system
    Code inspections
    Refactoring actions (lombok and delombok)

    说明:
    @Data:无参构造,get、set、tostring、hashcode,equals
    @AllArgsConstructor
    @NoArgsConstructor
    @EqualsAndHashCode
    @ToString
    @Getter

  • 相关阅读:
    lamp环境安装二
    ubuntu14.04 sublime 出错
    lamp环境安装一
    jsp(Java Server Pages)和js(JavaScript)的区别:
    form表单验证jquery
    数据库分离 脱机
    数据绑定ds.ReadXml(stream);
    自定义类型转化
    temp
    一般处理程序获得一个链接返回的值
  • 原文地址:https://www.cnblogs.com/qxsong/p/14321074.html
Copyright © 2020-2023  润新知