项目的搭建可以参考IDEA专栏的构建方式:
mybatis项目创建1
1.借用别人总结的流程图
2 添加坐标,可以参考官方文档,即下载jar包的时候会带有英文文档
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
更新pom文件
3 创建实体
4 编写 Dao 接口
5 编写 Dao 接口 Mapper 映射文件 StudentDao.xml
要求:
1. 在 dao 包中创建文件 StudentDao.xml
2. 要 StudentDao.xml 文件名称和接口 StudentDao 一样,区分大小写的一样。
new — file–StudentDao.xml
为了编译.xml能进入class文件夹中,需要加入编译插件
编译没有文件解决常用方法:
1)maven–lifecycle–clean–complier
2) Build–Rebuild Project
3) 重启IDEA file–Innalidate Caches/Resatart– 第一个按钮
4)都用不到的话直接将文件拷贝到classes文件夹下
6 建立主配置文件mybatis.xml,主要定义数据库的配置信息,基本都是固定的,只要改库相关信息即可。
设置控制输出日志到控制台上。
<dataSource type="POOLED">负责创建连接池
7 创建mybatis类
mybatis项目总结必备步骤(
重要
):
1)加入maven依赖
2)创建dao接口,写符合业务场景的方法
3)创建mapper文件(sql映射文件)来写sql,对应接口中的方法
4)创建mybatis主配置文件(连接数据库信息和指定mapper文件位置)
5)使用mybatis的对象sqlSession来执行sql语句
二、概念引入:
1)mybtis可以理解为增强的jdbc
三层架构对应的框架framework(可以理解为一个模板,根据自己的业务增加到模板中,框架已包含常用的功能,半成品软件)
界面层–springmvc
业务逻辑层–spring
数据访问层–mybatis
2)为什么不用jdbc而选择mybatis
1)因为jdbc代码多且重复,开发效率低,需要进行connection statement result对象创建和销毁,业务代码和数据库操作混在一起。
2)mybatis作为sql映射框架,sql mapper可以将数据库表的一行数据映射成为一个java对象(一行数据可以看作是一个java对象);
开发人员不需要进行connection statement result对象创建和销毁;
执行sql的能力,不用手动执行sql;
能封装结果集;
开发人员只需要写sql正确就可以了!!
三、功能
3-1)
mybatis默认不是提交事务,需要sqlsession.commit();
开启日志可以看到sql等详细信息,有助于调试定位问题,可查看以上信息;
3-2)sqlSession
private Mybatis() {
String resource = "xxx.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
sqlSession = factory.openSession(true);
}
Resources:作为mybatis中的一个类,读取主配置文件内容;
SqlSessionFactoryBuilder:主要创建SqlSessionFactory ;
SqlSessionFactory :是一个重量级对象,程序创建一个对象消耗的时间长且使用资源多,为此一个项目中有一个SqlSessionFactory 对象即可。是一个接口,实现类是DefaultSqlSessionFactory .
主要作用是获取SqlSession对象;
sqlSession = factory.openSession(true);假设是factory.openSession()无参,获取的是非自动提交事务的SqlSession对象,有参为true则是自动提交事务,false是非自动提交事务的。
sqlSession 是一个接口,定义了不同的方法来操作数据。其实现类是DefaultsqlSession 。
使用规范:sqlSession对象不是线程安全的,需要在方法内部使用,执行sql之前需要获取sqlSession,执行完sql语句后需要关闭它,sqlSession。close(),这样保证是线程安全的。
3-3)mybatis动态代理(重要、理解)
mybatis会根据接口dao的方法调用,获取执行sql语句的信息,创建出一个dao接口的实现类(这也是我们不需要写dao接口实现类的原因),并创建这个类的对象,最终完成sqlSession调用方法,访问数据库。
mybatis会完成getSqlSession和sqlSession对应的CRUD方法操作,并且最后sqlSession.close()?
动态代理机制:使用sqlSession.getMapper(dao接口),能够获取dao接口对于实现类对象。
public class TestMybatisProxy {
//测试功能
@Test
public void testSelect() throws IOException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List<Student> list = studentDao.selectStudents();
list.forEach(student -> System.out.println(student));
}
}
insert方法需要提交事务sqlSession.commit();
结论总结:
mybatis动态代理使用的jdk的动态代理机制,深层目前暂时不需要深入理解;
后期项目都是使用动态代理方法!
3-4)
简单项目拷贝步骤
直接在IDEA代码文件夹中找到要拷贝的项目,复制一份—修改文件夹名称—删掉target文件夹和.iml文件—修改pom.xml中的坐标名称和文件夹名称一样;
IDEA软件操作:file—Project Struture—选择module—选择+号(import module)—选择需要导入的项目—选择module SDK—完成
导入完后需要手动将resource文件夹修改为mark directory as — resource root
四、参数(重点内容)
4-1)parameterType:写在mapper中的一个属性,表示的是dao接口中方法的参数的数据类型;mybatis会从这个参数中知道传入参数的类型。
parameterType 可以是java的全限定名称或者mybatis定义的别名(请参考文档),作用是简短点。
parameterType不是强制的,因为mybatis能通过反射机制发现接口参数的数据类型。
结论 是可以没有,平时写代码也是不写!!
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
4-2)mybatis定义的简单类型参数:java的基本数据类型和String叫做简单类型,在mapper文件中通过#(任意字符)获取简单类型的一个参数的值。
4-3)mybatis是增强版的jdbc(jdbc步骤以及mybatis封装哪些步骤,可百度查看)
4-4)传参方式(1 2常用,其他较少使用)
1- @param 多个参数时,使用@param命名参数,格式:@Param(“参数名”) String name,推荐使用该方式。
2- 对象方式传参(实际项目中使用频次高,因为灵活方便):完成的语法格式:#{属性名,javaType=类型名称,jdbcType=数据类型},javaType指的是java中的属性数据类型,jdbcType指的是数据库中的数据类型(可以参考文档)
但是这样的写法在实际项目中比较少使用。
我们使用更多的简化方式:#{属性名}
3-按位置传参方式
#{arg0},#{arg1}
4-map传参方式
#{key}来获取对应的value值,可读性差,buzhi阿里开发手册也不建议参数使用map;
4-5) # $区别
# 安全性高,避免sql注入,效率高,代表的是列值。
$ 是字符串的替换,告诉mybatis传入的是字符串。
未完待续!