MyBatis-Day1

第1章 框架概述

mybatis是三层架构中的持久层的框架,与数据库打交道的dao接口,执行数据库CRUD操作。

mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

之前有基础的jdbc技术,后来学了Sprng的JDBCTemplate对JDBC做的简单封装,

private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());//这个JDBCUtils是使用Druid连接池

String sql = "select * from user";

List<User> users = template.query(sql, new BeanPropertyRowMapper<User>(User.class));
但是都只是工具类,并不是框架。框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。

作为持久层的框架,还有一个封装程度更高的框架就是Hibernate,但这个框架因为各种原因目前在国内的 流行程度下降太多,现在公司开发也越来越少使用。目前使用 Spring Data 来实现数据持久化也是一种趋势。

mybatis通过xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。 

第2章 Mybatis 框架快速入门

第一步:创建maven工程并导入坐标

不使用骨架new了一个maven project,名为day01_eesy_01mybatis

创建1个数据库,名为eesy,表名user

再回到IDEA修改pom.xml 增加打包方式为jar,然后导入mybatis的坐标,是dependeceis依赖,再加一个必须的mysql-connector-java,和一些非必须的log4j,junit。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.xxw</groupId>
 8     <artifactId>day01_eesy_01mybatis</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10     <packaging>jar</packaging>
11 
12     <dependencies>
13         <dependency>
14             <groupId>org.mybatis</groupId>
15             <artifactId>mybatis</artifactId>
16             <version>3.4.5</version>
17         </dependency>
18         <dependency>
19             <groupId>mysql</groupId>
20             <artifactId>mysql-connector-java</artifactId>
21             <version>5.1.32</version>
22         </dependency>
23         <dependency>
24             <groupId>junit</groupId>
25             <artifactId>junit</artifactId>
26             <version>4.12</version>
27         </dependency>
28     </dependencies>
29 
30 
31 </project>
pom.xml

竟然还挺顺利。不知道为啥5.4上午那个maven_mysql项目测试连接数据库取数据就是用不了@Test注解写测试类,不知道为啥5.4下午那个导入travel的pom后dependence全是红波浪,希望这个工程可以别出错了...

第二步:创建实体类和dao接口

新建实体类包domain,写User类

 1 package com.xxw.domain;
 2 
 3 import java.io.Serializable;
 4 import java.util.Date;
 5 
 6 public class User implements Serializable {//为了方便保存和传输?IO那里好像是object对象类的传输需要实现序列化接口
 7     //用包装类是因为包装类可以NULL
 8     private Integer id;
 9     private String username;
10     private Date birthday;
11     private String sex;
12     private String address;
13 
14     public Integer getId() {
15         return id;
16     }
17 
18     public void setId(Integer id) {
19         this.id = id;
20     }
21 
22     public String getUsername() {
23         return username;
24     }
25 
26     public void setUsername(String username) {
27         this.username = username;
28     }
29 
30     public Date getBirthday() {
31         return birthday;
32     }
33 
34     public void setBirthday(Date birthday) {
35         this.birthday = birthday;
36     }
37 
38     public String getSex() {
39         return sex;
40     }
41 
42     public void setSex(String sex) {
43         this.sex = sex;
44     }
45 
46     public String getAddress() {
47         return address;
48     }
49 
50     public void setAddress(String address) {
51         this.address = address;
52     }
53 
54     @Override
55     public String toString() {
56         return "User{" +
57                 "id=" + id +
58                 ", username='" + username + '\'' +
59                 ", birthday=" + birthday +
60                 ", sex='" + sex + '\'' +
61                 ", address='" + address + '\'' +
62                 '}';
63     }
64 }
User.java

新建持久层包dao,写IUserDao接口里面写findAll()方法

 1 package com.xxw.dao;
 2 
 3 import com.xxw.domain.User;
 4 
 5 import java.util.List;
 6 
 7 //持久层接口
 8 public interface IUserDao {
 9     /**
10      * 查询所有操作
11      */
12     List<User> findAll();
13 }
IUserDao接口

第三步:创建Mybatis的主配置文件SqlMapConfig.xml

resource下面新建xml文件SqlMapConfig.xml,复制头信息粘贴时报红了,我选择一个fecth提示莫名其妙解决了...

