SSM
SpringMVC + Spring + Mybatis
3SpringMVC:充当的就是Servlet的角色。可以理解为SpringMVC是Spring的WEB支持。
1Mybatis:充当的就是Dao层。
2Spring:充当的时一个润滑油的角色。
MybatisPlus:国内的团队,baomidou,可以写SQL,也可以不写SQL。介于Mybatis和Hibernate之间。
Hibernate:充当Dao层。不需要写SQL,自动生成并执行SQL语句。
Mybatis
历史
-
Mybatis是apache的一个开源项目IBatis,2010年,apache迁移给了Google code,改名Mybatis,2013年迁移到GitHub。
-
Mybatis3,IBatis1,IBatis2。
作用
-
是一款优秀的持久层框架,支持定制化的SQL、存储过程以及高级映射。
-
之前我们学过的所有的JDBC代码和手动设置参数获取结果集,都不用写了。
-
使用简单的XML配置文件或者注解来映射原生信息,更加的方便。
持久化
持久化把数据存储在磁盘而不是内存。
-
程序产生的数据首先都是在内存
-
内存不可靠,我们需要通过一些技术把数据永久存储在硬盘上。
持久层
之前的dao层,之前我们通过反射,通过泛型,通用的dao,我们在操作不同的表或者逻辑的时候,我们之前会创建一个接口,再创建接口的实现类,实际上这个dao层,就叫持久层。
优缺点
-
sql语句与代码分离,存放于xml文件中。(最牛逼的特点)
-
优点:便于维护管理,不用在java代码中找sql语句。
-
缺点:不能通过打断点的方式调试。通过日志来解决这个问题。
-
-
动态SQL语句。(最牛逼的特点)
-
优点:通过逻辑标签代替编写逻辑代码,生成不同的SQL。
-
缺点:拼接复杂的SQL语句时,没有直接拼接直观。
-
-
查询结果和java对象自动映射
-
优点:保证名称之间的对应关系。可以下划线和驼峰自动转换。
-
缺点:对开发人员的SQL语句依赖很强。
-
XML配置文件
约束
保证我们的xml能够使用哪些标签,保证xml的有效性。
主配置文件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:环境们 配置数据库连接相关。可以配置多个数据库连接 --> <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://127.0.0.1/ssm?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> </configuration>
另外一个mapper.xml
第一次使用Mybatis,需要两个文件。
-
一个接口类mapper(就是咱们之前写的dao)Java文件,不需要我们写
实现类
。 -
一个接口对应着一个xml文件
-
两个文件的名字最好相同,UserMapper.java->UserMapper.xml
-
框架会根据mapper和xml联合,通过代理模式创建实现类。
一般情况下,我们管接口对应的xml文件叫做映射文件。
<?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"> <!-- namespace:对应的mapper接口的全类名 --> <mapper namespace="com.jsoft.dao.UserMapper"> <!-- 写sql语句 --> <!-- id:mapper接口中的方法名 resultType:方法的返回值类型,如果是entity类型,需要写全类名 parameterType:方法的入参的类型,可以省略 #{id}:代表方法的入参,类似于之前的?占位符,Mybatis底层使用的是什么?PreparedStatement --> <select id="selectUserById" resultType="com.jsoft.entity.User"> select id,username,password from user where id = #{id} </select> </mapper>
映射文件最终要交给mybatis去处理,所有的映射文件需要在主配置文件中进行注册。
<?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:环境们 配置数据库连接相关。可以配置多个数据库连接 --> <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://127.0.0.1/ssm?useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 注册各个映射文件 --> <mappers> <mapper resource="mapper/UserMapper.xml"></mapper> </mappers> </configuration>
测试类
package com.jsoft.test; import com.jsoft.dao.UserMapper; import com.jsoft.entity.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.InputStream; // 测试我们的UserMapper public class UserMapperTest { @Test public void testSelectUserById() { // 构建一个session工厂 // 需要加载mybatis的主配置文件 InputStream inputStream = UserMapperTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream); // 获取session SqlSession session = sqlSessionFactory.openSession(); // 获取到接口的代理实现类 UserMapper mapper = session.getMapper(UserMapper.class); // 调接口里的方法 User user = mapper.selectUserById(1); System.out.println(user); } }
=========================================================================
每日面试题:
一、String s = new String("xyz");创建了几个String Object?二者之间有什么区别?
两个对象。一个是"xyz",为缓冲区对象。另一个是new出来的String对象。
这两个对象的值相同,但不是同一个对象。
补充,新建对象有几种方式?
1. 使用new关键字
2. 使用反射,调用newInstance
3. 使用clone方法
4. 使用序列化与反序列化
5. 动态代理(Proxy类和CGLIB)er
二、ArrayList和Vector的区别
1. 线程同步,Vector线程安全,ArrayList线程不安全
2. 效率问题,Vector效率低,ArrayList效率高
3. 增长数量,Vector以1.5倍增长,ArrayList以2倍增长