【J2EE核心开发学习笔记 009】MyBatis3操作数据库(CURD)

简单介绍:

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中声明该对象的一个实例变量。


【J2EE核心开发学习笔记 006】MyBatis3操作数据库(CURD) 配套源代码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余莫星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值