代码间接放在Github仓库【https://github.com/Damaer/Myb...】,可间接运行,就不占篇幅了。

1.框架是什么

  • 框架(Framework)是整个或局部零碎的可重用设计,体现为一组形象构件及构件实例间交互的办法;另一种定义认为,框架是可被利用开发者定制的利用骨架。前者是从利用方面而后者是从目标方面给出的定义。
  • 一个框架是一个可复用的设计构件,它规定了利用的体系结构,说明了整个设计、合作构件之间的依赖关系、责任调配和管制流程,体现为一组抽象类以及其实例之间合作的办法,它为构件复用提供了上下文(Context)关系。因而构件库的大规模重用也须要框架。
  • 集体了解:框架最重要的是把咱们罕用的,能够重复使用的性能形象进去,不须要咱们去反复写,咱们只须要调用,或者依照规定配置,依照规定应用就能够了。这样的毛病是很多时候咱们不晓得为什么能够这样子应用,外面实现的细节被屏蔽掉了,这也是很多初学者很懵逼的中央,这时候追根问底就有肯定必要性了。

2.Mybatis的介绍

Mybatis原本是Apache的一个开源我的项目iBatis,这个我的项目2010年由Apache迁徙到了Google,更名为Mybatis,2013年正式迁徙到Github

Mybatis是一个java中一个长久层的框架,在外面封装了jdbc操作,如果还不理解java如何应用jdbc拜访数据库,那么能够查看这篇文章,封装使开发者只须要把精力放在开发sql语句上,不必去注册驱动,创立Connection,配置Statement,本人写代码治理事务等等。

Mybatis通过xml或者注解的形式将须要执行的statement配置好,通过映射将java对象与sql中的动静参数一起生成最终的sql语句,执行完之后返回对象,其中也是映射的后果。

3.Mybatis和Hibernate比照

1.Hibernate是全自动的ORM框架,也就是齐全实现了POJO和数据库表之间的映射,会主动生成SQL。然而Mybatis不会主动生成,SQL还是须要本人写,然而映射关系框架会主动解决,这样一个益处就是能够看失去SQL,很多时候零碎主动生成SQL并不是高效的,咱们有时候须要优化SQL,或者一些简单的查问可能自动化的很难做到,毛病就是须要花工夫写。

2.应用XML文件进行配置,拆散了了sql与代码,这样比拟容易保护。
3.Mybatis是一个轻量级的框架。学习老本比Hibernate低很多,jar包依赖也很少,上手比拟快。

4.Mybatis的结构图:

Mybatis的运行机制:咱们通过配置Mybatis.xml(外面配置好数据库,须要扫描的mapper.xml文件等),程序会主动扫描配置好的mapper文件,当咱们申请一个接口(申请数据库),接口会间接映射到对应的sql标签,同时将咱们所写的配置文件读取并将数据库字段与对象属性匹配(这也是映射,如果不统一,须要本人手写映射关系),将sql参数传进去,而后执行相干的sql,返回时又做了一次映射,把对象返回给咱们。当然,这么形容是很外表的,因为mybatis还有事务,缓存等方面,以上只是大略。

5.IDEA创立第一个程序

这里咱们会应用idea创立我的项目,如果maven没有配置好,请参考:https://blog.csdn.net/aphysia...

5.1创立mysql数据库

应用一下的命令行:

CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(20) NOT NULL , `age` INT NOT NULL , `score` DOUBLE NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM; 

5.2 应用idea创立我的项目(Maven)

我的项目结构图(bean上面放的类对应咱们的数据库外面的student表,也就是它的一个实体类,dao包上面放着咱们的数据库的操作,resources上面放着咱们的xml或者各种资源):

new --> Project -->点击Maven

点击next,GroupId,ArtifactId能够本人指定,点击下一步

本人指定project name(我的项目名),点击finish

