(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&
characterEncoding=utf8&useSSL=true&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("执行完毕!");
}
}