创建的项目中使用Mybatis作为持久层的话,需要多个jar包的支持,如org.mybatis,mysql,log4j,junit等,如果一个个导入太麻烦,所以要用到Maven依赖库(在以前我写的文章里有Maven下载已经配置的全过程)
首先
新建project,选择Maven项目,然后点击next,填好GroupId和ArtifactId即可next和finish
下一步:
点开目录下的pom.xml,得到的页面为:
利用标签 dependencies和depandency去导入需要的jar包
比如我要导入org.mybatis,mysql,log4j,junit 的jar包,即可这样操作:
这里注意:
①grouoId和artifactId是在一键生成dependencies的时候就会自带的标签,填入想要的jar包的名称和文件名即可
②version标签是需要自己打上去,填写需要jar包的版本号
然后此时右下角会出现:
点击Enable Auto-Import即可导入jar包,下面有下载jar包的进度条。
到此jar包的导入已经完成
下一步我们需要创建Mybatis的主配置文件
首先我们来看看src目录下的三个主要的文件夹:
而Mybatis的主配置文件要放在resource中
右键点击resource选择新建file文件:
输入XXX.xml,在这里我是config.xml然后点击OK即可出现一个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">
因为没有配置dtd外部文件,所以dtd的这段代码会报错,那么点开左上角的File,然后点开Setting找到Languages&Frameworks——Schemas and DTDs。
将http://mybatis.org/dtd/mybatis-3-config.dtd和http://mybatis.org/dtd/mybatis-3-mapper.dtd添加即可。
然后开始配置Mybatis的主配置文件
了解主配置文件里的标签:
①<configuration></configuration>
这个标签是约束所有标签的主标签,就是主配置文件的标志。所有标签都在这里面填写。
②<environments></environments>
这个标签是配置环境,属性为default,在这里我们用<environments default="mysql"></environments>
③<environment></environment>
这个标签是配置属性中的环境,在这就是配置mysql的环境,属性为id,在这里我们用<environment id="mysql"></environment>
④<transactionManager></transactionManager>
这个标签是配置事务的,属性为type,这里用<transactionManager type="JDBC"></transactionManager>
⑤<dataSource></dataSource>
这个标签是配置连接池的连接方式,其属性有三种:POOLED,UNPOOLED,JNDI。在这里用<dataSource type="POOLED"></dataSource>。在标签里我们的值要存放连接数据库的相关事宜。
⑥<mappers></mappers>
这个标签在主配置文件里就是作为导航栏的作用,指示各种操作的xml配置文件,如果没有这个文件就找不到方法而报错。里面写什么下面再讲。
了解了标签,所以现在可以去看看如何正确嵌套配置configuration。
现在基本的主配置文件以及写好,那如何去使用到mybatis去查询数据库呢?那么我用一个小案例去演示一下
第一步
在数据库中创建一个user数据库,里面有user表,表里的数据用sql语句去创建:
//创建表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime DEFAULT NULL COMMENT '生日',
`sex` char(1) DEFAULT NULL COMMENT '性别',
`address` varchar(256) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8
//插入信息:
INSERT INTO USER (id , username , birthday , sex , address)VALUES
(42 , "伍俊伟" , "2025-03-20 10:27:44" , '男' , "广东省广州市"),
(43 , "大头伟" , "2012-06-21 09:04:03" , '男' , "北京省四环路"),
(45 , "new people" , "1925-07-31 04:05:06" , '男' , "China"),
(46 , "姬霓太美" , "1994-07-22 08:05:06" , '女' , "广东省惠州市"),
(48 , "蔡徐坤" , "2004-07-09 06:08:02" , '女' , "非洲"),
(51 , "孙上天" , "2028-08-18 04:56:06" , '男' , "太阳")
如何查询到这些数据到控制台呢?
第二步
创建数据库数据的实体类,在java的文件夹下新建package然后再新建一个javabean的package,然后在里面新建实体类User.java,再将数据封装成一个User对象。
package com.javabean;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private int id;
private String username;
private String address;
private String sex;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
'}';
}
}
第三步
在刚刚新建的com包下新建一个package dao,然后在dao包里新建一个接口,接口里写的方法是查询数据库所有的数据的方法。
package com.dao;
import com.javabean.User;
import java.util.List;
public interface userDao {
//查询User所有数据
List<User> findAll();
}
第四步
创建userDao的配置文件:在resource的文件夹下新建new directory,里面写上新建包的名字,我创建了com的包,然后再在com的包下创建
dao的包。在dao包下创建file,名称自定,但是一般都以接口为准,我创建的是:
至此,结构差不多完整,虽然还缺少个测试类,待会再写。现在去编写userDao的xml配置,首先将下面这段dtd复制到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">
在这个userDao的xml配置里,有几个标签需要知道:
①<mapper></mapper>
在各自配置文件中的主标签,其中有namespace属性,其他属性不予讨论,在这没有用到。
②<select></select>
③<insert></insert>
④<update></update>
⑤<delete></delete>
以上四种标签都是操作数据库对应操作的标签,有几个常用的属性:id、resultType、resultMap、ParameterType。在select中只用到id和resultType
虽然此次只用到select的标签,但是剩下的三个标签:插入、更新、删除也是可以归在一起讨论的。所以就一起写出来了。由此xml中的代码为:
<mapper namespace="com.dao.userDao">
<select id="findAll" resultType="com.javabean.User">
select * from user
</select>
</mapper>
其中namespace+id组成了方法的全限定类名,以及resultType属性意思是返回值的类型,也需要用返回值类型的全限定类名。
写完userDao的xml,还需要去连接导航的主XML文件,由此我们回到Mybatis的主配置文件config.xml中搭上连接userDao.xml的线。需要用到的标签为:
<mappers></mappers>
主要用来指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件
所以在config.xml中加上这段代码:
<mappers>
<mapper resource="com/dao/userDao.xml"></mapper>
</mappers>
第五步
编写测试类去获取数据库数据输出到控制台上。在创建Maven项目的时候自带的三个包:主java文件包,resource包以及test包。在test包的java文件包里创建一个java文件,我命名为UserTest
打入代码:
import com.dao.userDao;
import com.javabean.User;
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 org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class UserTest {
@Test
public void testFindAll()throws Exception{
//将配置文件读入字节流
InputStream is = Resources.getResourceAsStream("config.xml");
//生成SqlSessionFactory的建造器
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//用建造器生成SqlSessionFactroy
SqlSessionFactory factory = builder.build(is);
//用SqlSessionFactroy生成SqlSession对象
SqlSession session= factory.openSession();
//生成useDao的代理对象
userDao userDao = session.getMapper(com.dao.userDao.class);
//用代理对象里的findAll方法
List<User> list = userDao.findAll();
//输出查询到的结果
for(User user : list){
System.out.println(user);
}
//关闭资源
is.close();
session.close();
}
}
细节操作我都在代码中备注好了,至此就完成了测试,最后的测试结果为:
得到这个结果就说明了我能通过Mybatis来获取到数据库的数据了。就完成了初步对Mybatis的操作。还有很多东西还没讲,我只是讲了使用Mybatis的一个简单的流程,但是大致的使用都是这么去操作的,只不过在其中添加更多的配置,这些配置我会在目录中慢慢讲解完。
细节讲解:
①log4j的jar包有什么用
log4j是一个功能强大的日志组件,提供方便的日志记录,在获取到数据前发生什么,获取数据库后又发生了什么,都会有日志的记录,就方便自己去了解全过程以及一些属性变化导致的日志的改变。比如最直观的变化莫过于,在DataSource中设置属性type为POOLED或者UNPOOLED的变化,这是如果你不开日志,是不可能发现有什么变化。POOLED是从放在连接池中的连接拿出来,然后结束连接再把连接放回连接池,日志记录了这个过程。而UNPOOLED则是直接新建一个连接,着就没有连接连接池的操作,就能看到变化。
②JUnit的jar包有什么用呢?
JUnit 是一个 Java 编程语言的单元测试框架,在我写的测试类中如果我没有用JUnit的话就运行不了没有,因为java默认能运行的只有main方法,但是我用了JUnit的话就可以将要运行的方法变成测试方法,然后直接就可以运行,需要用到一个注释:
@Test
方法就放在@Test下即可
③在创建User实体类的时候implements了一个接口:Serializable
这是一个序列化接口,就是形成了一个持久化的效果,用序列化将对象写入磁盘,然后如果在以后再去调用,就可恢复对象,而不是局限于一个对象的生命周期中。
④一定要写这么多包吗?
这看你自己的编码习惯,现在我写的是只有一个dao的查询,那如果有多个dao和多个方法呢?这样分开包来存放,首先就是很直观,还有就是结构明显,养成一个良好的编码习惯是很重要的,不然累的是看你代码的人,还有你找代码的时候混在一起就会增加开发时间。还有一个就是要知道在三个基础包里,java包是可以直接建立package的,如果在resource和test中并没有package的选项,所以要建包或者建立xml文件就选择directory。
⑤在测试方法中写的流程为什么是这样?
这个需要你去先了解到Mybatis的核心组件:
SqlSessionFactoryBuilder(构造器)
SqlSessionFactroy(工厂接口)
SqlSession(会话)
SQL Mapper(映射器)
以及他们之间各自的联系,在其中用到了代理对象,我在后面的目录中单独开了一个讲解点,所以具体可以去参考下一个讲解点。