pom.xml外面增加依赖,每一个<dependency></dependency>之间都是一种依赖包,选中我的项目右键--> Maven --> Reimport,这样就能够下载咱们所须要的依赖了:

    <dependencies>        <!-- mybatis外围包 -->        <dependency>            <groupId>org.mybatis</groupId>            <artifactId>mybatis</artifactId>            <version>3.3.0</version>        </dependency>        <!-- mysql驱动包 -->        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.29</version>        </dependency>        <!-- junit测试包 -->        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.11</version>            <scope>test</scope>        </dependency>        <!-- 日志文件治理包 -->        <dependency>            <groupId>log4j</groupId>            <artifactId>log4j</artifactId>            <version>1.2.17</version>         </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-api</artifactId>            <version>1.7.12</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>1.7.12</version>        </dependency>    </dependencies>

为了能实现日志的打印性能,咱们在pom.xml文件中曾经引入了日志dependency,在这里还须要在resources文件夹下新建配置log4j.properties文件,具体配置代表什么意思,能够参考log4j 与log4j2详解

log4j.properties
log4j.rootLogger=DEBUG, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n#log4j.appender.R=org.apache.log4j.DailyRollingFileAppender    #log4j.appender.R.File=../logs/service.log    #log4j.appender.R.layout=org.apache.log4j.PatternLayout    #log4j.appender.R.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n    #log4j.logger.com.ibatis = debug    #log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug    #log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug    #log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug    #log4j.logger.java.sql.Connection = debug    log4j.logger.java.sql.Statement = debuglog4j.logger.java.sql.PreparedStatement = debuglog4j.logger.java.sql.ResultSet =debug

配置好这些之后,后面结构图下面写到有一个mybatis.xml文件,外面配置了运行的环境(对于数据库的连贯),连贯的数据库能够配置多个,然而必须指定应用哪一个,这样做的起因的世界在xml文件进行批改不须要从新编译,更换数据库比较简单,除此之外,外面还须要配置mapper.xml,也就是映射文件,咱们要通知它,咱们将sql配置写在哪个文件。

mybatis.xml
<?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>          <!-- 配置运行环境 -->          <!-- default 示意默认应用哪一个环境,能够配置多个,比方开发时的测试环境,上线后的正式环境等 -->          <environments default="mysqlEM">                        <environment id="mysqlEM">                  <transactionManager type="JDBC">                          </transactionManager>                  <dataSource type="POOLED">                      <property name="driver" value="com.mysql.jdbc.Driver"/>                      <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>                      <property name="username" value="root"/>                      <property name="password" value="123456"/>                  </dataSource>              </environment>              <environment id="testEM">                  <transactionManager type="JDBC">                  </transactionManager>                  <dataSource type="POOLED">                      <property name="driver" value="com.mysql.jdbc.Driver"/>                      <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>                      <property name="username" value="root"/>                      <property name="password" value="123456"/>                  </dataSource>              </environment>          </environments>          <!-- 注册映射文件 -->          <mappers>              <mapper resource="mapper.xml"/>          </mappers>  </configuration>

配置好mybatis.xml文件咱们就须要写sql语句,依据下面的mybatis.xml,咱们须要写mapper.xml文件,上面的namespace当初能够随便命名,因为只有一个mapper.xml文件,sql标签的id没有反复,执行时就是依据id来查找的,同时这里parameterType对应的是参数类型,类型要写带残缺路径名的类:

mapper.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="abc">    <insert id="insertStudent" parameterType="bean.Student">        insert into student(name,age,score) values(#{name},#{age},#{score})    </insert></mapper>

在bean包上面创立与数据库对应的Student类【在bean包下】(这里先把属性名字和数据库的字段名统一,如果不统一须要本人写映射),留神外面的办法咱们须要实现set和get办法,这个在IDEA外面,关上以后类,右键--> Gernarate -->setter and getter全选就能够生成。

Student.class
package bean;public class Student {    // id属性    private Integer id;    // 名字属性    private String name;    // 年龄属性    private int age;    //分数属性    private double score;    // 构造方法,除了id,因为咱们的id在数据库中是自增的    public Student( String name, int age, double score) {        super();        this.name = name;        this.age = age;        this.score = score;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public double getScore() {        return score;    }    public void setScore(double score) {        this.score = score;    }    @Override    public String toString() {        return "Student [id=" + id + ", name=" + name + ", age=" + age                + ", score=" + score + "]";    }    }

在这里咱们须要写一个接口,来示意操作学生信息,先写一个插入学生信息的接口,那么必定是传一个学生对象进去。

IStduent.class
package dao;import bean.Student;public interface IStudentDao {    public void insertStu(Student student);}

上面就是接口的实现类(重点):

StudentDaoImpl.class
package dao;import java.io.IOException;import java.io.InputStream;import bean.Student;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;public class StudentDaoImpl implements IStudentDao {    // 实现插入的接口办法    public void insertStu(Student student) {        try {            InputStream inputStream;            // 读取配置信息的文件            inputStream = Resources.getResourceAsStream("mybatis.xml");            // 因为这个文件外面配置了mapper.xml,框架会帮咱们扫描这些mapper.xml,上面是初始化一个SqlSessionFactory对象            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);            // 工厂会获取一个SqlSession对象            SqlSession sqlSession=sqlSessionFactory.openSession();            // 通过这个对象能够查找之前mapper.xml外面配置好的sql的id与 `insertStudent`相等的,执行对应的sql            sqlSession.insert("insertStudent",student);        } catch (IOException e) {            e.printStackTrace();        }    }    }

测试方法,如果不理解Junit测试请参考Junit测试详解:

MyTest.class
import bean.Student;import dao.IStudentDao;import dao.StudentDaoImpl;import org.junit.Before;import org.junit.Test;public class MyTest {    private IStudentDao dao;    @Before    public void Before(){        dao=new StudentDaoImpl();    }    @Test    public void testInsert(){        Student student=new Student("1ADAS",23,94.6);        dao.insertStu(student);    }}

测试的后果,从最初三行咱们能够看到执行的sql语句,以及参数等:

5.3 应用Eclipse,MyEclipse创立我的项目(Maven)

区别不大,间接创立java Project,如果上面没有lib这个文件,就要新建一个,而后把须要的包导(复制粘贴)进去,选中lib上面所有的包,右键-->Build Path--> Add to Path

上面是myEclipse上面的结构图,代码没有扭转,须要本人下载相干的包

申明:这样的写法不是最好的,然而这是初学者最容易接受的写法,前面会缓缓的精简,咱们到时候不须要写接口的实现类,同时会把对于sqlSessionFactory相干的操作抽取进去成为一个工具类,就不必写那么多雷同的代码了。

6.总结

最初总结一下下面写法的思路:

1.先读取mybatis.xml文件流inputStream,这是最重要的配置文件,外面的内容配置的是数据库环境,比方连贯哪一个数据库链接,除此之外,还有注册映射文件,比方扫描哪一个文件,咱们配置的是/mapper.xml
2.通过inputStream创立sqlSessionFactory,也就是sql会话工厂,所谓工厂,必定是用来发明或者制作sqlSession的。
3.sqlSessionFactory.openSession()能够关上一个sqlSession,也就是sql会话,取得这个操作数据库的会话窗口。
4.通过sqlSession提供的办法去操作数据库,提供办法名,和参数即可。比方 sqlSession.insert("insertStudent", student);,这个insertStudent从哪里冒出来的?当然是后面扫描mapper.xml的时候,mapper.xml外面配置的,insertStudent是id,须要是惟一的,就能通过这个找到对应的sql来执行。
5.提交会话,commit,不肯定须要,具体看数据库的类型.
6.敞开会话,sqlSession.close();

代码曾经放在:https://github.com/Damaer/Myb...
此文章仅代表本人(本菜鸟)学习积攒记录,或者学习笔记,如有侵权,请分割作者删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有谬误之处,还望指出,感激不尽~

技术之路不在一时,山高水长,纵使迟缓,驰而不息。