我对MyBatis的理解仅仅是:它以前叫IBtais,现在投到谷歌帐下,改名MyBatis,这个框架把JDBC中的重复代码封装起来,减少代码量。仅仅知道这些而已,慢慢学习吧,从网上找了一个最简单的例子。
MyBatis+MySQL的,记录如下:
①数据库
在MySQL中,test数据库下,简历user表,一共两个字段id和name,建表语句略。
②需导入的包
只有两个:
mybatis-3.0.3.jar
mysql-connector-Java-5.1.9-bin.jar(JDBC包)
③目录结构
采用最简单的结构,domain包下有且仅有四个文件
configuration.xml
User.xml
User.java
Test.java
④实体类javabean,总共两个变量
- package domain;
- public class User {
- private int id;
- private String name = null;
- public User() {
- }
- public User(int id, String name) {
- this.id = id;
- this.name = name;
- }
- 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;
- }
- @Override
- public String toString() {
- return "User [id=" + id + ", name=" + name + "]";
- }
- }
⑤MyBatis总配置文件configuration.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>
- <typeAliases>
- <typeAlias alias="User" type="domain.User" />
- </typeAliases>
- <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/test?useUnicode=true&characterEncoding=UTF-8" />
- <property name="username" value="root" />
- <property name="password" value="" />
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <mapper resource="domain/User.xml" />
- </mappers>
- </configuration>
⑥User类的配置文件User.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="User">
- <select id="selectUser" parameterType="int" resultType="User"><!--[CDATA[
- select * from user where id = #{id}
- ]]--></select>
- </mapper>
⑦测试用例
- package domain;
- import java.io.IOException;
- import java.io.Reader;
- 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 domain.User;
- public class Test {
- public static void main(String[] args) throws IOException {
- String resource = "domain/configuration.xml";
- Reader reader = Resources.getResourceAsReader(resource);
- SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
- SqlSession session = ssf.openSession();
- try {
- User user = (User) session.selectOne("selectUser", "1");
- System.out.println(user);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- session.close();
- }
- }
- }
-
下面一句一句的分析一下。
String resource = "domain/configuration.xml";
第一句代码用路径名和文件名做了一个字符串,没什么好说的。
Reader reader = Resources.getResourceAsReader(resource);
第二句使用一个Java.io中的reader字符流,读取了什么,肯定是读取了配置信息吧,通过字面意思也可以推测出来Resources.getResourceAsReader。
那么这时候reader这个对象就就把总配置文件configuration.xml加载到内存中了,接下来想必是要解析这个.xml总配置文件了。
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
首先是什么,查看源码,这是一个直接继承自object的类,其中只有4个重载的build方法,
返回值是SqlSessionFactory,接下来的很复杂我看不懂;
整理一下思路,在这一句中new了一个SqlSessionFactoryBuilder对象,这个对象用参数reader,建立了一个SqlSessionFactory对象,那我暂时这样理解,这是一个MyBatis专用的解析总配置文件的类,这个类最终构建了一个SqlSessionFactory对象。
下一句:
SqlSession session = ssf.openSession();
既然是个Factory,那么想必是个工厂类,用工厂方法生成了一个SqlSession,这个SqlSession后面我一直在用,那么好,虽然没搞明白全部,我总算的到可用的对象了。
下面是增删改查了,先不看,回头研究刚才一直在用的configuration.xml总配置文件
configuration够难的,是配置的意思,根标签也是configuration。
先看能看懂的property,有键值对key&value两个字符串,这四个学过JDBC的都知道,
再看其上层标签,<dataSource type="POOLED">
有POOLED和UNPOOLED两种type,UNPOOLED只能有上面的四个子标签,而POOLED可以配置JDBC连接池,详细的配置以后再说。
在看上面的Alias,明显是在给实体类起别名可以理解
<transactionManager type="JDBC" />
是说事务由JDBC控制也可以理解
<environments default="development">
<environment id="development">环境是开发环境,据说还有测试,发布等等的环境