本文使用一个简单的开发程序,将MyBatis的整个开发流程进行梳理一遍,可以对MyBatis基础有更深的了解。首先,本文使用的是Mapper代理,即用Mapper.xml文件与Mapper接口之间通过配置来完成映射,从而可以使得代码量大大减少,避免许多重复的操作。
1.建立项目,导入相关包
在Eclipse中建立一个java项目,本文项目名mybatisDemo,然后便是导入相关包:
1.jdk包(一般在Eclipse中配置完之后是自带的)
2.mybatis-3.4.5.jar及其mybatis的依赖包
3.数据库驱动包:mysql-connector-java-5.1.44-bin.jar
2.实体类
本文实体类User类,如下代码所示,是个典型的Javabean,其中有个toString()方法,则是在返回对象的时候能够如方法内格式输出。
package com.mybatis.model.impl;
public class User {
private Integer id;
private String name;
private String sex;
private Integer age;
public User()
{
}
public User(String name,String sex,Integer age)
{
this.name=name;
this.sex=sex;
this.age=age;
}
public Integer getId()
{
return this.id;
}
public void setId(Integer id)
{
this.id=id;
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name=name;
}
public String getSex()
{
return this.sex;
}
public void setSex(String sex)
{
this.sex=sex;
}
public Integer getAge()
{
return this.age;
}
public void setAge(Integer age)
{
this.age=age;
}
public String toString()
{
return "User [id="+id+",name="+name+",sex="+sex+",age"+age+"]";
}
}
3.log4j.properties文件配置
一般来说日志文件log4j.properties配置内容一般比较固定,如下所示:
# Global logging configuration
#\u5728\u5f00\u53d1\u73af\u5883\u4e0b\u65e5\u5fd7\u7ea7\u522b\u8981\u8bbe\u7f6e\u6210DEBUG\uff0c\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e\u6210info\u6216error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
其中log4j.rootLogger值在开发过程中标注为DEBUG,在投入使用过程中使用info。前者主要是开发过程中便于发现问题,而后者则是为了有更好的用户体验。
4.mapper接口
其实这里的mapper接口就是之前的dao组件,就是对数据库的原子操作。但是为了优化工作量,则使用针对接口编程,则使用了mapper代理。mapper代理只需要接口而不需要实现类,属于真正的针对接口编程。
package com.mybatis.mapper;
import com.mybatis.model.impl.*;
import java.util.*;
public interface UserMapper {
public void insertUser(User user) throws Exception;
public User selectOneUser(Integer id) throws Exception;
public List<User> selectAllUser() throws Exception;
public void deleteUser() throws Exception;
}
5.持久化类映射文件(mapper文件)--UserMapper.xml
UserMapper.xml文件是针对mapper接口中的方法进行配置的,针对这些方法编写sql语句,这也是MyBatis的核心所在。这也是MyBatis与Hibernate的一个明显的区别,Hibernate使用的是DAO接口及其实现类,通过实现类来完成数据库的原子操作,而MyBatis则只需要mapper接口,接口中表明需要的原子操作方法,而实现则是通过在相应的xml文件中通过编写sql语言来实现,因此MyBatis中比较灵活。注意以下xml文件中namespace则需要说明对应的mapper接口位置。
<?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.mybatis.mapper.UserMapper">
<insert id="insertUser" parameterType="com.mybatis.model.impl.User" useGeneratedKeys="true"
keyProperty="id" >
insert into tb_user(name,sex,age)
values(#{name},#{sex},#{age})
</insert>
<select id="selectAllUser" resultType="com.mybatis.model.impl.User">
select * from tb_user
</select>
<delete id="deleteUser">
delete from tb_user
</delete>
<select id="selectOneUser" parameterType="java.lang.Integer"
resultType="com.mybatis.model.impl.User">
select * from tb_user where id=#{id}
</select>
</mapper>
6.MyBatis配置文件--mybatis-config.xml
MyBatis配置文件则是对整个项目的全局配置,包括日志文件,以及运行环境等,注意还需要将mapper.xml文件加载在该配置文件中。注意其中配置过程中注意大小写,如果大小写搞混了,则会报错(case sensitive)
<?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">
<!-- XML配置文件包含对MyBatis系统的核心设置 -->
<configuration>
<!-- 指定MyBatis所用日志的具体实现 -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
</transactionManager>
<dataSource type="POOLED">
<property name="driver" value="org.gjt.mm.mysql.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
7.测试
1.首先在mysql中建立一个mybatis的database,然后建立一个tb_user的table,再根据上述User类编写相应的属性名,并且让id成为主键并自动增长。
2.添加数据:
package com.mybatis.test;
import java.util.*;
import java.io.InputStream;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.*;
import com.mybatis.mapper.UserMapper;
import com.mybatis.model.impl.*;;
public class MyBatisTest {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//读取MyBatis配置文件
InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
//初始化mybatis,创建SqlSessionFactory类的实例。
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//创建Session实例
SqlSession session=sqlSessionFactory.openSession();
//创建User对象
UserMapper userMapper=session.getMapper(UserMapper.class);
User user=new User("Carson","男",23);
userMapper.insertUser(user);
user=new User("THL","女",23);
userMapper.insertUser(user);
session.commit();
//List<User> list=userMapper.selectAllUser();
//System.out.println(list);
//userMapper.deleteUser();
session.commit();
session.close();
}
}
运行上述程序,则得到如下数据表:
3.查询数据:
package com.mybatis.test;
import java.util.*;
import java.io.InputStream;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.*;
import com.mybatis.mapper.UserMapper;
import com.mybatis.model.impl.*;;
public class MyBatisTest {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//读取MyBatis配置文件
InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
//初始化mybatis,创建SqlSessionFactory类的实例。
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//创建Session实例
SqlSession session=sqlSessionFactory.openSession();
//创建User对象
UserMapper userMapper=session.getMapper(UserMapper.class);
//User user=new User("Carson","男",23);
//userMapper.insertUser(user);
//user=new User("THL","女",23);
//userMapper.insertUser(user);
//session.commit();
List<User> list=userMapper.selectAllUser();
System.out.println(list);
//userMapper.deleteUser();
session.commit();
session.close();
}
}
运行程序在控制台看到如下结果:
代码如下:
package com.mybatis.test;
import java.util.*;
import java.io.InputStream;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.*;
import com.mybatis.mapper.UserMapper;
import com.mybatis.model.impl.*;;
public class MyBatisTest {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//读取MyBatis配置文件
InputStream inputStream=Resources.getResourceAsStream("mybatis-config.xml");
//初始化mybatis,创建SqlSessionFactory类的实例。
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//创建Session实例
SqlSession session=sqlSessionFactory.openSession();
//创建User对象
UserMapper userMapper=session.getMapper(UserMapper.class);
//User user=new User("Carson","男",23);
//userMapper.insertUser(user);
//user=new User("THL","女",23);
//userMapper.insertUser(user);
//session.commit();
//List<User> list=userMapper.selectAllUser();
//System.out.println(list);
userMapper.deleteUser();
session.commit();
session.close();
}
}
运行以上程序,可以在数据库中看到记录全被删除:
8.文件结构
9.总结
以上是MyBatis的完整流程,可以将其与Hibernate相比较可以看出,MyBatis实现相同功能,在Java代码量上减少了许多,而需要更多的配置文件,然后在相应映射文件中编写sql语句,MyBatis中需要编写大量的原生sql语句,而且直接在映射文件中。因此对于数据库的操作更具开放性以及灵活性。