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();
}
}
}
这是数据库的表:
数据库里面只有一条数据,我们新增一条 和查询一条看看结果如何:
我们执行一下:
我们想要的执行步骤都执行了 ;剩下唯一的数据库到底新增了数据没有?
结果是我们想要的;验证成功!