Mybatis快速入门(一)

MyBatis框架

什么是框架

框架就是一相当于一栋高楼,楼已经盖好了,你怎么装修,就看你自己的需求了。

框架是一个半成品,对于Java语言来说,框架就是封装了别人的代码。在框架的基础上我们在进一步开发,拿来主义。

框架解决什么问题

解决的是技术整合问题。软件开发环境和规模都很大,不可能任何一个项目的代码都从零开始,此时就需要一个非常优秀的框架把基础技术整合完毕,我们在他的基础上进一步开发。提高性能,易扩展,易维护,最终提高整个团队的开发效率。

什么时候使用框架

企业级大型项目开发。

怎么使用框架

Java的框架是具有一些共性

  • 导入jar包
  • 框架运行细节定义,也就是编写配置文件(xml)
  • 调用框架中的api

使用原始的JDBC

  • 查询user表
  • 以List集合形式返回
  • 编写pojo类 (User)
    • domain,pojo本质都是相同的

创建pojo对象

public class User {
    private int id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", address='" + address + '\'' +
                '}';
    }
}

创建UserDao接口实现类

public class UserDaoImpl implements UserDao {
    private String driverClass = "com.mysql.jdbc.Driver";
    private String url="jdbc:mysql://localhost:3306/test";
    private String username="root";
    private String password="root";
    @Override
    public List<User> queryUserList()throws Exception {
        List<User> list = new ArrayList<User>();
        Class.forName(driverClass);
        Connection conn = DriverManager.getConnection(url,username,password);
        String sql = "select * from user";
        PreparedStatement pst = conn.prepareStatement(sql);
        ResultSet rs = pst.executeQuery();
        User user = null;
        while (rs.next()){
            user = new User();
            user.setId(rs.getInt("id"));
            user.setUsername(rs.getString("username"));
            user.setSex(rs.getString("sex"));
            user.setBirthday(rs.getDate("birthday"));
            user.setAddress(rs.getString("address"));
            list.add(user);
        }
        rs.close();
        pst.close();
        conn.close();
        return list;
    }
}

测试程序

public class MainTest {
    @Test
    public void testJDBC() throws Exception {
        UserDao userDao = new UserDaoImpl();
        List<User> list = userDao.queryUserList();
        if(list!=null && list.size()>0)
            for(User user : list){
                System.out.println(user);
            }
    }
}

原始JDBC的问题

  • 频繁连接,释放数据库资源,降低系统性能
  • SQL语句硬编码,难以维护
  • 参数和占位符对应问题
  • 结果集解析复杂,列名硬编码

MyBatis框架概述

  • Mybatis原本是Apache软件基金会的一个开源项目叫做iBatis,2010年这个项目由Apache迁移到了google code管理才改名为Mybatis,2013年又迁移到了GitHub。

  • Mybatis是一个优秀的持久层框架(Dao层框架),它是对JDBC的封装,使得开发者只需要关注Sql语句(业务)本身即可,无需开发者处理加载驱动、获取连接、创建Statement等繁琐的过程。

  • Mybatis最大的特点是把Sql语句写在XML配置文件当中。而且Mybatis执行完Sql语句之后可以以对象形式返回(POJO/POJO集合等)。

  • Mybatis是一个实现了ORM思想的持久层框架

  • ORM:Object/Relation Mapping 对象/关系映射。

  • ORM思想:将数据库中的关系数据表映射为JAVA中的对象,把对数据表的操作转换为对对象的操作,实现面向对象编程。因此ORM的目的是使得开发人员以面向对象的思想来操作数据库。

    比如:原来insert使用的是insert into…,如果使用实现了ORM思想的持久层框架,就可以在Java程序中直接调用api,比如insert(User),达到操作对象即操作数据库的效果。Hibernate框架是一个全自动的ORM持久层框架,只需要编写POJO,在xml中定义好Pojo属性和数据表字段的映射/对应关系,就可以在java中实现类似 insert(User)的操作。Sql语句都不用写。但是因为性能等问题,市场占有率越来越低

    Mybatis框架是一个半自动的ORM持久层框架,也可以在Java中实现类似 insert(User)的操作最终操作数据库,但是需要我们自己写Sql语句。Mybatis是目前比较流行的Dao层框架。

