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。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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>
【竟然还挺顺利。不知道为啥5.4上午那个maven_mysql项目测试连接数据库取数据就是用不了@Test注解写测试类,不知道为啥5.4下午那个导入travel的pom后dependence全是红波浪,希望这个工程可以别出错了...】
第二步:创建实体类和dao接口
新建实体类包domain,写User类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
新建持久层包dao,写IUserDao接口里面写findAll()方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
第三步:创建Mybatis的主配置文件SqlMapConfig.xml
在resource下面新建xml文件SqlMapConfig.xml,复制头信息粘贴时报红了,我选择一个fecth提示莫名其妙解决了...
然后在config标签里配置<environement>配置mysql的环境,JDBC和连接池,连接数据库的用户名密码等等(。。。之前druid是pro文件
上面是mybatis的主配置文件,还要写一个映射配置文件的代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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>
第四步:创建映射配置文件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方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 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(); } }
运行成功了。这里面用了构建者(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)![](https://img2020.cnblogs.com/blog/1702935/202005/1702935-20200505223708602-563831150.png)
以上是mybatis框架分析图
后面今天看不完了day1先欠着待更新