这里对mybatis的入门介绍以官方最新MyBatis3.4.1为准,具体文档及jar包请访问:https://github.com/mybatis/mybatis-3/releases。
以前经常都在使用mybatis,但通常都是和Spring结合起来用,在配置的时候往往都是在网上或者东配置西配置然后就能用了,但是一直没有仔细的对mybatis有一个系统而全面的配置。哪怕就是单独写一个mybatis的demo都写不出来,前段时间刚好发现mybatis的一篇官方用户手册,所以想从头对mybatis有一个系统而全面的认识。同样对官方用户手册的全篇翻译也是近期的一个小目标。
为了方便对mybatis完全不了解,不知道从何入手的新手做一个简单的讲解。想要写一个mybatis的demo不用去创建一个Java EE的Web工程,这是我以前很大很大的一个误区,以为对此类框架的使用我必须要去创建一个Web工程,创建好了一个Web工程,我又要得去写html,写一个servlet交互等等等等,一想到这儿,我就不想写了。其实大可不必,只需要创建一个普通Java工程即可写出一个mybatis的demo。
我们首先来看看工程的包结构。mapper包是什么呢,我不知道怎么形容,映射,或者可以是dao层——对数据库的操作。pojo即是java实体类。util提供一些工具类。Main即客户端测试代码。mybatis-config.xml为mybatis的配置文件。
我们还需要为工程引入两个jar包。
我们首先要理解清楚mybatis的核心是什么,官方用户手册中说,每个MyBatis应用都以一个SqlSessionFactory为核心。一个SqlSessionFactory实例能够通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder能够从XML配置文件或者从配置类构建一个SqlSessionFactory实例。(Every MyBatis application centers around an instance of SqlSessionFactory. A SqlSessionFactory instance can be acquired by using the SqlSessionFactoryBuilder. SqlSessionFactoryBuilder can build a SqlSessionFactory instance from an XML configuration file, or from a custom prepared instance of the Configuration class.)
我们对SqlSessionFactory的获取采用从XML配置文件的方式获取。首先来实现SessionFactory类。
1 package day_8_mybatis.util; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import org.apache.ibatis.io.Resources; 7 import org.apache.ibatis.session.SqlSession; 8 import org.apache.ibatis.session.SqlSessionFactory; 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 10 11 /** 12 * 获取SqlSession实例 13 * @author turbo 14 * 15 * 2016年9月11日 16 */ 17 public class SessionFactory { 18 public static SqlSession getSqlSession(String resource) throws IOException{ 19 InputStream inputStream = Resources.getResourceAsStream(resource); 20 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 21 SqlSession sqlSession = sqlSessionFactory.openSession(); 22 23 return sqlSession; 24 } 25 }
接着开始写mybatis-config.xml配置文件。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <properties> 7 <property name="driver" value="com.mysql.jdbc.Driver"/> 8 <property name="url" value="jdbc:mysql://localhost:3306/test"/> 9 <property name="username" value="root"/> 10 <property name="password" value="0000"/> 11 </properties> 12 <environments default="development"> 13 <environment id="development"> 14 <transactionManager type="JDBC" /> 15 <dataSource type="POOLED"> 16 <property name="driver" value="${driver}"/> 17 <property name="url" value="${url}"/> 18 <property name="username" value="${username}"/> 19 <property name="password" value="${password}"/> 20 </dataSource> 21 </environment> 22 </environments> 23 24 <mappers> 25 <mapper resource="day_8_mybatis/mapper/UserMapper.xml"/> 26 </mappers> 27 </configuration> 28
配置文件中的properties也可以采用外部引用的方式,及将6-11行修改为:
1 driver=com.mysql.jdbc.Driver 2 url=jdbc:mysql://localhost:3306/mybatis 3 name=root 4 password=XDP
注:此篇MyBatis3入门不讲详细原理及各参数是什么意思,主要是对mybatis的一个demo入门程序。
下面新建一个User pojo类,其中的变量对应数据库中user表的字段(当然这也不是必须的)。
1 package day_8_mybatis.pojo; 2 3 /** 4 * User实体类 5 * @author turbo 6 * 7 * 2016年9月11日 8 */ 9 public class User { 10 private int id; 11 private String name; 12 private String age; 13 private String sex; 14 public int getId() { 15 return id; 16 } 17 public void setId(int id) { 18 this.id = id; 19 } 20 public String getName() { 21 return name; 22 } 23 public void setName(String name) { 24 this.name = name; 25 } 26 public String getAge() { 27 return age; 28 } 29 public void setAge(String age) { 30 this.age = age; 31 } 32 public String getSex() { 33 return sex; 34 } 35 public void setSex(String sex) { 36 this.sex = sex; 37 } 38 }
现在开始构建mapper包里的UserMapper.java和UserMapper.xml
UserMapper.java就是一个对数据库的访问接口,不用去实现,因为mybatis已经为我们完成了这件事。
1 package day_8_mybatis.mapper; 2 3 import day_8_mybatis.pojo.User; 4 5 /** 6 * mapper数据库访问接口 7 * @author turbo 8 * 9 * 2016年9月11日 10 */ 11 public interface UserMapper { 12 User getUserById(int id); 13 }
UserMapper.xml即是对数据库的具体的sql操作。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="day_8_mybatis.mapper.UserMapper"> 6 <select id="getUserById" resultType="day_8_mybatis.pojo.User"> 7 select * from user where id = #{id} 8 </select> 9 </mapper>
需要注意的地方是,第5行的namespace必须是此mapper.xml文件对应的mapper接口。第6行的id必须是mapper接口的方法名称,resultType在这里必须是User类的绝对路径(因为此处查询的是一个User类),当然你也可以以别名的方式。第7行#{id}的“id”必须是mapper接口中getUserById方法的参数名称。
下面我们就可以写客户端类进行测试了。
1 package day_8_mybatis; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import org.apache.ibatis.io.Resources; 7 import org.apache.ibatis.session.SqlSession; 8 import org.apache.ibatis.session.SqlSessionFactory; 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 10 11 import day_8_mybatis.mapper.UserMapper; 12 import day_8_mybatis.pojo.User; 13 import day_8_mybatis.util.SessionFactory; 14 15 /** 16 * 客户端 17 * @author turbo 18 * 19 * 2016年9月11日 20 */ 21 public class Main { 22 23 /** 24 * @param args 25 * @throws IOException 26 */ 27 public static void main(String[] args) throws Exception { 28 String resource = "day_8_mybatis/mybatis-config.xml"; //获取mybatis配置文件路径 29 SqlSession sqlSession = SessionFactory.getSqlSession(resource); //通过SessionFactory工具类(此工具类为自己构造即util包中的SessionFactory)构造SqlSession 30 31 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 32 User user = userMapper.getUserById(1); 33 34 System.out.println(user.getAge()); 35 } 36 37 }
至于数据库就是简单的几个字段,根据如图创建即可。
这样我们就完成了一个mybatis的一个入门demo程序。