- 要求通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来
- 并通过java对象和statement中的sql进行映射生成最终执行的sql语句
- mybatis框架执行sql并将结果映射成java对象并返回。
第一个Mybatis程序
1.新建项目
新建一个Java 项目 我取名为mybatis,并且新建了一个包 first2.包获取与导入
基础的两个包 mybatis 和 mysql-connector(因为要用MYSQL) ,可以从官方下载 https://dev.mysql.com/downloads/connector/j/ https://github.com/mybatis/mybatis-3/releases3.数据库准备
本人已经有本地数据库,MYSQL,以student表为测试CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '默认姓名' COMMENT '姓名', `age` int(11) DEFAULT '1', `sex` varchar(255) DEFAULT NULL, `random` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据库信息为: String user = "root"; String password = "123456"; String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";
4.配置文件设置
src下新建config,然后新建xml文件名为mybatis-config.xml 内容从官方文档中复制: http://www.mybatis.org/mybatis-3/zh/getting-started.html 如下图所示官方示例的配置XML5.SQL映射文件设置
src下新建mapper文件夹,创建xml文件名为myBatis.xml 内容从官方文档复制6.调整配置文件
主要任务就是将数据库链接信息设置准确,并且将SQL映射文件的位置设置准确 对于url的设置需要注意“&”符号,在xml的配置文件中 要用 & 代替& 这是XML的语法本身的问题与mybatis没关系 五个在XML文档中预定义好的实体: < < 小于号 > > 大于号 & & 和 ' ' 单引号 " " 双引号 实体必须以符号"&"开头,以符号";"结尾7.创建实体类Student
8.修改myMapper.xml文件
需要调整namespace 设置resultType类型,需要设置使用的sql9.测试
每一次的业务开发时,其实需要的仅仅是编写myMapper.xml文件,然后对其调用 环境配置等工作环境搭建之初就已经完成了初识Mybatis
在第一个Mybatis程序示例中的代码几乎都是官方文档中的,根据官方的提示一步一步操作即可建立 不管是Mybatis还是JDBC还是其他,终归是需要连接数据库的,不管以何种形式,连接以后就是需要执行SQL,所以你还得准备好你想要执行的SQL 在Mybatis中,SQL以XML文件的形式设置 ,也就是上例中的myMapper.xml文件 所以在上例中的主配置文件mybatis-config.xml中我们配置了数据库的连接信息以及SQL XML文件的位置 每个基于Mybatis的应用都是以一个SqlSessionFactory的实例为中心的,这一部分核心的配置文件就是提供给SqlSessionFactory实例的。 既然是操作数据库,很重要的一部分自然是SQL语句 mapper文件的格式是什么?对于一个SQL到底是查询还是delete?返回类型是什么?如下图所示,我们的类型是first.Student,SQL的内容又是什么? 此处不深入,但是很显然,对于Mybatis mapper映射文件的编写是很重要的一部分学习内容 有了核心配置文件就可以构建SqlSessionFactory实例,通过SqlSessionFactory实例就可以获取到SqlSession对象 SqlSession是Mybatis最重要的构建之一,可以简单的认为Mybatis一系列的配置目的是生成类似 JDBC生成的Connection对象的SqlSession对象 有了这个“Connection”对象之后才能进一步与数据库进行交流 这个“Connection”对象就可以根据我们mapper xml配置文件中设置的标识符,比如上例中的selectStudent的全名,以及参数执行SQL 如上图所示,我们从头简单的理一下Mybatis的基本流程 需要两个重要信息:数据库配置以及mapper文件位置 通过这两个核心信息可以生成SqlSessionFactory,通过SqlSessionFactory就可以创建SqlSession SqlSession就可以根据名称标识符识别需要执行哪个文件里面的哪个SQL,比如上面就是执行mapper/myMapper.xml文件中,标识符为selectStudent的那一条 而执行该SQL以及周边的信息,都在文件中指定了,比如SQL内容是什么?返回类型又是什么? 通过配置文件到SqlSessionFactory实例的创建,完成了宏观上Mybatis的配置,两个主要任务:- 要从哪个数据库进行操作?
- 要操作的SQL在哪里?
- 执行哪个SQL?通过层级的命名标识符定位
- 执行SQL的细节信息有哪些?SQL内容,参数内容,返回类型等
- 配置信息搭建了Mybatis应用框架
- 映射设置了一次执行的所需信息
<mappers> <package name="org.mybatis.builder"/> </mappers>对于映射如何表述?可以使用XML也还可以使用注解的形式 他们又有哪些语法?每种形式的利弊是什么?字段属性都有哪些? 参数如何设置? 返回结果又是如何设置呢?等等 尽管这一系列的实现都很复杂,但是,仍旧是围绕着核心信息来的 所以对于Mybatis的学习,最开始应该了解整体的处理过程,了解各块 然后就是深入学习配置文件以及映射的设置配置 最后就是了解源码的架构 如果还有精力,最好的文档就是源码了
附录:完整代码
数据库CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '默认姓名' COMMENT '姓名', `age` int(11) DEFAULT '1', `sex` varchar(255) DEFAULT NULL, `random` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
项目结构
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="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/sampledb?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/myMapper.xml"/> </mappers> </configuration>
myMapper.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="mapper.myMapper"> <select id="selectStudent" resultType="first.Student"> select * from student where id = #{id} </select> </mapper>
Student
package first; public class Student { private Long id; private String name; private Integer age; private String sex; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Student{"); sb.append("id=").append(id); sb.append(", name='").append(name).append('\''); sb.append(", age=").append(age); sb.append(", sex='").append(sex).append('\''); sb.append('}'); return sb.toString(); } }
测试代码
package first; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class Test { public static void main(String[] args) throws Exception { /* * 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。 * SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。 * 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。 * */ String resource = "config/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); /* * 从 SqlSessionFactory 中获取 SqlSession * */ SqlSession session = sqlSessionFactory.openSession(); try { Student student = (Student) session.selectOne("mapper.myMapper.selectStudent", 2); System.out.println(student); } finally { session.close(); } } }
接口应用
而对于SQL的执行更好的一种方式是使用接口,而不是直接通过字符串去定位需要执行的目标资源 借助于接口不是基于字符串常量的,就会更安全,而且使用接口逻辑概念更加清晰 在原有结构上增加一个接口和一个映射文件 MyMapper.javapackage first; public interface MyMapper { Student selectStudent(Integer id); }myMapper2.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="first.MyMapper"> <select id="selectStudent" resultType="first.Student"> select * from student where id = #{id} </select> </mapper>从下图可以看得出来接口与XML映射的数据对照关系,XML映射文件的namespace需要与接口的全限定名对应 接口的方法名对应XML映射的id 接口方法返回类型为XML映射的ResultMap(resultType) 接口方法的参数对应XML映射的入参 新增加了一个XML映射文件,需要将路径添加到配置中 增加一个测试类
package first; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class Test2 { public static void main(String[] args) throws Exception { /* * 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。 * SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。 * 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。 * */ String resource = "config/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"development"); /* * 从 SqlSessionFactory 中获取 SqlSession * */ SqlSession session = sqlSessionFactory.openSession(); try { MyMapper mapper = session.getMapper(MyMapper.class); Student student = mapper.selectStudent(2); System.out.println(student); } finally { session.close(); } } }关键代码为
MyMapper mapper = session.getMapper(MyMapper.class); Student student = mapper.selectStudent(2);结果与前面一致 原文地址:第一个Mybatis程序示例 Mybatis简介(一)