自定义MyBatis框架

在这里插入图片描述

MyBatis快速入门

步骤:

  • 导入MyBatis框架jar包
  • 配置文件
  • SqlSessionFactoryBuilder,传入字节输入流,构建工厂
  • SqlSessionFactory,创建SqlSession
  • SqlSession执行selectList方法查询数据
package com.tian.mybatis;

import com.tian.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * @ClassName QuickStart
 * @Author Tian
 * @Date 2020-06-17-22:17
 * @Description
 *
 *  MyBatis框架快速入门
 *  SQL语句,连接信息,写在配置文件中
 *  SqlMapConfig 配置的是连接信息
 *  UserMapper 配置的是数据表user的sql语句
 *
 **/
public class QuickStart {
        @Test
        /**
         * 需求:查询user表,数据存储到List集合中
         *  实现步骤:
         *  1.创建SqlSessionFactoryBuilder
         *      工厂创建者:创建SqlSessionFactory对象工厂
         *      读取配置文件信息
         *
         *  2.SqlSessionFactory创建SqlSession接口实现类对象
         *`
         *  3.SqlSession调用select查询数据表
         *
         *  4.输出查询结果集
         *
         *  5.释放资源
         */
        public void MybatisQuickStart(){
            //1.创建SqlSessionFactoryBuilder(工厂创建者)
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

            //调用build()方法,负责读取配置文件,并且返回SqlSessionFactory对象,需要传递流对象,流对象绑定数据库配置文件
            InputStream inputStream = QuickStart.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
            //2.创建SessionFactory
            SqlSessionFactory SqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
            //3.SqlSessionFactory创建SqlSession接口实现类对象
            SqlSession sqlSession = SqlSessionFactory.openSession();
            //4.SqlSession调用select查询数据表
            //selectList方法参数不是SQL语句,SQL语句在配置文件中
            //namespace+'.'+id锁定sql语句
            List<User> userList = sqlSession.selectList("test.queryList");
            userList.forEach(System.out::println);
            //5.释放资源
            sqlSession.close();
        }
}


SqlMapperConfig.xml配置——相当于图纸------>创建SqlSessionFactory

<?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"默认值 = development(开发环境)
     environment:运行环境 单个
        id="development" id唯一属性
        = development(开发环境)
        = produce(生产环境)
        = test(测试环境)
     -->
    <environments default="development">
        <environment id="development">
            <!--
                transactionManager事务管理配置
                type="JDBC" 使用的是最原始的JDBC的事务处理机制
                type = "MANAGERED" 不管理事务
            -->
            <transactionManager type="JDBC" />
            <!--
                dataSource配置数据源 连接池
                 type="POOLED" 使用连接池
                 Mybatis自带连接池(Type = "UNPOOLED")
            -->
            <dataSource type="POOLED">
            <!--
                property 配置连接数据库四大信息
            -->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/Mybatis?characterEncoding=utf-8&amp;useSSL=false" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <!--
    配置的是映射关系 ORM java对象和数据表
    -->
    <mappers>
        <!--
            单独的映射关系
            resource 资源====映射文件的路径
            UserMapper.xml:配置的是数据表user的sql语句
        -->
        <mapper resource="UserMapper.xml" />
    </mappers>
</configuration>


UserMapper.xml配置

<?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命名空间:属性值要求唯一性
   -->
