一、MyBatis的概述
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射
1.mybatis框架架构图
2.mybatis三层
我们把Mybatis的功能架构分为三层:
- API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收
到调用请求就会调用数据处理层来完成具体的数据处理。 - 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是
根据调用的请求完成一次数据库操作。 - 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是
共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
二、mybatis入门
1.添加项目需要的jar包
- lombok-1.16.6.jar
红辣椒,自动生成getter/setter/toString等方法
使用的前提是已经在STS或者Eclipse中安装了lombok插件- mysql-connector-java-5.1.26-bin.jar
mysql数据库的jdbc驱动包,访问mysql必须导入备jar包mybatis-3.4.5.jar
mybatis框架的核心jar包
2.根据表结构创建实体类
3. mybatis主配置文件: mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 约束 ,看到网址就是在线的 ,也可以配置离线的window>preferences-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 关联数据库的配置信息 (写在前面)关联后用${key}获取配置文件的key-->
<properties resource="db.properties"/>
<typeAliases>
<!-- 包扫描器,扫描指定的包,把该包下面的所有的类,统一起别名,别名是类的名称的本身,(不限制大小写)规范第一个字母小写 -->
<package name="cn.wolfcode.domain"/>
</typeAliases>
<!-- default 表示环境的开关 ,必须要和environment标签上的id属性的值必须一致 -->
<environments default="dev">
<!-- dev开发环境 -->
<environment id="dev">
<!--事务管理器mybatis框架默认的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据源(表示连接池) mybatis 框架默认的连接池是POOLED
配置连接数据库的四要素: driverClassName,url , username , password
-->
<dataSource type="POOLED">
<!-- property 表示属性 name:属性的名称 value:属性的值-->
<property name="driver" value="${jdbc.driverClassName}"/><!-- 配置文件key加jdbc. 前缀防止去读取计算机系统里的name-->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- pro生产环境 -->
<!-- <environment id="pro"></environment> -->
<!-- 配置mapper的文件 -->
<mappers>
<!-- resource表示 会去 字节码的输出目录下 寻找 -->
<mapper resource="cn/wolfcode/mapper/usermapper/UserMapper.xml"/>
<mapper resource="cn/wolfcode/mapper/studentmapper/StudentMapper.xml"/>
</mappers>
</configuration>
三、DAO层开发
1. 编写dao接口CRUD抽象方法
package cn.wolfcode.dao;
import java.util.List;
import cn.wolfcode.domain.User;
public interface IUserDAO {
/**
* 保存用户的信息
*@param user 用户信息表
*/
void insert(User user);
/**
* 根据主键id更新用户信息
* @param user
*/
void updateById(User user);
/**
* 根据主键id删除用户信息
* @param user
*/
void deleteById(Long id);
/**
* 根据主键id查询单条用户信息
* @param user
*/
User selectOneById(Long id);
/**
* 根据主键id查询所有用户信息
* @param user
*/
List<User> selectList();
}
2. dao接口实现类CRUD
package cn.wolfcode.dao.impl;
import java.io.File;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import cn.wolfcode.dao.IUserDAO;
import cn.wolfcode.domain.User;
import cn.wolfcode.util.MyBatisUtil;
import lombok.Cleanup;
public class UserDaoImpl implements IUserDAO {
@Override
public void insert(User user) {
try {
@Cleanup //lombok提供的关闭资源注解,表示使用完sqlSession 后,会自动关闭close
// Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");
// 3.通过工具类对象获取sqlSession
SqlSession sqlSession = MyBatisUtil.openSession();
// 4.通过连接对象操作数据库(对数据库中的数据进行CRUD)
/**
* arg0 : 表示 sql语句的唯一标识 namespace +"." + id arg1 : 表示 执行sql语句
* 需要传入的参数 (如果有多个参数 使用对象封装一下)
*/
sqlSession.insert("cn.wolfcode.mapper.usermapper.UserMapper.insert", user);
// 5.提交事务
sqlSession.commit();
// 6.关闭资源 (资源归还)
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void updateById(User user) {
try {
// 3.通过工具类对象获取sqlSession
SqlSession sqlSession = MyBatisUtil.openSession();
// 4.通过sqlSession对象执行update操作
sqlSession.update("cn.wolfcode.mapper.usermapper.UserMapper.updateById", user);
// 5.提交事务
sqlSession.commit();
// 6.关闭事务
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void deleteById(Long id) {
try {
// 3.通过工具类对象获取sqlSession
SqlSession sqlSession = MyBatisUtil.openSession();
// 4.通过sqlSession对象执行update操作
sqlSession.delete("cn.wolfcode.mapper.usermapper.UserMapper.deleteById", id);
// 5.提交事务
sqlSession.commit();
// 6.关闭事务
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public User selectOneById(Long id) {
User user = null;
try {
// 3.通过工具类对象获取sqlSession
SqlSession sqlSession = MyBatisUtil.openSession();
// 4.通过sqlSession对象执行update操作
user = sqlSession.selectOne("cn.wolfcode.mapper.usermapper.UserMapper.selectOneById", id);
// 查询可以不执行 5.提交事务
// sqlSession.commit();
// 6.关闭事务
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
@Override
public List<User> selectList() {
List<User> user = null;
try {
// 3.通过工具类对象获取sqlSession
SqlSession sqlSession = MyBatisUtil.openSession();
// 4.通过sqlSession对象执行update操作
user = sqlSession.selectList("cn.wolfcode.mapper.usermapper.UserMapper.selectList");
// 查询可以不执行 5.提交事务
// sqlSession.commit();
// 6.关闭事务
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
}
3. 建立test类测试实现类CRUD方法
调用IUserDAO 中的方法,执行指定的SQL
package cn.wolfcode.test;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import org.junit.Test;
import cn.wolfcode.dao.IUserDAO;
import cn.wolfcode.dao.impl.UserDaoImpl;
import cn.wolfcode.domain.User;
public class UserDaoTest {
private IUserDAO userDAO = new UserDaoImpl();
@Test
public void testInsert() {
User user = new User();
user.setName("权哥");
user.setAge(32);
user.setHiredate(new Date());
user.setSalary(BigDecimal.TEN);
userDAO.insert(user);
System.out.println(user);
}
@Test
public void testUpdateById() {
User user = new User();
user.setName("小马哥");
user.setAge(30);
user.setHiredate(new Date());
user.setSalary(BigDecimal.TEN);
user.setId(3L);
userDAO.updateById(user);
System.out.println(user);
}
@Test
public void testDeleteById() {
userDAO.deleteById(4L);
}
@Test
public void testSelectOneById() {
User u = userDAO.selectOneById(3L);
System.out.println(u);
}
@Test
public void testSelectList() {
List<User> u = userDAO.selectList();
u.stream().forEach(System.out::println);
}
}
四、获取自动生成主键
useGeneratedKeys: 是否要获取自动生成的主键
keyColumn: 表中的主键列
keyProperties: 主键列对应的属性
<insert id="insert" useGeneratedKeys="true" keyColumn="id"
keyProperty="id">
insert into user(name,age,salary,hiredate) values
(#{name},#{age},#{salary},#{hiredate})
</insert>
五、细节处理
1.类型别名
<configuration>
-------
<typeAliases>
<!-- 包扫描器,扫描指定的包,把该包下面的所有的类,统一起别名,别名是类的名称的本身,(不限制大小写)规范第一个字母小写 -->
<package name="cn.wolfcode.domain"/>
</typeAliases>
-------
</configuration>
修改后:
<!-- user是别名,相当于User类的全限定名cn.wolfcode.domain.User
别名的使用是有前提的,必须要在mybatis的主配置文件中配置typeAliases -->
<select id="selectOneById" resultType="user" >
select * from user where id = #{id}
</select>
2.日志管理
六、抽取MyBatisUtil工具类
package cn.wolfcode.util;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private MyBatisUtil() {
}
private static SqlSessionFactory factory = null;
static {
try {
// 1.通过加载mybatis的主配置文件 获取inputStream
// mybatis 框架中 给我们提供一种加载配置文件的方式
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
// 2.通过inputStream流构建一 个sqlSessionFactory对象
factory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
//通过SqlSessionFactory 获取sqlSession对象
public static SqlSession openSession() {
// 3.获取sqlSession对象, 可以把sqlSession 对象想像成连接对象(connection)
SqlSession sqlSession = factory.openSession(true);
/*ture表示自动提交事务
*@Override
public SqlSession openSession(boolean autoCommit)*/
return sqlSession;
}
}
七、抽取db.properties
1.db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///javaweb?characterEncoding=utf-8
jdbc.username=root
jdbc.password=admin
2.
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 约束 ,看到网址就是在线的 ,也可以配置离线的window>preferences-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 关联数据库的配置信息 (写在前面)关联后用${key}获取配置文件的key-->
<properties resource="db.properties"/>
<typeAliases>
<!-- 包扫描器,扫描指定的包,把该包下面的所有的类,统一起别名,别名是类的名称的本身,(不限制大小写)规范第一个字母小写 -->
<package name="cn.wolfcode.domain"/>
</typeAliases>
<!-- default 表示环境的开关 ,必须要和environment标签上的id属性的值必须一致 -->
<environments default="dev">
<!-- dev开发环境 -->
<environment id="dev">
<!--事务管理器mybatis框架默认的事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据源(表示连接池) mybatis 框架默认的连接池是POOLED
配置连接数据库的四要素: driverClassName,url , username , password
-->
<dataSource type="POOLED">
<!-- property 表示属性 name:属性的名称 value:属性的值-->
<property name="driver" value="${jdbc.driverClassName}"/><!-- 配置文件key加jdbc. 前缀防止去读取计算机系统里的name-->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- pro生产环境 -->
<!-- <environment id="pro"></environment> -->
<!-- 配置mapper的文件 -->
<mappers>
<!-- resource表示 会去 字节码的输出目录下 寻找 -->
<mapper resource="cn/wolfcode/mapper/usermapper/UserMapper.xml"/>
<mapper resource="cn/wolfcode/mapper/studentmapper/StudentMapper.xml"/>
</mappers>
</configuration>