1. 什么是mybatis?
-
mybatis简介
-
MyBatis 是一款优秀的持久层框架
-
它支持定制化 SQL、存储过程以及高级映射。
-
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
-
MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
-
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。
-
2013年11月迁移到Github。
-
-
mybatis的优点
-
传统的JDBC代码复杂,而mybatis灵活度高、简单易学。
-
SQL语句和Java代码分离,提高可维护性
-
提供映射标签,支持对象与数据库的orm字段关系映射
-
提供对象关系映射标签,支持对象关系组建维护
-
提供xml标签,支持编写动态sql。
-
2. 编写第一个mybatis程序
-
首先准备一个数据库
create database mybatis; use mybatis; create table if not exists `user`( `id` int(10) not null auto_increment comment '编号', `name` varchar(30) default null commenT '姓名', `pwd` varchar(30) default null comment '密码', primary key(`id`) )engine=innodb default charset=utf8; insert into `user`(`id`, `name`, `pwd`) values (1, '张三', '123456'), (2, '李四', '123456'), (3, '王五', '123456'), (4, '赵六', '123456'), (5, '钱七', '123456'), (6, '老八', '123456')
-
建立一个普通maven项目,导入mybatis依赖、junit依赖、jdbc驱动。
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies>
-
编写对应的pojo实体类,这里可以没有有参构造函数,一定要写空构造器。因为mybatis后期加载实体类的时候是通过反射来加载的。
package com.ljq.pojo; public class User { private int id; private String name; private String pwd; public User(){ } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } }
-
编写Dao层,之前JDBC是一直使用xxxDao接口 + xxxDao的实现类完成,而mybatis是会用xxxDao接口 + xml配置文件 或者 注解来代替这个实现类。
1. namespace 用来绑定 com.ljq.Dao.UserDao接口 2. id 用来绑定这个接口下某个方法 3. resultType 绑定返回值结果类型
package com.ljq.Dao; import com.ljq.pojo.User; import java.util.List; public interface UserDao { List<User> getUserList(); }
<?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.ljq.Dao.UserDao"> <select id="getUserList" resultType="com.ljq.pojo.User"> select *from user; </select> </mapper>
-
编写mybatis的初始化配置文件mybatis-config.xml,存放在resources文件夹下(其他位置也行)
更改四个property的value值,这四个值就是正常JDBC加载驱动那一套。
mappers是映射,里面存放一个个用来实现xxxDao接口的配置文件。<?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="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/ljq/Dao/UserMapper.xml"/> </mappers> </configuration>
-
编写工具类,用来加载驱动、获取连接等等。
package com.ljq.utils; 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 java.io.InputStream; public class mybatisUtil { private static SqlSessionFactory sqlSessionFactory; static { try { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (Exception e) { e.printStackTrace(); } } public static SqlSession getSqlsession(){ return sqlSessionFactory.openSession(); } }
-
进行测试
import com.ljq.Dao.UserDao; import com.ljq.pojo.User; import com.ljq.utils.mybatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class userTest { @Test public void getUser(){ SqlSession session = null; try{ session = mybatisUtil.getSqlsession(); //工具类获取连接 UserDao mapper = session.getMapper(UserDao.class); //反射加载接口 List<User> list = mapper.getUserList(); //执行方法 for (User user : list) { System.out.println(user.toString()); } } catch (Exception e){ e.printStackTrace(); } finally { session.close(); } } }
整个项目结构如下,唯一需要注意的就是Maven是约定大于配置,默认只导出resources下的资源文件,其他地方的资源文件不会导出,所以需要在maven中进行配置。
注意:由于maven只能导出resources下的资源文件,而Dao包下的UserMapper.xml是无法导出的,需要在pom.xml文件中加入build配置。
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>