目前为止J2EE系列已经学习了Struts2、Hibernate4、Spring、SpringMVC。其中Struts2、hibernate,spring三者组成了常用的软件架构S2SH,在S2SH中Struts2负责前后台之间的交互,Hibernate负责数据库操作,Spring负责管理struts2和hibernate4。学习了SpringMVC之后发现SpringMVC具有了Struts2和Spring的功能。软件架构中要想使用SpringMVC的话,还需要一个操作数据库的工具。已经知道的操作数据库工具可以使用JDBC和Hibernate。今天再学习一个操作数据库的工具MyBatis,SpringMVC经常和MyBatis一起使用。SpringMVC和MyBatis两者形成了一个新的软件架构SSM,这个架构是目前非常流行的一种架构。
一、MyBatis简介:看一下百度百科
下载:百度MyBatis,找到下载地址下载即可:
目前为止最新的版本是mybatis-3.4.4。我们工程使用的是3.2.8版本。
二、实例
1.打开mysql数据库,新建一个数据库db_mybatis,数据库中新建表格t_student:
这个表中添加了一条数据。在使用Hibernate的时候不需要手工创建数据表,因为Hibernate是对象关系型数据库。使用MyBatis的时候需要手动创建数据表。
2.新建Java Project工程:MyBatisPro01
3.与使用Hibernate类似,使用MyBatis也要进行配置。工程src目录下新建配置文件mybatis-config.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">
<configuration>
<properties resource="jdbc.properties"/>
<typeAliases>
<typeAlias alias="Student" type="com.test.model.Student"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/test/mappers/StudentMapper.xml" />
</mappers>
</configuration>
这个配置中首先是<configuration>标签开始,属性(数据库连接需要的各种属性)的配置放置在了jdbc.properties文件中(
<properties resource="jdbc.properties"/>来引入这个文件)。<typeAliases>标签为类型别名,这个标签中给类com.test.model.Student起了一个别名Student,工程中直接使用Student来代替com.test.model.Student这个类。<environments>进行环境配置,里面可以有很多的<environment>标签,这里只有一个。这里默认是开发环境(),一般企业一般有开发环境,测试环境,正式环境等。里面<environment>标签是我们定义的开发环境(<environments>中默认使用这个环境)。<environment>这个标签中定义了事务管理使用JDBC(后面会讲到还有Manager),下面<dataSource>标签配置数据源,类型是连接池(POOLED),里面的各个属性值使用EL表达式进行取值,这些值将会定义在jdbc.properties文件中。
最后<mappers>是映射器,这里添加了一个映射文件StudentMapper.xml(这里还没有创建这个文件)
4.src目录下新建jdbc.properties文件:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.username=root
jdbc.password=123456
这里配置了连接数据库的各种属性值。
5.添加jar包:打开下载的mybatis3.2.8文件:其中lib文件夹下是可能用到的jar包,我们工程中使用mybatis-3.2.8.jar这个jar包即可。mybatis-3.2.8.pdf是对mybatis的介绍。
工程中新建mybatis和jdbc文件夹,分别把mybatis的jar包和jdbc的jar包复制进去,把这两个jar包add to build path。
6.新建Student类:位于com.test.model包
package com.test.model;
public class Student {
private Integer id;
private String name;
private Integer age;
public Student(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
7.要想操作数据库,首先要获取SqlSession(使用hibernate的时候也要先获取session工厂)对象建立数据库的连接。新建类SqlSessionFactoryUtil(com.test.util包中):
package com.test.util;
import java.io.InputStream;
import java.sql.Connection;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.TransactionIsolationLevel;
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory;
public static SqlSessionFactory getSqlSessionFactory(){
if(sqlSessionFactory == null){
InputStream inputStream = null;
try{
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}catch(Exception e){
e.printStackTrace();
}
}
return sqlSessionFactory;
}
public static SqlSession openSession(){
return getSqlSessionFactory().openSession();
}
}
使用的时候直接调用SqlSessionFactoryUtil.openSession()即可获取到SqlSession对象建立与数据库的连接。
8.之前数据库的操作都放在dao层(Hibernate也是放在dao层)。mybatis不使用dao层了,而是使用mappers层。工程中新建com.test.mappers包,里面新建接口StudentMapper:
package com.test.mappers;
import com.test.model.Student;
public interface StudentMapper {
public int add(Student student);
}
这里定义了一个实现数据库添加的操作方法。这里和之前的类似,hibernate是把操作方法放在dao层接口中,把操作的实现代码放在dao.impl层。mybatis把操作方法放在mapper层,把操作实现放在一个配置文件中。com.test.mappers包中新建StudentMapper接口的实现文件StudentMapper.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.test.mappers.StudentMapper">
<insert id="add" parameterType="Student" >
insert into t_student values(null,#{name},#{age})
</insert>
</mapper>
这个文件也就是mybatis-config.xml文件中引入的映射文件。这个文件中<mapper>标签中namespace属性代表是哪个映射文件。<insert>标签实现数据添加,里面id的值与
StudentMapper接口中定义的方法名相同。parameterType标签代表传入参数类型,add方法中传入的是Student类对象,这里parameterType的值是Student。这里要特别注意一下,如果mybatis-config.xml文件中没有给com.test.model.Student这个类起别名为Student的话,这里parameterType的值要写这个类的完整类名。
<insert>标签中是数据库操作的sql语句,使用mybatis需要手动写sql语句。这个语句是向数据库中添加数据,sql语句中使用#{name},#{age}来获取传入的Student对象中对应的值。
9.新建测试类:新建com.test.service包,这个包中新建测试类StudentTest,这个类中写一个main方法作为测试方法。
package com.test.service;
import org.apache.ibatis.session.SqlSession;
import com.test.mappers.StudentMapper;
import com.test.model.Student;
import com.test.util.SqlSessionFactoryUtil;
public class StudentTest {
public static void main(String[] args) {
SqlSession sqlSession = SqlSessionFactoryUtil.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
Student student = new Student("李四",11);
int result = studentMapper.add(student);
sqlSession.commit();
if(result > 0){
System.out.println("添加成功");
}
}
}
main方法中首先调用SqlSessionFactoryUtil.openSession()来获取SqlSession对象建立与数据库的连接。通过sqlSession.getMapper(StudentMapper.class)获取到数据库操作类StudentMapper的对象studentMapper,然后直接调用这个对象的add方法即可。调用完后还要提交事务,完成数据库更新。
10.运行测试方法:控制台输出添加成功。
可以看到数据库中数据添加成功了。