Mybatis简单配置及使用

(mybatis基础知识)

主要组成部分

Mybatis主要有SqlSessionFactoryBuilder(构造器),SqlSessionFactory(工厂接口),SqlSession(会话)还有SqlMapper(映射器)组成。

SqlSessionFactoryBuilder

构造器会根据代码或者mybatis配置文件生成工厂接口也就是SqlSessionFactory。采用分步生成的方式。
因为一旦创建了SqlSessionFactory后,就是失去作用,所以生命周期应该在创建SqlSessionFactory的方法中。

SqlSessionFactory

工厂接口主要是生成会话也就是SqlSession。有两个实现类,DefautSqlSssionFactory和SqlSessionManager生成。
主要由DefaultSqlSessionFactory完成,而SqlSessionManager主要用在并发环境中,但是具体实现还是由DefaultSqlSession来实现。
SqlSessionFactory相当于数据库连接池,所以一般以例模式创建该对象。其生命周期应该与使用mybaits的程序一样长。

SqlSession

SqlSession主要用作发送SQL语句和Sql返回结果以及或映射器。会话相当于一个JDBC Connection对象。
有两实现类 DefaultSqlSession 和 SqlSessionManager。后者用于并发环境。
SqlSession控制事务的方法由commit()提交 和 rollback()回滚 
其生命周期应该在业务处理完成后就结束,否则造成资源浪费而导致系统宕机。

SqlMapper

映射器,主要由一个java接口和一个xml文件(也可以是注解)组成。用作负责发送SQL以及返回结果。
使用xml实现映射器
需要在SqlSession的配置文件mybatis-config.xml中加入
	<mappers>
		<mapper resource="nubi/mapper/role/RoleMapper.xml"/>
	</mappers>	
