mybatis个人整理
三层架构
三层架构概念:
界面层,业务逻辑层,数据访问层
三层架构对应的包:
界面层:controller包(servlet)
业务逻辑层:service包(service)
数据访问层:dao包(dao)
三层架构对应的框架
界面层:servlet-springmvc框架
业务逻辑层:service类-spring框架
数据访问层:dao类-mybatis框架
MyBatis的使用
1,创建数据库
2,加入maven依赖,和mysql依赖
3,创建与数据库表对应的实体类----用来保存表中的数据
4,创建dao持久层--自定义操作数据库的方法
5,创建mybatis的sql映射文件:
1,在dao接口所在的目录
2,文件名称和dao接口保持一致
6,创建mybatis的主配置文件:
1,一个项目就一个主配置文件
2,主配置文件里面写的是sql映射文件位置,和数据库连接信息
7,创建测试类
SQL映射文件
<!--namepace 叫命名空间,唯一值,可以自定义-->
<mapper namespace="要求和dao接口全限定名称一样">
<select id='' resultType='返回值'>
查询
</select>
<update id='' resultType='范胡子'>
更新
</undate>
<insert id=''>
插入
insert into table values(#{此处要跟实体类属性名一样})
</insert>
<delete id='' resultType='范胡子'>
删除
</delete>
</mapper>
主配置文件
<configuration(配置)>
<environments(环境) default="连接数据库的id/环境名称">
<environments id='自定义,唯一值,表示环境的名称'>
<transactionManager(事务) type="mybatis事务类型"/>
</environments>
</environments>
<mappers>
<mapper resource="sqlxml映射文件位置,
从target/classess开始,
演示:org/one/mybatis.xml"/>
</mappers>
</configuration>
测试
public class one{
public static void main (String[]args){
//InputStream:输入流 Resources:资源
//Session:会话 Factory:工厂 Builder:模式,生成器
//读取主配置文件
InputStream in=resources.getResourcesAsStream(这里写主配置文件位置);
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
/**
* 重要对象,创建使用资源较多,一个就够了
* 说明,sqlsessionFactory的实现类是DefaultSqlSessionFactoty
* 作用:获取sqlsession对象
*/
SqlSessionFactory factory=builder.build(in);
/**
* 方法说明:
* factory.openSession(false);获取非自动提交的事物
* factory.openSession(true);获取自动提交的事物
* 默认是false
*
* sqlsession的实现类是DefaultSqlSession
* sqlsession的接口定义了 selectOne(),selectList(),insert(),
* update(),delete(),rollback(),commit()方法
*
* 方法注意事项
* sqlsession不是线程安全的,需要在方法内部使用,
* 在执行sql语句之后,需要关闭它。sqlsession.close();
* 这样可以保证线程安全
*/
SqlSession sqlSession=factory.openSession(这里可以写布尔类型参数);
返回结果=sqlSession.selectList(sql映射文件的namespace.sql语句的id);
}
}
SQL注意事项
1,mybatis不是自动提交事务的:
在使用除了select以外都要手动提交一下:sqlseeion.commit
配置日志
STDOUT:标准输出 LOGGING:日志
<!--settings是控制mybatis全局行为-->
<settings>
<stting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
动态代理
使用动态代理条件
1,dao接口全限定名称和sql映射文件中的namespace相同
2,dao接口中的方法和sql映射文件中的sql语句标签中id值相同
3,通过dao接口方法返回值也可以确定sqlsession将调用的方法
如果返回值是list那么就调用sqlsession.selectList()方法
如果返回值是int,或者是非list的,那么看sql语句xml映射文件标签
标签是insert,update就会调用insert。update
mybatis动态代理原理:
mybatis根据你的dao接口,创建出一个dao接口实现类,并创建这个类的对象,
完成sqlsession调用方法,访问数据库。
个人理解
原本是主配置文件,mapper文件,还有就是调用具体的sql语句,不使用动态代理的话,
那么就是需要我们把每个sql方法调用封装好:
我们需要指定他执行哪个mapper文件中哪个语句,sqlsession调用什么方法。
List<Object>o=sqlsession.selectList(要执行的映射文件的语句);
然后把这样的一个个方法封装成具体的方法,
封装:public class fengzhuang{
public List<Student>selectObjects() {
String config="mybatis.xml";
InputStream in= Resources.getResourceAsStream(config);
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
SqlSession sqlSession=factory.openSession();
List<Objects>Objects=qlSession.selectList(mapper限定名称.sql语句id);
return Objects
}
public static void main(String[]args){
fengzhuang f=new fengzhuang();
List<Objects>Objects=f.selectObjects();
}
}
使用动态代理后呢
这个类不需要实现了。
public static void main(String[]args){
String config="mybatis.xml";