环境:
java1.8
mybatis-3.2.7
mysql-8.0.11
IDE:
IntelliJ IDEA 2018.2
=======================================按惯例稍微了解下Mybatis======================================
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
================================================================================================
=======================================正文开始==================================================
【1.新建项目并导包】
1.1 新建一个项目
1.2 当前值学习mybatis框架所以java项目就足够
1.3 起个名吧我就随便叫Mybatis-1了
1.4 项目建立完成长这样。接下来我们要导入jar包
1.5 导包方式有很多,不是本篇的重点,所以在此随便使用一种,导入本地的jar包(但真实项目中一般不会让你这么干的)。按图点就完事儿了
1.6 点完5就会出现下图框
提前下载好mybatis的jar包呀,此处版本为3.2.7,另外mybatis不是得跟数据库玩儿嘛所以还需要个数据库连接包,然后此处使用mysql数据库,就需要mysql-connector-java-x.x.x-bin.jar包,此处版本为5.1.7(上面说我的mysql版本是8.0.11,没有冲突,若有再联系博主或直接百度具体问题),我还导入一个junit-4.9,为了单元测试嘛。找到下载好的本地jar包后选中并点击OK关掉该窗口,再点击后面窗口的Apply和OK,在项目目录中看到External Libraries下有刚刚导入的包后就是成功了。
=======================================暂停了解下Mybatis架构图:重要!理清了对后续要干什么就会很清晰======================================
从下往上看吧。我们最终目的是对数据库进行操作,而直接跟数据库玩的是MappedStatement,MappedStatement是怎么来的呢?它是被封装在Executor中的一个对象,而Executor(执行者)又是SqlSession中的一个对象,换句话说,我们要和数据库玩,只需要有个SqlSession的实例就够了。继续往上爬,SqlSession是SqlSessionFactory(SqlSession工厂)生产出来的,而工厂要生产东西肯定需要原料吧,那么图中最上层的Mybatis配置文件就是原料,原料有两种:SqlMapConfig.xml和MapperX.xml,所以归根到底,我们得从SqlMapConfig.xml和MapperX.xml这两种文件开始写。
================================================================================================
【2.写丫的配置文件】
2.1 写丫的SqlMapConfig.xml
因为我懒,所以我直接写了个Mybatis配置文件的模板,这个Mybatis Config文件只有我机子上有,想用的时候直接新建就行。至于这款IDE怎么编辑模板文件,这不是重点,有需要百度就是,没有模板也不要紧,反正最后文件是这样的
代码也给你:
配置数据库连接池相信都懂,写上driver、url、username、password就是了。但是,真正开发应该也不会直接明文写上吧,所以来个配置文件吧,继续在src下新建个jdbc.properties文件
有了这个文件后就可以在sqlMapConfig.xml中引用了(注意路径问题)
2.2 写丫的Mapper.xml
为啥要mapper文件呢?因为对数据库的操作语句都是写这里的(Mybatis与Hibernate不同的是,后者把sql代码写java文件里)
然后与原始Dao开发方式不同的是,这里我使用动态代理开发方式,解释起来又一堆相信想看理论的也不会点开这篇博文,所以直接操作起来吧
2.2.1 最初的最初,让我们先建好数据表:
新建user.sql文件内容如下:
/*Navicat MySQL Data TransferSource Server : localhost_3306Source Server Version : 80011Source Host : localhost:3306Source Database : mybatisTarget Server Type : MYSQLTarget Server Version : 80011File Encoding : 65001Date: 2018-11-14 10:33:27*/SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` date DEFAULT NULL COMMENT '生日', `sex` char(1) DEFAULT NULL COMMENT '性别', `address` varchar(256) DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
然后随便加几条数据进去吧
2.2.2 在src下建个文件夹pojo并写个User类(没有技术含量,但还得写是吧)
package pojo;import java.io.Serializable;import java.util.Date;public class User implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public Integer getId() { return id; } public void setId(Integer 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 + "]"; }}
可能你会疑问这是什么
这里我不告诉你,自己查去哈哈哈
2.2.3 在src下建个文件夹mapper并写个UserMapper接口(命名格式一般都这样,针对哪个实体类做数据库操作,就用实体类名+Mapper做接口名)
还得有个xml文件,名字叫UserMapper.xml,对,强制与接口名一致。UserMapper.xml文件还需要有文件头,这里直接提供:
2.3 关联sqlMapConfig.xml文件和Mapper.xml文件
如此编辑sqlMapConfig.xml文件(原理不表,本篇只说操作):
至此配置文件编写完成
【3.写功能并进行测试啦】
配置好环境了,接下来就是写实际的操作数据库的代码了
让我们想想,之所以要写接口是为了增添功能,所以
而Mapper.xml是为了具体写sql代码的,所以
随便想个功能吧,我们来做个根据用户id查用户所有信息的功能
3.1 在接口定义findUserById方法
findUserById方法的入参为Integer型,为啥呢,因为咱们不是要根据用户id查用户所有信息嘛,数据库中id类型就是整型。返回值是User
然后如果直接用sql语句查询,那应该使用select语句,整句应该是“select * from user where id = 多少多少”,所以UserMapper.xml应该这么写:
新建mapper标签,在其下新建select标签,id要和接口中方法名一致,parameterType要和入参类型一致,resultType要和返回值类型一致。
然后要在select标签下写刚刚那句sql语句,条件查询中使用#来取值,大括号内任填 #{id}、#{uid}、#{userid}什么的都OK
3.2 测试啦
在src下新建test包,新建测试类TestMabatis(名字自己瞎起)
---恢复内容结束---
环境:
java1.8
mybatis-3.2.7
mysql-8.0.11
IDE:
IntelliJ IDEA 2018.2
=======================================按惯例稍微了解下Mybatis======================================
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
================================================================================================
=======================================正文开始==================================================
【1.新建项目并导包】
1.1 新建一个项目
1.2 当前值学习mybatis框架所以java项目就足够
1.3 起个名吧我就随便叫Mybatis-1了
1.4 项目建立完成长这样。接下来我们要导入jar包
1.5 导包方式有很多,不是本篇的重点,所以在此随便使用一种,导入本地的jar包(但真实项目中一般不会让你这么干的)。按图点就完事儿了
1.6 点完5就会出现下图框
提前下载好mybatis的jar包呀,此处版本为3.2.7,另外mybatis不是得跟数据库玩儿嘛所以还需要个数据库连接包,然后此处使用mysql数据库,就需要mysql-connector-java-x.x.x-bin.jar包,此处版本为5.1.7(上面说我的mysql版本是8.0.11,没有冲突,若有再联系博主或直接百度具体问题),我还导入一个junit-4.9,为了单元测试嘛。找到下载好的本地jar包后选中并点击OK关掉该窗口,再点击后面窗口的Apply和OK,在项目目录中看到External Libraries下有刚刚导入的包后就是成功了。
=======================================暂停了解下Mybatis架构图:重要!理清了对后续要干什么就会很清晰======================================
从下往上看吧。我们最终目的是对数据库进行操作,而直接跟数据库玩的是MappedStatement,MappedStatement是怎么来的呢?它是被封装在Executor中的一个对象,而Executor(执行者)又是SqlSession中的一个对象,换句话说,我们要和数据库玩,只需要有个SqlSession的实例就够了。继续往上爬,SqlSession是SqlSessionFactory(SqlSession工厂)生产出来的,而工厂要生产东西肯定需要原料吧,那么图中最上层的Mybatis配置文件就是原料,原料有两种:SqlMapConfig.xml和MapperX.xml,所以归根到底,我们得从SqlMapConfig.xml和MapperX.xml这两种文件开始写。
================================================================================================
【2.写丫的配置文件】
2.1 写丫的SqlMapConfig.xml
因为我懒,所以我直接写了个Mybatis配置文件的模板,这个Mybatis Config文件只有我机子上有,想用的时候直接新建就行。至于这款IDE怎么编辑模板文件,这不是重点,有需要百度就是,没有模板也不要紧,反正最后文件是这样的
代码也给你:
配置数据库连接池相信都懂,写上driver、url、username、password就是了。但是,真正开发应该也不会直接明文写上吧,所以来个配置文件吧,继续在src下新建个jdbc.properties文件
有了这个文件后就可以在sqlMapConfig.xml中引用了(注意路径问题)
2.2 写丫的Mapper.xml
为啥要mapper文件呢?因为对数据库的操作语句都是写这里的(Mybatis与Hibernate不同的是,后者把sql代码写java文件里)
然后与原始Dao开发方式不同的是,这里我使用动态代理开发方式,解释起来又一堆相信想看理论的也不会点开这篇博文,所以直接操作起来吧
2.2.1 最初的最初,让我们先建好数据表:
新建user.sql文件内容如下:
/*Navicat MySQL Data TransferSource Server : localhost_3306Source Server Version : 80011Source Host : localhost:3306Source Database : mybatisTarget Server Type : MYSQLTarget Server Version : 80011File Encoding : 65001Date: 2018-11-14 10:33:27*/SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` date DEFAULT NULL COMMENT '生日', `sex` char(1) DEFAULT NULL COMMENT '性别', `address` varchar(256) DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
然后随便加几条数据进去吧
2.2.2 在src下建个文件夹pojo并写个User类(没有技术含量,但还得写是吧)
package pojo;import java.io.Serializable;import java.util.Date;public class User implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public Integer getId() { return id; } public void setId(Integer 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 + "]"; }}
可能你会疑问这是什么
这里我不告诉你,自己查去哈哈哈
2.2.3 在src下建个文件夹mapper并写个UserMapper接口(命名格式一般都这样,针对哪个实体类做数据库操作,就用实体类名+Mapper做接口名)
还得有个xml文件,名字叫UserMapper.xml,对,强制与接口名一致。UserMapper.xml文件还需要有文件头,这里直接提供:
2.3 关联sqlMapConfig.xml文件和Mapper.xml文件
如此编辑sqlMapConfig.xml文件(原理不表,本篇只说操作):
至此配置文件编写完成
【3.写功能并进行测试啦】
配置好环境了,接下来就是写实际的操作数据库的代码了
让我们想想,之所以要写接口是为了增添功能,所以
而Mapper.xml是为了具体写sql代码的,所以(注意:mapper标签一定要指定namespace属性,值为该xml文件对应的mapper接口)
随便想个功能吧,我们来做个根据用户id查用户所有信息的功能
3.1 在接口定义findUserById方法
findUserById方法的入参为Integer型,为啥呢,因为咱们不是要根据用户id查用户所有信息嘛,数据库中id类型就是整型。返回值是User
然后如果直接用sql语句查询,那应该使用select语句,整句应该是“select * from user where id = 多少多少”,所以UserMapper.xml应该这么写:
新建mapper标签,在其下新建select标签,id要和接口中方法名一致,parameterType要和入参类型一致,resultType要和返回值类型一致。
然后要在select标签下写刚刚那句sql语句,条件查询中使用#来取值,大括号内任填 #{id}、#{uid}、#{userid}什么的都OK
3.2 测试啦
在src下新建test包,新建测试类TestMabatis,写个测试方法test(名字自己瞎起)
回忆一下要操作数据库需要什么——SqlSession,SqlSession怎么来——SqlSessionFactory,而SqlSessionFactory是由SqlSessionFactoryBuilder的实例使用build方法构建出来的,所以代码这么写
生产一个东西需要原料,所以build方法也就需要入参,有如上图所示一堆,可以用字节流、字符流、配置等作为参数,这里我就用字节流吧,以sqlMapConfig.xml文件作为原料,从Resources中构造字节流
.最后也可以获得session了
使用动态代理开发,所以mapper该出场了。session.getMapper获得mapper,然后mapper就可以调用我们在接口定义的方法,所相应的数据库操作了。
最终代码如下:查询id为10的用户
数据库数据如此:
控制台: