这一篇博文开始,我们就开始正式学习MyBatis这一个持久层框架啦,虽然之前就一直使用过该框架,但是从来没有系统的学习过,都是不清楚就百度下,然后能用能跑能出结果就行,也就是目的都是实现需求。现在开始好好研究,下面我们搭建一下MyBaits的开发环境,也就是一个用MyBaits框架访问数据库的例子。
1、项目结构如下
这里搭建的是一个maven项目。
2、引入依赖pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.suibibk</groupId>
<artifactId>mybatis-test01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- mybatis框架依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mysql数据库链接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<!-- 日志处理依赖 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!-- 单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
</dependency>
</dependencies>
</project>
这里重点是如下两个依赖
<!-- mybatis框架依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mysql数据库链接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
3、编写实体类:User
public class User{
private Long id;//自增的ID
private String username;//用户名
private String userId;//这个用来存放用户的userId,不要用自增键太不安全
private String password;//用户密码
private String nickname;//昵称
private String imgUrl;//用户头像
private String sex;//用户性别0女,1是男
private String age;//用户年龄
private String create_datetime;//用户创建时间
private String update_datetime;//用户修改时间
private String type;//用户类别0是管理员,1是已登录用户,2是游客
private String remark;//用户备注
private String visible;//用户是否有效
private String value;//预留字段
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getImgUrl() {
return imgUrl;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getCreate_datetime() {
return create_datetime;
}
public void setCreate_datetime(String createDatetime) {
create_datetime = createDatetime;
}
public String getUpdate_datetime() {
return update_datetime;
}
public void setUpdate_datetime(String updateDatetime) {
update_datetime = updateDatetime;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getVisible() {
return visible;
}
public void setVisible(String visible) {
this.visible = visible;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", userId="
+ userId + ", password=" + password + ", nickname=" + nickname
+ ", imgUrl=" + imgUrl + ", sex=" + sex + ", age=" + age
+ ", create_datetime=" + create_datetime + ", update_datetime="
+ update_datetime + ", type=" + type + ", remark=" + remark
+ ", visible=" + visible + ", value=" + value + "]";
}
}
这里字段需要跟数据库的字段一模一样,否则需要在配置文件或者加上注解一一对应,这个后续再说,这里先用最简单的方式:一模一样。
4、编写持久层接口:UserMapper
public interface UserMapper {
public List<User> findAllUser();
}
这里习惯性后缀用Mapper,也习惯性在mapper包下面
5、编写持久层接口映射文件:UserMapper.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="com.suibibk.mybatis.mapper.UserMapper">
<!--配置查询所有-->
<select id="findAllUser" resultType="com.suibibk.mybatis.domain.User">
select * from user
</select>
</mapper>
select标签上的id对应的是接口中的方法,返回类型对应的就是接口中返回的类型(不用到List,指定domain即可),然后标签内容就是要执行的语句。mapper标签中的namespace对应的就是接口类。这里不需要强制要求UserMapper.java和UserMapper.xml的路径和命名一样。
6、编写SqlMapConfig.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">
<!-- mybatis的主配置文件 -->
<configuration>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置mysql的环境-->
<environment id="mysql">
<!-- 配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/weixinser"/>
<property name="username" value="root"/>
<property name="password" value="forever"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 不一定非得叫UserMapper.xml -->
<mapper resource="mapper/UserMapper.xml"/>
</mappers
</configuration>
这个是MyBatis的配置文件,主要是配置了环境和mappers,环境上就是指定事务类型,数据库连接信息,当然上面的default可以定义为别的名字。不过环境那里的id要和defalut相同。mapper中的现在我们的例子是配置版,也就是指定配置文件的路径即可。
其实到这里我们就应该猜到流程了。程序启动的时候肯定先加载SqlMapConfig.xml配置文件,然后创建数据库连接池。接下来根据mapper标签找到UserMapper.xml配置文件,然后解析UserMapper.xml配置文件可以找到要执行的语句以及对应的接口和返回类型,这样子就全部都起啦。
7、测试类Test
public class Test {
@org.junit.Test
public void test1() throws Exception {
//1、读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3、使用工厂生产SqlSession对象
SqlSession sqlSession = factory.openSession();
//4、使用SqlSession创建Dao接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//5、使用代理对象执行方法
List<User> user = userMapper.findAllUser();
System.out.println("user:"+user.toString());
//6、释放资源
sqlSession.close();
in.close();
}
}
上面步骤应该很清晰啦,执行后输出如下结果
哈图片有点小,因为我的服务器带宽太小了,反正也不是很重要的结果。
8、使用注解版
其实使用注解版就更简单啦,但是我觉得没有配置版灵活,注解版也就是没有UserMapper.xml文件,但是要在UserMapper.java的方法加上注解,如下:
public interface UserMapper {
@Select("select * from user")
public List<User> findAllUser();
}
然后修改下MyBatis的配置文件SqlMapConfig.xml中的mapper指向,现在没有接口映射配置文件了就直接指向接口
<mappers>
<mapper class="com.suibibk.mybatis.mapper.UserMapper"/>
</mappers>
然后运行程序结果一模一样,至此环境搭建成功。
总结
通过上面快速搭建MyBatis开发环境的例子我们知道,相对于原始的jdbc操作,便利了许多,我们想要操作一个表只需要编写对应的实体类和Mapper接口以及Mapper映射配置文件就可以啦。当我们使用了注解的方式后就更加简单,只需要简单的加一个Mapper接口即可。如果我们不需要实体类,那么直接返回Map也是可以的。
但是呢,我们这个标签的目的并不是单单的学会MyBatis的使用,毕竟任何框架的使用其实都是很简单的,只需要看下官网例子或者百度一下即可,我们应该要研究MyBatis的实现原理,学会它的设计方法。从中提升我们的软件架构以及设计模式。