<mapper namespace="test">
   <!--删除数据 -->
   <delete id="deleteUserByID" parameterType="Integer">

      delete from user where id = #{id}

   </delete>

   <!-- =========================================================================== -->
   <!-- 修改数据 -->
   <update id="updateUserByID" parameterType="com.tian.pojo.User">

      update user set username=#{username},sex = #{sex},birthday = #{birthday},address = #{address} where id = #{id}
      
   </update>
   
   <!-- =========================================================================== -->

   <!-- 增删改,结果集返回的是影响的行数 int类型,不需要配置resultType-->
   <insert id="insertUser" parameterType="com.tian.pojo.User">
        <!-- 传递的参数是pojo对象,#{pojo对象的属性名}-->
      insert into user values(null,#{username},#{sex},#{birthday},#{address})

    <selectKey order="AFTER" resultType="Integer" keyProperty="id">
            <!-- insert标签中,子标签selectKey 获取上一次新增的主键值
                  order="AFTER"/order="BEFORE"
                  resultType
                  keyProperty:查询后的值放在哪里?pojo对象的属性中
               -->
            select LAST_INSERT_ID()
    </selectKey>
   </insert>

   <!-- =========================================================================== -->
   <!--
      select标签 :配置的是查询语句
      id属性:唯一性,在当前文件中queryList
      框架执行SQL语句:namespace + '.' + queryList 确定SQL语句
      resultType:查询的结果集 是pojo对象
      标签体:SQL语句
   -->
   <select id="queryList" resultType="com.tian.pojo.User">

      select * from user

</select>

   <!-- =========================================================================== -->

   <!--
         配置主键查询的SQL语句,select
         id具有唯一性
         查询的是结果集
         resultType:查询的结果集 是pojo对象
         SQL语句有参数
         parameterType:SQL语句的参数类型
      -->
   <select id="queryUserByID" resultType="com.tian.pojo.User" parameterType="Integer">

      select * from user where id = #{id}

</select>

   <!-- =========================================================================== -->

   <!--
         配置:数据表user模糊查询
         ${}参数固定写为value
    -->
   <select id="queryUserByUsername" resultType="com.tian.pojo.User" parameterType="String">

        select * from user where username like ${value};

   </select>


</mapper>

<!--
   #{} ${}获取参数的区别
   #{}
   select * from user where username like ?;
   参数编译为 ? 实际传入的真实参数为:%%(String)
   再加上''
   框架底层使用的是JDBC的PrepareStatement接口
   推荐使用#{}比较高效

   ${}
   select * from user where username like '%天%';
   直接将字符串拼接到SQL语句后面

   适合特殊场合 SQL语句参数是列名、表名
-->

Java中的日志组件(log4j)

只需要在library中导入log4j的jar包即可

#log4j日志级别如下:
#A:off     最高等级,用于关闭所有日志记录。
#B:fatal   指出每个严重的错误事件将会导致应用程序的退出。
#C:error   指出虽然发生错误事件,但仍然不影响系统的继续运行。
#D:warn    表明会出现潜在的错误情形。
#E:info    一般和在粗粒度级别上,强调应用程序的运行全程。
#F:debug   一般用于细粒度级别上,对调试应用程序非常有帮助。
#G:all     最低等级,用于打开所有日志记录。

#但log4j只建议使用4个级别,优先级从高到低分别是:
#error>warn>info>debug

log4j.rootLogger =debug,systemOut,logFile

#输出到控制台
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout
log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.systemOut.Target = System.out

#输出到文件
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n
log4j.appender.logFile.File = E:/log/log4j.log
log4j.appender.logFile.Encoding = UTF-8

#将日志输记录到MySQL数据库
#log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
#log4j.appender.logDB.layout = org.apache.log4j.PatternLayout
#log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
#log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/log4j?characterEncoding=utf-8
#log4j.appender.logDB.User = root
#log4j.appender.logDB.Password = root
#log4j.appender.logDB.Sql = INSERT INTO t_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('mybatis','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

当你看完这篇文章后已经可以使用Mybatis框架简单的操作数据库啦

还有一些标签的含义以及标签中的属性和字标签的含义在代码中都用注释标明了含义,下一篇文章中也有提及,这里就不做过多解释啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值