认识mybatis

mybatis的核心组件分为四个部分:

1.SqlSessionFactorybuilder(构造器):它会根据配置文件中的配置生成SqlSessionFactory,当然,如果你使用的代码创建也是可以实现的,但是通常对于扩展性来说配置文件来创建还是很好的选择;它创建SqlSessionFactory是通过创建者(Builder)模式分步构建的。

2.SqlSessionFactory(工厂接口):使用工厂模式来生成SqlSession;

3.SqlSession(会话):它是一个接口,即可以发送sql执行返回结果,也可以获取Mapper;

4.SQL Mapper(映射器):Mybatis新设计存在的组件,它由一个Java接口和XML文件(或者注解)构成,需要给出对应的sql和映射规则。它负责发送sql去执行,并返回结果。

注:无论是映射器还是SqlSession都可以发送sql到数据库执行,但是使用Mapper接口编程可以消除SqlSession带来的功能性代码,提高可读性;SqlSession发送sql,需要一个id去匹配sql,而Mapper接口则完全面向对象的语言。

1)用xml的方式创建一个SQLSessionFactory,并实现其访问数据库;

(1)首先创建一个实体类:

package pojo;

public class User {

	private String id;
	private String username;
	private String userpwd;
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", userpwd=" + userpwd + "]";
	}
}

get和set方法在这就省略了;当然要创建对应的表数据。

(2)然后创一个dao层的接口,用于实现相关业务操作;

package dao;

import pojo.User;

public interface UserDao {

	public User getUserById(String id);
	
	public void insertUser(User user);
}

(3)跟着思路走,mybatis是面向接口开发,没有实现类,因此我们来创建实体类与数据库的映射,即映射器

<?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="dao.UserDao">
	<select id="getUserById" parameterType="string" resultType="pojo.User">
		select id,username,userpwd from t_users where id=#{id}
	</select>
	<insert id="insertUser" parameterType="pojo.User">
		insert into t_users(id,username,userpwd) values (#{id},#{username},#{userpwd})
	</insert>
</mapper>

到这里我们的映射器就创建完成了,但是要注意,其中namespace是指的接口路径,不要填写实体类的路径;好了有了这些,我们就需要去创建mybatis的基础xml了;

(3)创建一个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">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/pom"/>
				<property name="username" value="root"/>
				<property name="password" value="mysql"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="mapper/UserMapper.xml"/>
	</mappers>
</configuration>

这里要注意,别忘了把映射器注册进来,POOLED表示的是数据源利用“池”的概念将JDBC和Connection对象组织起来;更多说明可以自己百度一下;

(4)到了这一步,可以说已经是万事具备了;就差我们需要的SQLSessionFactory了,有了它我们就会拥有SQLSession,然后我们就拥有一切了;

package mybatis;
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 CreatFactoryUtils {
	private static SqlSessionFactory sqlSessionFactory=null;
	private CreatFactoryUtils(){}
	public static SqlSessionFactory getSqlSessionFactory(){
			String resource="mybatis-config.xml";//这个就是我们的基本配置文件
			InputStream inputStream;
			if (sqlSessionFactory!=null) {
				return sqlSessionFactory;
			}
			try {
				inputStream=Resources.getResourceAsStream(resource);//读取配置文件生成一个流
				sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
			} catch (Exception e) {
				e.printStackTrace();
				return null;
			}
			return sqlSessionFactory;
		}
	public static SqlSession openSqlSession(){
		if (sqlSessionFactory==null) {
			getSqlSessionFactory();
		}
		return sqlSessionFactory.openSession(true);
	}
}

这里描述一下:总共有两个点主要说明一下;第一个点就是:new SqlSessionFactoryBuilder().build(inputStream);这里是构造器通过创建者模式来生成的SQLSessionFactory,传的参数是一个InputStream类型的参数;源码上面还有很多其他条件;可以自己百度下;第二点,也是最重要的一个:sqlSessionFactory.openSession(true);这句为什么重要呢?因为如果这里的true不加会出现insert语句执行后数据库并没有新增数据,说到这就应该知道了,加上true就相当于设定自动提交事务;不设置就是mybatis默认的;但它默认是不提交事务的。所以要注意;

到这里,一切都结束了,唯一想的是验证一下到底我们创建的管不管用呢?

	public static void main(String[] args) {
		Logger log = Logger.getLogger(Test.class);
		User user=new User();
		user.setId("2");
		user.setUsername("hanjunyi");
		user.setUserpwd("12345");
		SqlSession sqlSession=null;
		try {
			sqlSession = CreatFactoryUtils.openSqlSession();
			UserDao mapper=sqlSession.getMapper(UserDao.class);
			User userById = mapper.getUserById("1");
			mapper.insertUser(user);
			log.info("================"+userById);
		} catch (Exception e) {
		}finally {
			if (sqlSession!=null) {
				sqlSession.close();
			}
		}
	}

这是数据库的表:


数据库里面只有一条数据,我们新增一条 和查询一条看看结果如何:

我们执行一下:


我们想要的执行步骤都执行了 ;剩下唯一的数据库到底新增了数据没有?


结果是我们想要的;验证成功!

猜你喜欢

转载自blog.csdn.net/hbl6016/article/details/80096142
今日推荐