1 Mybatis快速入门
1.1 框架介绍
- 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求!
- 如图:
1.2 ORM介绍
- ORM(Object Relational Mapping): 对象关系映射
- 指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。
- 如图:
- 具体映射关系如下图:
1.3 原始jdbc操作(查询数据)
小插曲: 父类引用指向子类对象,不能子类引用指向父类对象,是经典的语法错误.
1.4原始jdbc操作(插入数据)
1.5 原始jdbc操作的分析
- 原始 JDBC 的操作问题分析
1.频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能。
- sql 语句在代码中硬编码,如果要修改 sql 语句,就需要修改 java 代码,造成代码不易维护。
- 查询操作时,需要手动将结果集中的数据封装到实体对象中。
- 增删改查操作需要参数时,需要手动将实体对象的数据设置到 sql 语句的占位符。
- 原始 JDBC 的操作问题解决方案
1.使用数据库连接池初始化连接资源。
- 将 sql 语句抽取到配置文件中。
- 使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射
1.6 什么是Mybatis
mybatis 是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
mybatis通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
MyBatis官网地址:http://www.mybatis.org/mybatis-3/
2 入门案例
2.1 目标
使用mybatis查询user
表中的所有数据,并且将查询结果保存到List集合中
第一步:创建数据库表
CREATE TABLE `user`( uid INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(100) NOT NULL, PASSWORD VARCHAR(50) NOT NULL, email VARCHAR(50), birthday DATE ); INSERT INTO `user` (NAME,PASSWORD,email,birthday) VALUES("尼古拉斯赵四",'123456','nglszs@qq.com','1888-09-02'); INSERT INTO `user` (NAME,PASSWORD,email,birthday) VALUES("尼古拉斯赵五",'123456','nglszw@qq.com','1889-09-03'); INSERT INTO `user` (NAME,PASSWORD,email,birthday) VALUES("尼古拉斯赵六",'123456','nglszl@qq.com','1890-09-04'); INSERT INTO `user` (NAME,PASSWORD,email,birthday) VALUES("尼古拉斯赵七",'123456','nglszq@qq.com','1891-09-05');
第二步:导入jar包
- mysql-connector-java-5.1.37-bin.jar
- mybatis-3.5.3.jar
- log4j-1.2.17.jar
第三步:创建实体类
package cn.oldlu.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private Integer uid; private String name; private String password; private String email; private String birthday;//数据库中是Date类型,java中可以是Date,也可以是String类型 }
第四步:创建mybatis配置文件
在src或者resource目录创建映射文件,名字叫UserMapper.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命名空间 可以认为是这个配置文件的标识--> <mapper namespace="UserMapper"> <select id="selectAll" resultType="cn.oldlu.domain.User"> SELECT * FROM `user`; </select> </mapper>
在src或者resources目录创建主配置文件,名字叫mybatis-config.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> <!--数据源环境--> <environments default="developement"> <environment id="developement"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.254.128:3306/mysql03"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--加载映射文件--> <mappers> <mapper resource="UserMapper.xml"></mapper> </mappers> </configuration>
第五步:编写测试类
注意:
使用的是org.apache.ibatis包下的Resources类
package cn.oldlu; import cn.oldlu.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.text.SimpleDateFormat; public class UserMapperTest { @Test public void selectAll() throws Exception{ /*1.读取配置文件并创建SqlSessionFactory*/ SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml")); /*2.获取sqlSession[这是mybatis的重要API, 使用它可以操作数据库crud*/ SqlSession sqlSession = sqlSessionFactory.openSession(); /* 3.执行查询所有 第一参数:指的是sql语句的位置,使用namespace.statementId表示 */ List<User> users =sqlSession.selectList("UserMapper.selectAll"); for (User user : users) { System.out.println(user); } /*4.释放资源*/ sqlSession.close(); } }
3 映射文件介绍
本案例中映射文件的名字叫UserMapper.xml
select 标签可以有id,parameterType,resultType属性 update,delete,insert标签只能有id和parameterType属性 如果SQL需要一个参数,parameterType可以是String,Integer,但是如果SQL中用到多个值,只能传入对象