上篇文章首先介绍了JDBC操作数据库的相关知识,并总结了JDBC操作数据存在的一些问题,那么这篇文章我们来介绍下mybatis的相关内容
一、mybatis的架构图
下面对上面的架构图详细说明下:
1.mybatis的配置
sqlMapConfig.xml,此文件作为mybatis的核心配置文件,是mybatis的全局配置文件,配置了mybatis的运行环境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句,此文件需要在SQLMapConfig.xml文件中加载。一般来说,有多少个数据库表就存在多少个mapper.xml文件。
2.SqlSessionFactory
通过mybatis的环境等配置信息来构建SqlSessionFactory,即会话工厂。
3.SQLSession
由会话工厂(SqlSessionFactory)来创建SqlSession,操作数据库需要通过SqlSession来进行。
4.executor
mybatis的底层自定义了executor执行器接口操作数据库,executor执行器接口由两个实现,一个是基本执行器,一个是缓存执行器。
5.mappedStatement
mappedStatement也是mybatis底层的封装对象,它包装了mybatis的配置信息及sql映射信息等。mapper.xml文件中的一个sql对应一个mappedStatement对象,sql的ID就是Mapped statement的ID。
6.输入映射
Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
7.输出映射
Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
二、mybatis的入门程序开发
2.1 业务需求
使用mybatis实现以下功能:
1.根据用户id查询一个用户信息
2.根据用户名称模糊查询用户列表
3.添加用户
4.更新用户
5.删除用户
2.2 导包
需要提前下载好mybatis的jar包,以及mybatis的依赖包,并将所有的jar包添加到 build path中:
其中,mybatis-3.2.7.jar 是mybatis的核心包,mysql-connector-java-5.1.7-bin.jar 是mysql的数据库驱动包,其他的均为mybatis的依赖包。
2.3 加载配置文件
在src目录下创建SqlMapConfig.xml 文件、log4j.properties 文件:
2.3.1 log4j.properties 文件配置信息:
1 # Global logging configuration 2 log4j.rootLogger=DEBUG, stdout 3 # Console output... 4 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 5 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 6 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
log4j.properties是日志配置文件,mybatis默认使用log4j作为输入日志信息。
2.3.2 SqlMapConfig.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 6 <configuration> 7 <!--和spring整合之后,environments将被废除 --> 8 <environments default="development"> 9 <environment id="development"> 10 <!-- 使用JDBC事物管理 --> 11 <transactionManager type="JDBC" /> 12 <!-- 数据库连接池 --> 13 <dataSource type="POOLED"> 14 <property name="driver" value="com.mysql.jdbc.Driver" /> 15 <property name="url" value="jdbc:mysql://localhost:3306/mybatisstudy" /> 16 <property name="username" value="root" /> 17 <property name="password" value="root" /> 18 </dataSource> 19 </environment> 20 </environments> 21 </configuration>
SqlMapConfig.xml 文件作为mybatis的核心配置文件,配置文件为数据源和事物管理等。
2.4 根据用户id查询一个用户信息
2.4.1 创建pojo
pojo类作为mybatis进行sql映射使用,po类通常与数据库表对应,pojo类如下所示:
1 package com.lwjnicole.pojo; 2 3 import java.io.Serializable; 4 import java.util.Date; 5 6 public class User implements Serializable{ 7 8 private static final long serialVersionUID = 1L; 9 10 private int id; 11 private String username;//用户名 12 private String sex;//性别 13 private Date birthday;//用户生日 14 private String address;//地址 15 public int getId() { 16 return id; 17 } 18 public void setId(int id) { 19 this.id = id; 20 } 21 public String getUsername() { 22 return username; 23 } 24 public void setUsername(String username) { 25 this.username = username; 26 } 27 public String getSex() { 28 return sex; 29 } 30 public void setSex(String sex) { 31 this.sex = sex; 32 } 33 public Date getBirthday() { 34 return birthday; 35 } 36 public void setBirthday(Date birthday) { 37 this.birthday = birthday; 38 } 39 public String getAddress() { 40 return address; 41 } 42 public void setAddress(String address) { 43 this.address = address; 44 } 45 @Override 46 public String toString() { 47 return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" 48 + address + "]"; 49 } 50 51 }
2.4.2 创建userMapper.xml映射文件
在src下创建sqlmap目录,然后在sqlmap目录下创建userMapper.xml映射文件:
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 <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 --> 6 <mapper namespace="user"> 7 <!-- id:statement的id 或者叫做sql的id--> 8 <!-- parameterType:声明输入参数的类型 --> 9 <!-- resultType:声明输出结果的类型,应该填写pojo的全路径 --> 10 <!-- #{}:输入参数的占位符,相当于jdbc的? --> 11 <select id="findUserById" parameterType="Integer" resultType="com.lwjnicole.pojo.User"> 12 select * from user where id = #{v} 13 </select> 14 </mapper>
2.4.3 加载映射文件
mybatis框架需要加载Mapper.xml映射文件,将userMapper.xml映射文件添加到SqlMapConfig.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 6 <configuration> 7 <!--和spring整合之后,environments将被废除 --> 8 <environments default="development"> 9 <environment id="development"> 10 <!-- 使用JDBC事物管理 --> 11 <transactionManager type="JDBC" /> 12 <!-- 数据库连接池 --> 13 <dataSource type="POOLED"> 14 <property name="driver" value="com.mysql.jdbc.Driver" /> 15 <property name="url" value="jdbc:mysql://localhost:3306/mybatisstudy" /> 16 <property name="username" value="root" /> 17 <property name="password" value="root" /> 18 </dataSource> 19 </environment> 20 </environments> 21 <!-- 加载映射文件 --> 22 <mappers> 23 <mapper resource="sqlmap/UserMapper.xml"/> 24 </mappers> 25 </configuration>
2.4.4 编写Junit测试代码
这里我们来实现根据id查询用户信息的功能,Junit测试代码的实现步骤如下:
1.创建SqlSessionFactoryBuilder对象
2.加载 SqlMapConfig.xml 配置文件
3.创建 SqlSessionFactory 对象
4.创建 SqlSession 对象
5.使用SqlSession对象执行查询sql,获得结果 User 对象
6.打印结果
7.释放资源
Junit测试代码如下:
1 package mybatis_study; 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 import org.junit.After; 11 import org.junit.Before; 12 13 import com.lwjnicole.pojo.User; 14 15 public class Test { 16 private SqlSessionFactory sqlSessionFactory = null; 17 private SqlSession session = null; 18 19 @Before 20 public void before(){ 21 //创建SqlSessionFactoryBuilder对象 22 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); 23 InputStream inputStream = null; 24 try { 25 //加载SqlMapConfig.xml配置文件 26 inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } 30 //创建SqlSessionFactory对象 31 this.sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); 32 } 33 34 @org.junit.Test 35 public void findUserById(){ 36 //创建SqlSession对象 37 session = sqlSessionFactory.openSession(); 38 //使用SqlSession对象执行查询sql,获得结果 39 User user = session.selectOne("findUserById", 27); 40 //打印结果 41 System.out.println(user); 42 } 43 44 @After 45 public void after(){ 46 //释放资源 47 session.close(); 48 } 49 }
执行结果如下:
至此,第一个业务功能就已经实现啦,剩下的功能在接下来的文章中介绍,我的项目结构为: