快速入门Mybatis
框架概述
什么是框架
它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率
三层架构
- UI(表现层):与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。
- BLL(业务逻辑层):UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。
- DAL(数据访问层/持久层):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。
- Entity(实体类):贯穿于三层,在三层之间传递数据;实现面向对象思想中的"封装"(将数据表中的字段封装为类中的属性)。
- 参考:blog.csdn.net/hanxuemin12…
MVC
参考:www.cnblogs.com/whgk/p/6435…
持久层
持久层解决方案
- JDBC技术:Connection;PreparedStatement;ResultSet
- Spring的JdbcTemplate:Spring中对jdbc的简单封装
- Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
- 以上这些都不是框架:JDBC是规范;Spring的JdbcTemplate和Apache的DBUtils都只是工具类。没有全面地解决问题。
jdbc 问题分析
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。 2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。 3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。 4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。
MyBatis 框架概述
- mybatis是一个持久层框架,用java编写的。它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程它使用了ORM思想实现了结果集的封装。
- ORM:Object Relational Mappging 对象关系映射,简单的说,就是把数据库表及字段和实体类及实体类的属性对应起来让我们可以操作实体类就实现操作数据库表。
Mybatis 框架入门
创建数据库及表
CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `birthday` datetime default NULL COMMENT '生日', `sex` char(1) default NULL COMMENT '性别', `address` varchar(256) default NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (41,'老王','2018-02-27 17:47:08','男','北京'), (42,'小二王','2018-03-02 15:09:37','女','北京金燕龙'), (43,'小二王','2018-03-04 11:34:34','女','北京金燕龙'), (45,'传智播客','2018-03-04 12:04:06','男','北京金燕龙'), (46,'老王','2018-03-07 17:37:26','男','北京'), (48,'小马宝莉','2018-03-08 11:44:00','女','北京修正');
环境搭建
1. 创建maven工程并导入坐标
- mybatis使用最新版本
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.ow</groupId> <artifactId>mybatis01</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
2. 创建实体类和dao的接口
- 实体类继承:implements Serializable
public class User implements Serializable{ //实体类中的属性需和数据库表中的字段一一对应 private Integer id; private String username; private Date birthday; private String sex; private String address; //省略get/set方法,和toString方法(alt+insert) 复制代码 public interface IUserDao { // 查询返回得到的所有符合条件的实体类 List<User> findAll(); }
3. 创建Mybatis的主配置文件(SqlMapConifg.xml)
- 文件名称不是固定的
- 在resources文件夹下新建File
<?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> <!-- 配置 mybatis 的环境 --> <environments default="mysql"> <!-- 配置 mysql 的环境 --> <environment id="mysql"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置连接数据库的信息:用的是数据源(连接池) --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatistest?serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!-- 告知 mybatis 映射配置的位置,,映射配置文件指的是每个dao的配置文件 --> <mappers> <!-- 这里配置的是接口IUserDao的配置文件 --> <mapper resource="com/ow/dao/IUserDao.xml"/> </mappers> </configuration>
4. 编写log4j文件(log4j.properties)
- 在resources文件夹下新建File
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=G:\\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
5. 创建映射配置文件(IUserDao.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"> <!--namespace指的是dao接口的全限定类名--> <mapper namespace="com.ow.dao.IUserDao"> <!--配置查询所有 其中id不能乱写必须是dao接口中的方法名称 resultType写的是实体类的全路径--> <select id="findAll" resultType="com.ow.domain.User"> select * from user </select> </mapper>
6. 编写测试文件
- 在test-Java文件夹下新建测试文件并运行
public class MybatisTest { public static void main(String[] args)throws Exception { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建 SqlSessionFactory 的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.使用构建者创建工厂对象 SqlSessionFactory SqlSessionFactory factory = builder.build(in); //4.使用 SqlSessionFactory 生产 SqlSession 对象 SqlSession session = factory.openSession(); //5.使用 SqlSession 创建 dao 接口的代理对象 IUserDao userDao = session.getMapper(IUserDao.class); //6.使用代理对象执行查询所有方法 List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } //7.释放资源 session.close(); in.close(); } }
注意事项
- 创建IUserDao.xml 和 IUserDao.java时,在Mybatis中,持久层的操作接口名称和映射文件也叫做:Mapper。因此IUserDao 和 IUserMapper是一样的。所以看到IUserMapper.java实际上就是IUserDao.java。
- 在idea中无法通过“com.ow.xxx”创建多级目录,但是可以创建多级包。因此需要创建多级目录,需逐个创建
- mybatis的映射配置文件位置(IUserDao.xml)必须和dao接口的包结构相同。
- 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
- 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
- 不要忘记在映射配置中告知mybatis要封装到哪个实体类中
- 若通过不使用dao的xml配置文件实现,而通过注解的方式实现:
1. 把IUserDao.xml移除,
2. 在dao接口的方法上使用@Select注解,并且指定SQL语句
3. 同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
- mybatis可以通过dao实现类的方式运行,但为了开发方便,一般不写实现类,而通过注解或者xml文件配置的方式
欢迎关注我的公众号,了解一个学设计却做了运营最后成了数据分析师并努力成为大数据工程师的女程序员的成长之路。

浙公网安备 33010602011771号