二.SSM框架之MyBatis框架
二.MyBatis框架
1.MyBatis及ORM简介
- MyBatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。其封装性要低于Hibernate,性能优越,并且小巧、简单易学,应用也越来越广泛。
它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索 - 关于ORM(Object Relational Mapping ),你应该知道的:
(1)对象/关系映射是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据。
(2)在开发中,程序员使用面向对象的技术操作数据,而当存储数据时,使用的却是关系数据库,这样造成了很多不便。ORM在对象模型和关系数据库的表之间建立了一座桥梁,有了它,程序员就不需要再使用SQL语句操作数据库中的表,使用API直接操作JavaBean对象就可以实现数据的查询、存储、更改、删除等操作。
(3)MyBatis通过简单的XML或者注解进行配置和原始映射,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。 - MyBatis是ORM的解决方案,下面通过简单的实例体验MyBatis
2.搭建MyBatis环境
- 在项目中配置jdbc驱动包
点击Project Structure按钮,选择左侧modules,选择Dependencies选项卡,点击“+”,选择“Jars or directories”,找到驱动jar包,Apply之后点击Ok
- 使用navicat建立两张表user(name,password)和book(id,name),并插入几条记录作为测试
- user表
- book表
- 建立和表对应的pojo类
建立pojo(plain old java object)包,右击com包 ->new ->Package->pojo
在pojo下建立两个Java类,即User类、Book类
- User类
package com.pojo;
public class User {
// 类型和数据库保持一致,varchar对应String
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- Book类
package com.pojo;
public class Book {
// 类型和数据库保持一致,varchar对应String
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 建立dao层(data access object),数据访问层,用来访问数据库
右击 com包 -> New -> Package->输入 dao
在dao包中建立两个类的接口,UserDao、BookDao:
右击dao-> New -> Java Class->输入"UserDao",kind选择"interface"
- UserDao
package com.dao;
import com.pojo.User;
import java.util.List;
public interface UserDao {
List<User> queryAllUser();//查询所有user
int addUser(User user);//添加user
}
- BookDao
package com.dao;
import com.pojo.Book;
import java.util.List;
public interface BookDao {
List<Book> queryAllBook();//查询所有书籍
int addBook(Book book);//添加书籍
}
- 建立jdbc.properties文件,典型的Java属性配置文件
右击resources文件夹->new ->File->jdbc.properties(带后缀)
配置mysql数据库,使用test库
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
- 建立类的映射文件夹(mapper)
右击 resources ->New -> Directory -> mapper
在mapper文件夹下建立UserMapper.xml和BookMapper.xml映射文件
- UserMapper.xml内容如下,BookMapper同UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"httpz://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--映射器-->
<mapper namespace="com.dao.UserDao">
<!--将数据库user表映射到userResultMap中 类型为User -->
<resultMap id="userResultMap" type="User">
<result property="name" column="name"/>
<result property="password" column="password"/>
</resultMap>
<!--sql语句-->
<!--实现userDao中定义的 queryAllUser 方法-->
<select id="queryAllUser" resultMap="userResultMap">
select * from user
</select>
<!--实现userDao中定义的 addUser 方法-->
<insert id="addUser" parameterType="User">
insert into user(name,password) value (#{name},#{password})
</insert>
</mapper>
- 核心配置文件configuration.xml
右击resources ->File -> 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>
<!-- 引入外部资源文件 -->
<properties resource="jdbc.properties"></properties>
<!-- 设置驼峰匹配 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 设置包扫描(别名) -->
<typeAliases>
<package name="com.pojo"/>
</typeAliases>
<!-- 配置环境:可以配置多个环境,default:配置某一个环境的唯一标识,表示默认使用哪个环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 配置连接信息 -->
<property name="driver" value="${jdbc.driverClass}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射文件:用来配置sql语句和结果集类型等 -->
<mappers>
<mapper resource="classpath:mapper/*.xml"/>
</mappers>
</configuration>
目录结构如下:
3.MyBatis语法
MyBatis的真正强大之处在于SQL映射语句,也是它的魅力所在,使用SQL映射文件配置可减少50%以上的代码量,MyBatis专注于SQL。关于SQL映射文件的几个元素配置:
-
mapper:映射元素的根元素节点,只有一个namespace(命名空间),其主要作用在于:
- 区分不同的mapper,全局唯一
- 绑定DAO接口,即面向接口编程
-
ResultMap:用来描述数据库结果集和对象的对应关系
-
sql:可以重用的SQL块
-
insert:映射插入语句
- dao中
int addMember(Member member);
, - mapper中这样写(id和方法名一致):
<insert id="addMember" parameterType="Member"> insert into member(memName,password) value (#{memName},#{password}) </insert>
- dao中
-
delete:映射删除语句
- dao 中
int deleteMemberById(int memId);
- mapper中这样写
<delete id="deleteMemberById" parameterType="int"> delete from member where memId=#{memId} </delete>
- dao 中
-
select:映射查询语句
- dao 中
Member queryById(int memId);
- mapper中这样写
<select id="queryById" parameterType="int" resultType="Member"> select * from member where memId=#{memId} </select>
- dao 中
-
update:映射更新语句
- dao中
int updateMember(Member member);
- mapper可以这样写
<update id="updateMember" parameterType="Member"> update member set memName=#{memName},sex=#{sex},password=#{password} </update>
- dao中
-
parameterType:参数类型(int、String、某个pojo)
-
resultType:返回查询的类型,像这样的sql语句:
select * from user where id=1
,只返回1个对象,可为它指定ResultType为User。insert、update、delete元素中均无resultType属性,只有查询操作需要对返回结果指定 -
ResultMap:是对外部resultMap定义的引用,对应外部resultMap的id,像这样的一条sql语句
select * from student where age>20
会返回多个student对象,可为它指定resultMap为studentResultMap,即ResultMap常用于会返回多条记录是使用。
4.实现Spring对MyBatis的整合
1. 配置DataSource
我们将MyBatis配置文件中有关数据源的配置转移到Spring配置文件中单独进行维护。
在Spring中配置数据源,首先要选择一种具体的数据源实现技术,有dbcp、c3p0、Proxool等,以配置c3p0为例:
建立Spring的配置文件,右击resources ->New->Directory->“Spring”
右击Spring文件夹->new->File->“spring-dao.xml”,输入以下代码:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置整合mybatis过程 -->
<!-- 1.配置数据库相关参数properties的属性:${url} -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 2.数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置连接池属性 -->
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- c3p0连接池的私有属性 -->
<property name="maxPoolSize" value="30"/>
<property name="minPoolSize" value="10"/>
<!-- 关闭连接后不自动commit -->
<property name="autoCommitOnClose" value="false"/>
<!-- 获取连接超时时间 -->
<property name="checkoutTimeout" value="10000"/>
<!-- 当获取连接失败重试次数 -->
<property name="acquireRetryAttempts" value="2"/>
</bean>
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 扫描pojo包 使用别名 -->
<property name="typeAliasesPackage" value="com.pojo"/>
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.dao"/>
</bean>
</beans>
将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>
<!-- 配置全局属性 -->
<settings>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true" />
<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
整合完成