姓名:
学号:
答:如图1所示。
①读取MyBatis的全局配置文件mybatis-config.xml,解析MyBatis的运行环境、数据库连接等信息。
②加载SQL映射文件,mybatis-config.xml文件可以加载多个映射文件。
③通过MyBatis的环境等配置信息,构造会话工厂SqlSessionFactory。
④创建SqlSession对象。由会话工厂创建SqlSession对象,该对象中包含执行SQL语句的所有方法。
⑤MyBatis底层定义了一个Executor接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的 SQL语句,同时负责查询缓存的维护。
⑥在 Executor接口的执行方法中,MappedStatement类型的参数对映射信息进行封装,用于存储要映射的SQL语句的id、参数等信息。
⑦输入参数映射。输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。
⑧输出结果映射。输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。
图1 MyBatis框架工作流程
答:①导入相关JAR包。包括MyBatis和Spring框架所需的JAR包、MyBatis与Spring整合的中间JAR包、数据库驱动JAR包、数据源所需的JAR包等。
②在Spring中配置MyBatis工厂。将MyBatis的 SessionFactory交由Spring来构建,添加如下代码。
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/springtest?characterEncoding=utf8" />
<property name="username" value="root" />
<property name="password" value="root" />
bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:com/mybatis/mybatis-config.xml"/>
bean>
③使用Spring管理MyBatis的数据操作接口。
④对于整合后的框架,开发者不再需要编写 SqlSession对象的创建、数据库事务的处理等繁琐代码,提高了开发效率。
①Hibernate: 开源的对象关系映射框架,对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。优点:非常优秀、成熟的 ORM 框架;完成对象的持久化操作;Hibernate 允许开发者采用面向对象的方式来操作关系数据库;消除那些针对特定数据库厂商的 SQL 代码。
②JPA:JPA本身只是一种ORM规范,并不是ORM 产品。JPA实体与Hibernate的POJO十分相似,最大优势在于是官方公布的Java EE规范标准,具有通用性。
③JDBCTemplate:优点:运行期:高效、内嵌Spring框架中、支持基于AOP的声明式事务。缺点:必须于Spring框架结合在一起使用、不支持数据库跨平台、默认没有缓存。
④iBatis:一个轻量级的框架和持久性API适合持久化的POJO。优点:简便、轻量级、支持存储过程、支持内嵌的SQL、支持动态SQL、支持O/RM。
⑤MyBatis:优点: 高效、支持动态、复杂的SQL构建, 支持与Spring整合和AOP事务、结果集做了轻量级Mapper封装、支持缓存。缺点:不支持数据库跨平台, 需要写SQL语句。
使用Map存储结果集。
任何select语句都可以用Map存储。
<select id="selectAllUser" resultType="map">
select * from user
select>
UserMapper接口中有方法,其中Map的key是select语句查询的字段名,value是查询返回结果的字段值,一条记录映射到一个Map对象中。
public List<Map<String, Object>> selectAllUser();
使用List存储结果集。
//返回一条记录map,key就是列名,值就是表中的值
Map<String,Object> getEmpByIdReturnMap(Integer id);
<select id="getEmpByIdReturnMap" resultType="map">
SELECT id,last_name name,email,gender
FROM tbl_employee
WHERE id = #{id}
select>
使用POJO存储结果集。
User类
public class User{
private Long id;
private String email;
private String password;
private String uname;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String gender;
private LocalDate birthday;
private LocalDateTime createTime;
private String profilePhoto;
}
UserMapper.xml
<resultMap type="com.buaa.po.User" id="myResult">
<id property="id" column="id"/>
<result property="uname" column="name"/>
resultMap>
<select id="selectAllUser" resultMap="myResult">
select id,name,url from User
select>
MySQL、SQL Server,自增主键 在 insert 标签中添加 keyProperty 和 useGeneratedKeys 属性
<insert id="addUser" parameterType="com.buaa.po.User" keyProperty="id" useGeneratedKeys="true">
insert into user (uname,gender) values(#{uname},#{gender})
insert>
Oracle,非自增主键,或者其他数据库取消了主键自增规则,则可以使用MyBatis的
标签自定义生成主键
<insert id="insertUser" parameterType="com.com.po.User">
<selectKey keyProperty="id" resultType="Long" order="BEFORE">
select if(max(id) is null, 1 , max(id)+1) as newUid from user
selectKey>
insert into user (id,uname,gender) values(#{id},#{uname},#{gender})
insert>
参数的传递使用#{参数名}
使用Map传递参数(使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,实际应用中我们应该果断废弃该方式。)
<select id="selectWebsiteByMap" resultType="net.biancheng.po.Website" parameterType="map">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
select>
WebsiteMapper接口中
public List<Website> selectWebsiteByMap(Map<String, String> params);
使用注解传递参数(直观,参数个数小于5时是最佳的传参方式)
<select id="selectWebsiteByMap" resultType="net.biancheng.po.Website">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
select>
WebsiteMapper接口中
public List<Website> selectWebsiteByMap(@Param("name") String name, @Param("url") String url);
使用JavaBean传递参数(当参数个数大于 5 个时,建议使用 JavaBean 方式)
<select id="selectWebsiteByAn" resultType="net.biancheng.po.Website"
parameterType="net.biancheng.po.Website">
SELECT id,NAME,url FROM website
WHERE name LIKE CONCAT ('%',#{name},'%')
AND url LIKE CONCAT ('%',#{url},'%')
select>
WebsiteMapper 接口中方法如下
public List<Website> selectWebsiteByAn(Website website);
pom.xml文件中引入mybatis依赖
<dependency>
<groupId>org.mybatis.spring.bootgroupId>
<artifactId>mybatis-spring-boot-starterartifactId>
dependency>
在application.yml配置文件中写入mybatis相关配置
mybatis:
mapper-locations: classpath:/mapper/*.xml #注意:一定要对应mapper映射xml文件的所在路径
type-aliases-package: com.buaa.weblog.entity # 注意:对应实体类的路径
在resources的mapper文件夹下写相应的xml文件