简单介绍:
MyBatis3框架主要作用就是更加方便地操作数据库,它还具有优化查询效率的缓存等功能。MyBatis是一个持久化框架,它有不同的语言版本。以SQL语句为映射基础,在使用MyBatis框架时可以将SQL语句灵活多变地特性融入到项目开发中,除此之外在使用MyBatis框架时,可以省略大多数的JDBC代码,因为它把常用的JDBC操作都进行了封装,加快开发效率。MyBatis可以使用XML或Annotations注解的方式将数据表中的记录映射成一个Map或Java POJO实体对象,这也是ORM技术方向,MyBatis的核心是SqlSessionFactory,它是创建SqlSession对象的工厂,而SqlSessionFactory对象是由SqlSessionFactoryBuilder类来创建。
MyBatis下载地址:http://code.google.com/p/mybatis/
一、MyBatis初体验--使用XML配置文件创建SqlSessionFactory对象
项目结构
mybatis-configuration.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>
<!-- 对事务的管理和连接池的配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
测试代码是否能正常创建sqlSessionFactory类的实例
package test;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String resource = "mybatis-configuration.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
System.out.println(sqlSessionFactory);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
sqlSessionFactory成功地从XML配置文件中创建
二、使用MyBatis Generator工具逆向
在MyBatis中实现数据表与JavaBean映射时,配置的代码比较复杂,虽然MyBatis框架实现ORM的原理是使用SQL语句进行映射JavaBean,但映射的代码还是比较繁多,为了加快开发我们使用MyBatis generator插件生成ORM映射文件,添加MyBatis generator插件在此不多介绍,参考http://blog.csdn.net/sunny_sxylj/article/details/50957233
新建Java项目然后在Java项目的src节点上右键新建一个MyBatis生成ORM文件的配置文件。
单击next finish完成配置文件的创建。
对生成的generatorConfig.xml配置文件代码进行修改如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration >
<context id="generatorJava" >
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="root" />
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="orm" targetProject="generatorJava" />
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="orm" targetProject="generatorJava" />
<!-- 生成DAO的包名和位置-->
<javaClientGenerator targetPackage="orm" targetProject="generatorJava" type="XMLMAPPER" />
<!-- 要生成哪些表-->
<table tableName="userinfo">
<generatedKey column="id" sqlStatement="mysql" identity="true"/>
</table>
</context>
</generatorConfiguration>
mysql中userinfo的表结构,这里需要注意userinfo的id是自增的
添加sql驱动jar包,单击Generate My Batis/i BATIS Artifacts菜单
把orm包中的内容复制到MyEclispe中Web项目的src路径中。
三、使用SqlSession对象在MySql数据库中新建记录
修改mybatis1中的mybatis-configuration.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>
<!-- 对事务的管理和连接池的配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="orm/UserinfoMapper.xml"/>
</mappers>
</configuration>
新建TestServlet在数据库中插入新记录
package controller;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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 orm.Userinfo;
public class TestServlet extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try{
Userinfo userinfo = new Userinfo();
userinfo.setUsername("usernameValue");
userinfo.setPassword("passwordValue");
String resource = "mybatis-configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession.insert("insert",userinfo);
sqlSession.commit();
sqlSession.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
运行servlet成功在数据表中添加了一条记录。
四、使用MyBatis对MySql实现CURD
1.创建获取SqlSession对象的工具类GetSqlSession
package dbtools;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public abstract class GetSqlSession {
public static SqlSession getSqlSession() throws IOException{
String resource = "mybatis-configuration.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}
}
2.插入多条记录
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import orm.Userinfo;
import dbtools.GetSqlSession;
/**
* 插入多条记录
* @author DaveBobo
*
*/
public class InsertUserinfo extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
try{
Userinfo userinfo = new Userinfo();
userinfo.setUsername("DaveBobo");
userinfo.setPassword("123456");
SqlSession sqlSession = GetSqlSession.getSqlSession();
sqlSession.insert("insert", userinfo);
System.out.println(userinfo.getId());
sqlSession.commit();
sqlSession.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
变量sqlSession的insert方法的第一个参数是UserinfoMapper.xml映射文件<insert>标签的id值。
3.根据id值查询记录
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import orm.Userinfo;
import dbtools.GetSqlSession;
/**
* 根据ID值查询记录
* @author DaveBobo
*
*/
public class GetUserinfoById extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
SqlSession sqlSession = GetSqlSession.getSqlSession();
Userinfo userinfo = sqlSession.selectOne("selectByPrimaryKey", 3);
System.out.println(userinfo.getId());
System.out.println(userinfo.getUsername());
System.out.println(userinfo.getPassword());
sqlSession.commit();
sqlSession.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
4.查询所有记录
package controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import orm.Userinfo;
import dbtools.GetSqlSession;
/**
* 查询所有记录
* @author DaveBobo
*
*/
public class GetAllUserinfo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
SqlSession sqlSession = GetSqlSession.getSqlSession();
List<Userinfo> listUserinfo = sqlSession.selectList("selectByExample");
for(int i=0;i<listUserinfo.size();i++){
Userinfo userinfo = listUserinfo.get(i);
System.out.println(userinfo.getId()+" "+userinfo.getUsername()+" "+userinfo.getPassword());
}
sqlSession.commit();
sqlSession.close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
5.更新记录
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import orm.Userinfo;
import dbtools.GetSqlSession;
/**
* 更新记录
* @author DaveBobo
*
*/
public class UpdateUserinfoById extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
SqlSession sqlSession = GetSqlSession.getSqlSession();
Userinfo userinfo = sqlSession.selectOne("selectByPrimaryKey",3);
userinfo.setUsername("UpdateDb");
sqlSession.update("updateByPrimaryKeySelective",userinfo);
sqlSession.commit();
sqlSession.close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
6.删除记录
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.ibatis.session.SqlSession;
import dbtools.GetSqlSession;
/**
* 删除记录
* @author DaveBobo
*
*/
public class DeleteUserinfoById extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
SqlSession sqlSession = GetSqlSession.getSqlSession();
sqlSession.delete("deleteByPrimaryKey", 5);
sqlSession.commit();
sqlSession.close();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
五、核心对象的生命周期
介绍过简单的使用之后我们还需要掌握MyBatis核心对象的生命周期,如果我们对对象的生命周期不了解,实现的代码质量并不佳,很容易造成程序上的错误或效率的低下。
(1)SqlSessionFactoryBuilder对象可以被JVM虚拟机所实例化、使用或者销毁。一旦使用SqlSessionFactoryBuilder对象创建SqlSessionFactory后,SqlSessionFactoryBuilder类就不需要存在了,也就是不需要保持对象的状态,可以随意地任由JVM销毁,因此SqlSessionFactoryBuilder对象的最佳使用范围是方法之内,也就是说可以在方法内部声明SqlSessionFactoryBuilder对象来创建SqlSessionFactory对象。
(2)SqlSessionFactory对象由SqlSessionFactoryBuilder对象创建。一旦创建SqlSessionFactory类的实例,该实例应该在应用程序执行期间都存在,根本不需要每一次操作数据库时都重新创建它,所以应用它的最佳方式就是写一个单例模式,或使用Spring框架来实现单例模式对SqlSessionFactory对象进行有效的管理。
(3)SqlSession对象由SqlSessionFactory类创建,需要注意的是,每个线程都应该有它自己的SqlSession实例。SqlSession实例不能共享它是线程不安全的,所以千万不要在Servlet中声明该对象的一个实例变量。