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