Mybatas配置过程:
Mybatis的基本组件:
• SqlSessionFactoryBuilder(根据配置信息或者代码来生成 SqlSessionFactory)
• SqlSessionFactory(用来生成SqlSession)
• SqlSession
• SqlMapper生命周期
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder利用XML获得资源来构建SqlSessionFactory,也可以构造造多个SqlSessionFactory,它的作用就是构造SqlSessionFactory,一旦构造结束,就失去了意义,应该毫不犹豫的废弃回收,所以它的生命周期只存在与方法的局部,它的作用就是生成SqlSessionFactory对象。
SqlSessionFactory
SqlSessionFactory的作用是创建SqlSession,而SqlSession就是一个会话,相当于JDBC的Connection.。每次应用程序需要访问数据库,我们就通过SqlSessionFactory创建SqlSession,所以SqlSessionFactory应该在MyBatis应用的整个周期。而如果我们多次创建同一个数据库的SqlSessionFactory,则每次创建SqlSessionFactory会打开更多的数据库连接资源,那么连接资源就很快会被耗尽。因此SqlSessionFactory的责任是唯一的额,它的责任就是创建SqlSession,所以我们果断采用单利模式。如果我们采用多例,多么它对数据库连接的消耗是很大的,不利于统一管理。
SqlSession
SqlSession是一个会话,相当于JDBC的一个Connection对象,它的生命周期应该是在请求数据库处理事务的过程中。它是一个线程不安全的对象,在涉及多线程的时候我们需要特别的当心,操作数据库需要注意其隔离级别,数据库锁等高级特性。此外,每次创建的SqlSession都必须及时关闭,它长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。它存活于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。
Mappe
Mapper是一个接口,而没有任何实现类,它的作业是发送SQL,然后返回我们需要的结果,或者执行SQL从而修改数据库的数据,因此它应该在一个SqlSession事务方法之内,是一个方法级别的东西,就如同一条SQL,尽量在一个SqlSession事务的方法中使用它们,然后废弃掉。搭建一个简单的Mybatis框架
- mybatis-config.xml
- mapper.xml
- mapper接口
- 先得到SqlSession,再拿到mapper接口,调用接口里的方法实现增、删、查、改
•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>
<!–定义数据库信息 –>
<environments default=”development”>
<environment id=”development”>
<!– 采用jdbc事务管理 –>
<transactionManager type=”JDBC”>
<!– 手动提交 –>
<property name=”autoCommit” value=”false”/>
</transactionManager>
<!– 数据库连接信息 –>
<dataSource type=”POOLED”>
<property name=”driver” value=”com.mysql.jdbc.Driver”/>
<property name=”url” value=”jdbc:mysql://localhost:3306/tk” />
<property name=”username” value=”root” />
<property name=”password” value=”root” />
</dataSource>
</environment>
</environments>
<!– 映射器配置 –>
<!– 告知映射文件的位置 –>
<mappers>
<mapper resource=”com170202\mapper\UserMapper.xml”/>
</mappers>
</configuration>
注意这里的事务处理采用了手动提交的方式,所以在执行完sql以后需要执行commit方法
• 得到SqlSession的方法:
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 SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory;
//类线程锁
private static final Class CLASS_LOCK=SqlSessionFactoryUtil.class;
//私有化构造私有化来形成单利模式
private SqlSessionFactoryUtil()
{
}
//创建sqlSessionFactory方法
public static SqlSessionFactory initSqlSessionFactory()
{
String resource =”mybatis-config.xml”;
InputStream inputStream=null;
try {
inputStream=Resources.getResourceAsStream(resource);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(CLASS_LOCK)
{
if(sqlSessionFactory==null)
{
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
}
return sqlSessionFactory;
}
//得到sqlsession
public static SqlSession openSqlSession(){
if(sqlSessionFactory==null)
{
initSqlSessionFactory();
}
return sqlSessionFactory.openSession();
}
}
• 配置mapper.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=”com170202.mapper.UserMapper”>
<select id=”getUser” parameterType=”int” resultType=”com170202.pojo.User”>
select * from user where id=#{id}
</select>
<insert id=”insertUser” parameterType=”com170202.pojo.User” useGeneratedKeys=”true” keyProperty=”id”>
insert into user(name,age) values (#{name},#{age})
</insert>
<delete id=”deleteUser” parameterType=”int”>
delete from user where id=#{id}
</delete>
<update id=”updateUser” parameterType=”com170202.pojo.User”>
update user set name=#{name},age=#{age} where id=#{id}
</update>
</mapper>
• 配置mapper接口:
public interface UserMapper {
public User getUser(int id);
public int insertUser(User user);
public int deleteUser(int id);
public void updateUser(User user);
}
注意,方法名要与xml文件中的id名一致
• pojo类:
public class User {
//主键id
private int id;
//姓名
private String name;
//年龄
private int age;
//无参构造
public User() {
super();
// TODO Auto-generated constructor stub
}
//有参构造
public User(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
//get set方法
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
测试代码
import org.apache.ibatis.session.SqlSession;
import com170202.mapper.UserMapper;
import com170202.pojo.User;
import com170202.util.SqlSessionFactoryUtil;
public class Test {
public static void main(String[] args) {
//insert();
//delete(27);
//update(2,"updatex");
System.out.println(query(26).getName());
}
//增
public static void insert(){
SqlSession sqlSession=null;
try{
sqlSession=SqlSessionFactoryUtil.openSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=new User();
user.setName(“20180202”);
user.setAge(2017);
userMapper.insertUser(user);
sqlSession.commit();
System.out.println(“插入完毕”);
}
catch(Exception ex)
{
System.err.print(ex.getMessage());
}
finally{
if(sqlSession!=null)
{
sqlSession.close();
}
}
}
//删
public static void delete(int id){
SqlSession sqlSession=null;
try
{
sqlSession=SqlSessionFactoryUtil.openSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
userMapper.deleteUser(id);
sqlSession.commit();
System.out.println(“删除完毕”);
}
catch(Exception ex)
{
System.err.print(ex.getMessage());
}
finally{
if(sqlSession!=null)
{
sqlSession.close();
}
}
}
//查
public static User query(int id)
{
SqlSession sqlSession=null;
User user=null;
try
{
sqlSession=SqlSessionFactoryUtil.openSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
user=userMapper.getUser(id);
sqlSession.commit();
}
catch(Exception ex)
{
System.err.print(ex.getMessage());
}
finally{
if(sqlSession!=null)
{
sqlSession.close();
}
}
return user;
}
//改
public static void update(int id,String name)
{
SqlSession sqlSession=null;
try
{
sqlSession=SqlSessionFactoryUtil.openSqlSession();
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.getUser(id);
user.setName(name);
userMapper.updateUser(user);
System.out.print(“跟新完毕”);
sqlSession.commit();
}
catch(Exception ex)
{
System.err.print(ex.getMessage());
}
finally{
if(sqlSession!=null)
{
sqlSession.close();
}
}
}
}