RoleMapper.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="nubi.mapper.role.RoleMapper">
      	     <select id="selectOneById" parameterType="long" resultType="nubi.pojo.Role">
					select id,roleName,note from role where id=#{id}
			 </select>
			<insert id="addOne" parameterType="role" >
					insert into role (roleName,note) value (#{roleName},#{note})
			</insert>
			<update id="updateById" parameterType="role">
					update role set roleName=#{roleName},note=#{note} where id=#{id}
			</update>
			<delete id="deleteById" parameterType="role">
					delete from role where id=#{id}
			</delete>
		</mapper>

使用xml文件配置mybatis

	<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
	<configuration>
	<typeAliases>
		<typeAlias alias="role" type="nubi.pojo.Role"/>
	</typeAliases>
	
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
				<property name="url" 
						  value="jdbc:mysql://localhost:3306/ssm?useUnicode=true&amp;
						  characterEncoding=utf8&amp;useSSL=true&amp;serverTimezone=GMT%2B8"/>
				<property name="username" value="root"/>
				<property name="password" value="123456"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="nubi/mapper/role/RoleMapper.xml"/>
	</mappers>	
	</configuration>
cofiguration元素对应着Configuration类,这个的构造方法接受一个Environment对象。可以用来注册别名typeAlias和mapper接口(映射器)。
typeAlias元素是设置未类或者接口别名,那样以后要用到接口和类就不需要全限定名啦。
environments元素可以设置多个数据源环境 属性default是用以设置数据源,值是environment的i属性id值。
environment元素设置数据源环境,设置数据源事务管理,数据源连接配置参数
mappers 用以设置多个映射器
mapper 元素可以设置具体的映射器,属性resource用来指定具体的mapper文件,另外还有一个class属性用于指定mapper接口。

获得SqlSession

package nubi.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
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 class SqlSessionFactoryUtils {
	private final static Class<SqlSessionFactory> LOCK = SqlSessionFactory.class;
	private static SqlSessionFactory sf = null;
	private SqlSessionFactoryUtils() {}
	private static SqlSessionFactory getSqlSessionFactory() {
		synchronized(LOCK) {
			try {
				if(sf != null) {
					return sf;
				}
				 //InputStream input = Resources.getResourceAsStream();
				 //如果配置文件放在了工程根目录,mybatis自动扫描配置文件,如果放置在其他目录不能用这样写法,就需下面一样,使用自己的写法把文					
				 //件读取程序
				 InputStream input = new FileInputStream(RealPath.getRealPath()+
				"resources/mybatis-config.xml");
				sf = new SqlSessionFactoryBuilder().build(input);
			} catch (IOException e) {
				e.printStackTrace();
				return sf;
			}
			return null;
		}
	}
	
	public static SqlSession openSession() {
		if(sf == null)
			getSqlSessionFactory();
		return sf.openSession();
	}
}
package nubi.controller;

import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import nubi.mapper.role.RoleMapper;
import nubi.pojo.Role;
import nubi.utils.SqlSessionFactoryUtils;

public class Main {
	private final static Logger logger = Logger.getLogger(Main.class);
	public static void main(String[] args) {
		Logger log = Logger.getLogger(Main.class);
		SqlSession sqlSession = null;
		try {
			sqlSession = SqlSessionFactoryUtils.openSession();
			RoleMapper rm = sqlSession.getMapper(RoleMapper.class);
			Role role = rm.selectOneById(3L);
			if(role != null) {
				log.info("找到相关记录");
				log.info("id:"+role.getId());
				log.info(role.getRoleName());
				log.info("note:"+ role.getNote());
			}else {
				log.warn("无法查找到相关记录");
			}
			role.setRoleName("白玫瑰");
			role.setNote("白如白牙热情被吞噬\r\n" + 
					"香槟早挥发得彻底\r\n" + 
					"白如白蛾潜回红尘俗世\r\n" + 
					"俯瞰过灵位\r\n" + 
					"但是爱骤变芥蒂后\r\n" + 
					"如同肮脏污秽\r\n" + 
					"不要提沉默带笑玫瑰\r\n" + 
					"带刺回礼只信任防卫\r\n" + 
					"怎么冷酷却仍然美丽\r\n" + 
					"得不到的从来矜贵\r\n" + 
					"身处劣势如何不攻心计\r\n" + 
					"流露敬畏试探你的法规\r\n" + 
					"即使恶梦却仍然绮丽\r\n" + 
					"甘心垫底衬你的高贵\r\n" + 
					"一撮玫瑰无疑心的丧礼\r\n" + 
					"前事作废当爱已经流逝\r\n" + 
					"下一世\r\n" + 
					"白如白忙莫名被摧毁\r\n" + 
					"得到的竟已非那位\r\n" + 
					"白如白糖误投红尘俗世\r\n" + 
					"消耗里亡逝\r\n" + 
					"但是爱骤变芥蒂后\r\n" + 
					"如同肮脏污秽\r\n" + 
					"不要提沉默带笑玫瑰\r\n" + 
					"带刺回礼只信任防卫\r\n" + 
					"怎么冷酷却仍然美丽\r\n" + 
					"得不到的从来矜贵\r\n" + 
					"身处劣势如何不攻心计\r\n" + 
					"流露敬畏试探美的法规\r\n" + 
					"即使恶梦却仍然绮丽\r\n" + 
					"甘心垫底衬你的高贵\r\n" + 
					"一撮玫瑰模拟心的丧礼\r\n" + 
					"前事作废当爱已经流逝\r\n" + 
					"下一世…");
			//int i = rm.addOne(role);
			//log.info("成功增加记录条数"+i);
			//更新操作 
			if(rm.updateById(role) < 1) {
				log.warn("更新失败");
			}
			log.info("更新成功");
			//删除操作
			if(rm.deleteById(role.getId()) < 1) 
				log.warn("删除失败");
			log.info("删除成功");
			sqlSession.commit();
			
		}catch(Exception e) {
			e.printStackTrace();
			sqlSession.rollback();
			}finally {
				if(sqlSession != null)
					sqlSession.close();
			}
		logger.info("执行完毕!");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值