一、前言
本教程适合用于已经学习了javaweb三层开发和maven简单入门的同学学习。在三层开发中,分为表现层,业务逻辑层和数据访问层,对应的类一般为servlet、service、dao,mabtis框架就是对dao层进行优化的框架,将之前较为复杂而重用率很高的数据库连接操作代码进行封装,我们只需要关心sql语句的编写,而不再去关心加载驱动、创建连接(连接池)、创建执行对象等等一系列的操作。我们可以把它当成是一个强大的工具类来学习,会容易入手得多。
二、环境搭建准备
前期准备
从官网下载mybatis压缩包。在2013年的时候mybatis迁移到了GitHub上,所以我们可以登陆一下网址进行下载:https://github.com/mybatis/mybatis-3/releases。本文演示用的是3.4.5版本。如果是用的eclipse就将jar包导入即可,本文用的是maven项目开发,直接导入即可
建立数据库和表
CREATE DATABASE web_test2; USE web_test2; CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` varchar(20) DEFAULT NULL, `sex` varchar(10) DEFAULT NULL, `birthday` date DEFAULT NULL, `cno` int(11) DEFAULT NULL, PRIMARY KEY (`sid`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
数据自行添加。
三、入门案例
xml文件的配置
第一步:创建maven工程并导入坐标
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency>
第二步:创建实体类Javabean和dao的接口
Student类:
public class Student implements Serializable { private int sid; private String sname; private String sex; private Date birthday; private int cno; @Override public String toString() { return "Student{" + "sid=" + sid + ", sname='" + sname + '\'' + ", sex='" + sex + '\'' + ", birthday=" + birthday + ", cno=" + cno + '}'; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } 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 int getCno() { return cno; } public void setCno(int cno) { this.cno = cno; } }
dao接口:
public interface IStudentDao { /** * 查询所有操作。(只需要接口,不需要实现类) * @return */ List<Student> findAll(); }
第三步:创建Mybatis的主配置文件SqlMapConifg.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="mysql"> <!--配置mysql的环境--> <environment id="mysql"> <!--配置事务的类型--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源(连接池)--> <dataSource type="POOLED"> <!--配置连接数据库的4个基本信息--> <property name="driver" value="com.mysql.jdbc.Driver"> </property> <property name="url" value="jdbc:mysql://localhost:3306/web_test2"></property> <property name="username" value="root"></property> <property name="password" value="123"></property> </dataSource> </environment> </environments> <mappers> <mapper resource="com/stevensam/dao/IStudentDao.xml"></mapper> </mappers> </configuration>
第四步:创建映射配置文件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"> <mapper namespace="com.stevensam.dao.IStudentDao"> <!--配置查询所有学生的方法--> <select id="findAll" resultType="com.stevensam.domain.Student"> SELECT * FROM student; </select> </mapper>
第五步:在test中新建一个包名com.stevensam.test,建一个测试类:
public class MybatisTest { public static void main(String[] args) throws Exception { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); //3.工厂生产SqlSession对象 SqlSession session = factory.openSession(); //4.使用SqlSession创建Dao接口的代理对象 IStudentDao mapper = session.getMapper(IStudentDao.class); //5.使用代理对象执行方法 List<Student> studentList = mapper.findAll(); for (Student stu:studentList) { System.out.println(stu); } //6.释放资源 session.close(); in.close(); } }
第六步:执行MybatisTest类
注意事项
第一个:创建
IUserDao.xml
和IUserDao.java
时名称只是为了统一,关键在于namespace的值。在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper,所以:IUserDao 和 IUserMapper是一样的第二个:在idea中创建目录的时候,它和包是不一样的,
包在创建时:com.stevensam.dao它是三级结构
目录在创建时:com.stevensam.dao是一级目录
第三个:mybatis的映射配置文件位置必须和dao接口的包结构相同
第四个:映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
第五个:映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名注解开发方式
注解开发在xml方式的基础上,稍作修改即可。
(1)删除IStudentDao.xml
(2)修改SqlMapConfig.xml中的mappers标签的属性为class,注意的是值包名不能是“/”来连接,而是以点。
<!-- 指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件 如果是用注解来配置的话,此处应该使用class属性指定被注解的dao全限定类名 --> <mappers> <mapper class="com.stevensam.dao.IStudentDao"></mapper> </mappers>
(3)关键一步,在IStudentDao中在方法上面添加一行注解代码即可,如下:
@Select("select * from student") List<Student> findAll();
(4)执行结果