然后在config标签里配置<environement>配置mysql的环境,JDBC和连接池,连接数据库的用户名密码等等(。。。之前druid是pro文件

上面是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>
    <!--这是mubatis的主配置文件-->
    <!--配置环境-->
    <environments default="mysql">
        <!--配置mysql的环境-->
        <environment id="mysql">
            <!--配置事务类型-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源(连接池)-->
            <dataSource type="POOLED">
                <!--配置连接数据库的基本信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/eesy"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
    <mappers>
        <mapper resource="com/xxw/dao/IUserDao.xml"/>
    </mappers>
</configuration>
SqlMapConfig.xml

第四步:创建映射配置文件IUserDao.xml

但现在还没有映射配置文件,去resouse下面去新建一个包com.xxw.dao写一个IUseDao.xml,粘贴资料里的头文件代码,又红了还用fecth解决...

然后配置<mapper>标签,看起来好像是把dao接口实现类的代码放到这xml文件里了...还在这里面写sql语句...

<?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="com.xxw.dao.IUserDao">

    <!--配置查询所有-->
    <select id="findAll" resultType="com.xxw.domain.User">
        SELECT * FROM user
    </select>

</mapper>

 

到此,框架搭完了。

注意事项:

 

 

 难怪IUserDao.xml那么像是个dao接口实现类...

编写测试类

(5.4上午的maven_mysql那里没有实现...@Test注解用不了,不知道这里能否成功...

 

【果然问题出现呵呵呵...就是pugins和denpendence全是红波浪线,jar包根本导不进来尽管本地明明就有。(现在依然是不知道为什么)

总之再来回换maven版本换本地仓库换镜像网站换默认地址换了两个同学的setting文件等等等操作后,最后同学远程帮我在d盘新建maven文件夹,解压最初使用的3.5.2版maven,新建repo本地仓库文件夹但不放入任何jar包,复制粘贴她的setting.xml文件里的镜像,一通操作后,发现是maven缺少阿里云证书所以总是下载失败,在runner里加上-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true,plugins终于解决了一部分红波浪线,剩下的照着版本号去资料包里找复制到repo里面也好了。但是dependeces又是红波浪...最后clean,install轮着来一遍,下载成功就可以了,然后注释掉刷新,再取消注释,红波浪线就解决了。。。原理还是不太懂,不报错不容易,且行且珍惜。。我们辛苦了真是辛苦了 TVT 】

回到工程这边来,可以看到一打开day1的项目plugins一片红,明明写了的dependencies根本都没有在右边出现。(挺好了之前远程时一度连plugins都没有出现)

因为我现在已经换了地址,首先去修改setting里的地址,现在是D盘maven文件夹下面。先解决plugins的问题把dependenceis注释掉。

按完apply有边的波浪线就消失了,大概是和同学远程那次实验的maven项目都下好了所以很快

然后把dependenceis取消注释弄回来,有些红了有些没红也不知道咋回事。右边一个dependence都没出现。。。

按完右上角reimport刷新右边倒是出现了,只是又是带着一大片波浪线们...

按一下clean命令,成功了。(之前一度clean命令都一直fail到让我怀疑人生,后来想想应该就是plugins红波浪们没解决就用不了mvn clean...也不知为啥

再按install命令试试看会不会有download等等出现。

download了一大堆,build success了,撒花。此时虽然有边的dependenceis还是一大片红波浪,但project已经悄悄出现一个绿色小勾勾

注释掉刷新,再取消注释刷新,壮观的红波浪线们终于消失了。顺便可以看一下项目结构

都在repo本地仓库里,依赖成功导入完成。(就是不知道可不可以复用?下次能否先找本地仓库别重复下载?

 

回到编写测试类上,

把资料里的log4j.pro拷贝到res下面(干啥?

在test的java包下新建com.xxw.test包新建MybatisTest测试类,没用@Test,用main方法

/**
 * mybatis的入门案例
 */
public class MybatisTest {
    //先不用注解 用main
    public static void main(String[] args) throws Exception{
        //1.读取配置文件
        InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");//我这里要加一个.class
        //2.通过读取配置文件,创建SqlSessionFactory工厂
        //但是SqlSessionFactory是个接口,不能new出对象,所以要引入builder,具体操作见代码
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(in);
        //3.使用工厂生产SqlSession对象(工厂生产(但不直接,需要seesion)IUserDao接口代理对象传入配置文件in的信息去执行dao方法
        SqlSession session = factory.openSession();
        //4.使用SqlSession创建Dao接口的代理对象
        IUserDao userDao = session.getMapper(IUserDao.class);
        //5.使用代理对象执行方法
        List<User> users = userDao.findAll();
        for(User user:users){
            System.out.println(user);
        }
        //6.释放资源
        session.close();
        in.close();
    }
}
MybatisTest.java

运行成功了。这里面用了构建者(new出构建者builder直接用它的.build方法就可以拿到对象,我们给钱就是),工厂(不用new对象了用factory.获取对象的方法)和代理(不写实现类也实现原接口的功能,给接口类的class)设计模式,运行结果是把数据库中User表数据用List和User对象取出来了

User{id=41, username='老王', birthday=Tue Feb 27 17:47:08 CST 2018, sex='男', address='北京'}
User{id=42, username='小二王', birthday=Fri Mar 02 15:09:37 CST 2018, sex='女', address='北京金燕龙'}
User{id=43, username='小二王', birthday=Sun Mar 04 11:34:34 CST 2018, sex='女', address='北京金燕龙'}
User{id=45, username='传智播客', birthday=Sun Mar 04 12:04:06 CST 2018, sex='男', address='北京金燕龙'}
User{id=46, username='老王', birthday=Wed Mar 07 17:37:26 CST 2018, sex='男', address='北京'}
User{id=48, username='小马宝莉', birthday=Thu Mar 08 11:44:00 CST 2018, sex='女', address='北京修正'}

 

Mybatis使用注解开发,但好像不是@Test...

首先把之前resources的IUserDao.xml删掉了,因为注解可以配置(???注解如何实现接口实现类写sql?

是mybatis框架的注解,使用注解写配置取代xml,@Select就是自带的。。。点击源码可以看,但知道怎么用更重要,就是在IUserDao接口的方法上写个注解,注解内容是sql语句

//持久层接口
public interface IUserDao {
/**
* 查询所有操作
*/
@Select("selrct * from user")
List<User> findAll();
}

SqlMapConfig.xml改映射配置文件mappers标签

<mappers>
<!--<mapper resource="com/xxw/dao/IUserDao.xml"/>-->
<mapper class="com.xxw.dao.IUserDao"/>
</mappers>

其他都不变,@select比写资源文件IUseDao.xml方便一些,运行结果不变。

 

 

 

第3章 自定义 Mybatis 框架 (为了分析mybatis)

以上是mybatis框架分析图

 

后面今天看不完了day1先欠着待更新

 

 

 


posted @ 2020-05-05 22:54  xinxinpang  阅读(170)  评论(0编辑  收藏  举报