好处:框架封装了很多细节,使开发者用简便的方法实现功能。
三层架构
表现层:
是用于展示数据
业务层:
是处理业务需求
持久层:
是和数据库交互
Mybitis框架是持久层框架
特点
1、支持自定义SQL、存储过程
2、对原有的JDBC进行了封装,几乎消除了所以得JDBC代码,让开发者只需关注SQL本身
3、支持XML和注解配置自动完成OAM操作,实现结果映射
一、框架部署
1、创建Maven项目
2、在项目中添加Mybatis依赖
● 在pom.xml中添加Mybatis依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
● mysql driver
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
● 创建Mybatis配置文件
○ resources-->右键New-->Edit File Templates
<?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>
</configuration>
○在resources中新建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="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/aaaa?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
</configuration>
二、框架使用
2.1、创建数据表
2.2、创建实体类
2.3、创建DAO接口,并定义操作方法
public interface StudentDAO {
public int insertStudent(Student student);
public int deleteStudent(int id);
}
2.4、创建映射文件
(1)在resouces目录下。新建mappers文件夹
(2)在mappers中新建映射文件(下面为映射文件的模板)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.czy.spring.StuMapper">
</mapper>
(3)insert
<insert id="insertStudent" parameterType="bean.Student">
insert into stu(id,stuName)
values(#{id},#{stuName})
</insert>
- namespace------------写接口类的全类名
- 如果想实现增加方法,就写insert,id为接口里面方法名,parameterType为实体类,values为实体类里面的属性
(4)delete方法
<delete id="deleteStudent" parameterType="bean.Student">
delete from stu where id = #{id}
</delete>
(5)在映射文件中对DAO中定义的方法进行实现
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test.StudentDAO">
<insert id="insertStudent" parameterType="bean.Student">
insert into stu(id,stuName)
values(#{id},#{stuName})
</insert>
<delete id="deleteStudent" parameterType="bean.Student">
delete from stu where id = #{id}
</delete>
</mapper>
(6)将映射文件添加到主配置文件
<?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="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/aaaa?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/StuMapper.xml"></mapper>
</mappers>
</configuration>
三、单元测试
3.1 添加单元测试依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
3.2 创建测试类----------在被测试类名后面 alt + insert 选择Test ----JUnit4
3.3测试代码
public void insertStudent() {
try {
//加载Mybatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//会话工厂
SqlSessionFactory factory = builder.build(is);
//会话(连接)
SqlSession session = factory.openSession();
//通过会话获取DAO对象
StudentDAO studentDAO = session.getMapper(StudentDAO.class);
//测试StudentDAO中的方法
int i = studentDAO.insertStudent(new Student(1, "张三"));
//提交
session.commit();
System.out.println(i);
} catch (IOException e) {
e.printStackTrace();
}
}
四、Mybatis的CRUD操作
4.1 添加操作
4.2 删除操作
(1)在StudentDAO中定义删除方法
(2)在StuMapper.xml对接口方法进行实现
<delete id="deleteStudent" parameterType="bean.Student">
delete from stu where id = #{sid}
</delete>
4.3 修改操作
(1)在StudentDAO中定义修改方法
(2)在StuMapper.xml对接口方法进行实现
<update id="updateStudent">
update stu set stuName = #{stuName} where sid = #{sid}
</update>
4.4查询操作:查询所有
(1)在StudentDAO中定义查询方法
public List<Student> studentList();
(2)在StuMapper.xml对接口方法进行实现
方法一:起跟实体类一样的别名
<!-- resultType 指定查询结果封装的对象实体类-->
<select id="studentList" resultType="bean.Student">
select sid as sid,stuName as stuName
from stu
</select>
方法二:
<resultMap id="随便起" type="实体类全类名">
<id column="数据库字段名" property="实体类属性"/>
<result column="数据库字段名" property="实体类属性"/>
</resultMap>
<!-- resultType 指定查询结果封装的对象实体类-->
<select id="studentList" resultMap="随便起">
select sid,stuName
from stu
</select>
4.5 查询操作-查询一条记录
(1)在StudentDAO中定义查询方法
public Student queryStudent(int id);
(2)在StuMapper.xml对接口方法进行实现
<select id="queryStudent" resultType="bean.Student">
select sid as sid,stuName as stuName
from stu
where sid = #{id}
</select>
4.6 查询操作-多参数查询
(1)分页查询
●在StudentDAO中定义查询方法
public List<Student> studentListByPage(int start,int pageSize);
●在StuMapper.xml对接口方法进行实现
方法一:很少用
//多参数必须要指定的arg0,arg1或param1,param2
<select id="studentListByPage" resultType="bean.Student">
select sid as sid,stuName as stuName
from stu
limit #{arg0},#{arg1}
</select>
方法二:在接口类方法中给参数加注解
public List<Student> studentListByPage(@Param("start") int start, @Param("pageSize")int pageSize);
<select id="studentListByPage" resultType="bean.Student">
select sid as sid,stuName as stuName
from stu
limit #{start},#{pageSize}
</select>
4.7 查询操作-查询总记录数
(1)在StudentDAO中定义查询方法
public int getCount();
(2)在StuMapper.xml对接口方法进行实现
<select id="getCount" resultType="int">
select count(1) from stu
</select>
4.8 添加操作-回填生成的主键
● StudentMapper.xml的添加操作标签------insert
<!-- useGeneratedKeys 设置添加操作是否需要回填生成的主键-->
<!-- keyProperty 设置回填的主键值赋值到参数对象的那个属性-->
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="sid">
insert into stu(sid,stuName)
values(#{sid},#{stuName})
</insert>
五、Mybatis工具类的封装
public class MybatisUtil {
private static SqlSessionFactory factory;
private static final ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>();
static {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getFactory(){
return factory;
}
public static SqlSession getSqlSession(){
SqlSession sqlSession = local.get();
if (sqlSession == null){
sqlSession = factory.openSession();
local.set(sqlSession);
}
return sqlSession;
}
public static <T extends Object>T getMapper(Class<T> c){
SqlSession sqlSession = getSqlSession();
return sqlSession.getMapper(c);
}
}
六、事务管理
SqlSession对象
● getMapper(DAO.class):获取Mapper(DAO接口的实例)
● 事务管理
6.1 手动提交事务管理
SqlSession sqlSession = MybatisUtil.getSqlSession();
try {
//获取SqlSession对象时,就默认开启事务管理
StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
nt i = studentDAO.deleteStudent(1);
//需要手动提交
sqlSession.commit();
System.out.println(i);
} catch (Exception e) {
//如果失败,则回滚事务
sqlSession.rollback();
}
6.2 自动提交事务管理
//通过SQLSessionFactory调用openSession方法获取SQLSession对象时,可以通过参数设置是否自动提交
sqlSession = factory.openSession(true);
七、Mybatis主配置文件
7.1 properties
用于设置键值对,或者加载属性文件
● 在recources目录下创建jdbc.properties文件,配置键值对如下
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/aaaa?characterEncoding=utf-8
username = root
password = 123456
● 在mybatis-config.xml中通过properties标签引用 jdbc.properties 文件
7.2 setting
<settings>
<!--启动二级缓存-->
<setting name="cacheEnabled" value="true"/>
<!--启动自动延迟-->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
7.3 typeAliases-----起别名
在映射文件中可以直接使用别名来代替全限类名
<typeAliases>
<typeAlias type="bean.Student" alias="Student"></typeAlias>
</typeAliases>
7.4 plugins
用于配置Mybatis的插件
<plugins>
<plugin interceptor=""></plugin>
</plugins>
7.5 environments
7.6 mappers
用于载用映射文件
八、映射文件
8.1 Mybatis初始化