MyBatis介绍:
mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis 通过xml 或注解的方式将执行的各种statement 配置起来,并通过java 对象和statement 中sql的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql并将结果映射为 java 对象并返回。
采用 ORM ( Object relational mapping)思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与 jdbc api打交道,就可以完成对数据库的持久化操作。
ORM ( Object relational mapping):对象关系映射 javabean–关系型数据库MySQL
通过ORM解决sql语句执行结果映射为java对象 【表中字段–javabean属性 自动完成映射 就要求查询返回的字段和javabean的属性一致。】
官网: http://www.mybatis.org/mybatis-3/
-
MyBatis入门
-
创建Maven项目【javase】 添加依赖
-
创建javabean User
-
创建dao接口 com.itheima.dao.UserDao
-
创建dao接口映射文件 【resources | com**/itheima/**dao | UserDao.xml】
-
创建MyBatis核心配置文件mybatis-config.xml 【resources】
-
编写测试类 【加载配置文件–>SqlSessionFactory–>SqlSession–>代理对象–>调用方法】
-
-
mybatis规范
1、 Mapper.xml(UserDao.xml)文件中的namespace必须和mapper(Dao)接口的全限定名相同。
2、Mapper.xml文件中select,update等的标签id的值必须和mapper(Dao)接口的方法名相同
3、Mapper.xml文件中select,update等的标签的parameterType必须和mapper(Dao)接口的方法的形参类型对应
4, Mapper.xml文件中select等的标签的resultType必须和mapper(Dao)接口的方法的返回值类型对应
5, Mapper.xml文件的文件名尽量和mapper(Dao)接口的名字一样
6, Mapper.xml文件的路径尽量和mapper(Dao)接口的路径在同一层目录
接下来使用MyBatis实现CURD:
环境准备:
添加依赖
pom.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.Mr_Xu</groupId>
<artifactId>dya34</artifactId>
<version>1.0-SNAPSHOT</version>
<!--JDK编译版本设置-->
<properties>
<project.build.sourcEncoding>UTF-8</project.build.sourcEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--1. 添加依赖-->
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--MyBatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--lombok 依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
</dependency>
</dependencies>
</project>
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">
<!--MyBatis的核心配置文件 configuration就是根标签-->
<configuration>
<typeAliases>
<!--方式一:单个设置-->
<typeAlias type="com.Mr_Xu.bean.User" alias="User"></typeAlias>
<!--方式二:批量设置 【推荐】-->
<!--<package name="com.itheima.bean"/>-->
</typeAliases>
<!--数据库环境配置-->
<environments default="development">
<environment id="development">
<!--MyBatis的事务管理 采用的是JDBC事务控制-->
<transactionManager type="JDBC"/>
<!--MyBatis连接池配置 使用MyBatis默认的POOLED-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/dya34_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="toor"/>
</dataSource>
</environment>
</environments>
<!--mappers就对应dao接口映射文件-->
<!--引入dao接口映射文件-->
<mappers>
<mapper resource="com/Mr_Xu/dao/UserDao.xml" />
</mappers>
</configuration>
User实体类:
package com.Mr_Xu.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @Author: Mr.Xu
* @description: user实体类
* @Date: 2021/11/2 20:08
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
private Integer uid;
private String username;
private String sex;
private Date birthday;
private String address;
}
实体类接口:
package com.Mr_Xu.dao;
import com.Mr_Xu.bean.User;
import java.util.List;
/**
* @Author: Mr.Xu
* @description: 实体类接口
* @Date: 2021/11/2 20:11
*/
public interface UserDao {
//查询所有用户信息,封装到list集合中
List<User> findAll();
int addUser(User user);
int deleteUser(Integer uid);
int Update(User user);
//根据姓氏查询用户列表 方式一:张% #{}
List<User> getUserListByName1(String username);
//根据姓氏查询用户列表 方式二:${value}
List<User> getUserListByName2(String username);
}
实体类映射文件:
<?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">
<!--mapper是dao接口映射文件的根标签
namespace属性表示当前这个映射文件和哪一个dao接口对应
namespace属性值就写对应的dao接口的全限定类名
-->
<mapper namespace="com.Mr_Xu.dao.UserDao">
<!--
select:查询
id:对应dao接口中的方法名
resultType:结果类型,对应dao接口方法的返回值类型
情况1:如果方法的返回值是list泛型集合,就写list的泛型类型 需要注意:写泛型类型的时候也需要使用全限定类名
-->
<select id="findAll" resultType="user">
SELECT * FROM user
</select>
<!--
`#{}`可以有效防止 sql 注入
`#{}`可以接收简单类型值或 pojo 属性值
-->
<select id="getUserListByName1" resultType="user">
SELECT * FROM user WHERE username LIKE CONCAT(#{username},'%')
</select>
<!--
`${}`不能防止 sql 注入
`${}`可以接收单个简单类型值或 pojo 属性值
-->
<select id="getUserListByName2" resultType="com.Mr_Xu.bean.User">
select * from user where username like '${value}%'
</select>
<delete id="addUser" parameterType="user">
insert into user value (null,#{username},#{sex},#{birthday},#{address})
</delete>
<delete id="deleteUser" parameterType="user">
delete from user where uid = #{uid}
</delete>
<update id="Update" parameterType="User">
update user set username=#{username},sex=#{sex},address=#{address} where uid=#{uid}
</update>
</mapper>
使用测试方法实现基本CRUD:
package com.Mr_Xu;
import com.Mr_Xu.bean.User;
import com.Mr_Xu.dao.UserDao;
import com.Mr_Xu.utils.MyBatisUtils;
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 org.junit.Test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* @Author: Mr.Xu
* @description:
* @Date: 2021/11/2 21:48
*/
public class mybatisTest {
//添加
@Test
public void f2() throws Exception {
//获得mybatis核心类对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//加载核心配置文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//获得sqlSession对象
SqlSession SqlSession = sqlSessionFactory.openSession();
UserDao dao = SqlSession.getMapper(UserDao.class);
User user = new User();
user.setUsername("张三");
user.setSex("男");
user.setBirthday(new Date());
user.setAddress("深圳");
dao.addUser(user);
SqlSession.commit();
//释放资源
SqlSession.close();
}
//删除
@Test
public void f3() throws Exception {
//获取mybatis核心对象
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
dao.deleteUser(10 );
sqlSession.commit();
sqlSession.close();
}
//修改
@Test
public void f4() throws Exception {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = new User(8,"李四","女",new Date(),"北京");
dao.Update(user);
sqlSession.commit();
sqlSession.close();
}
//查询
@Test
public void f1() throws Exception {
//得到MyBatis的核心配置文件的文件流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//加载MyBatis的核心配置文件 获得SqlSessionFactory对象
//使用了建造者模式和工厂模式,得到SqlSessionFactory 相当于连接池对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//获得sqlSession对象 相当于Connection对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得dao的代理对象 使用了代理模式
UserDao dao = sqlSession.getMapper(UserDao.class);
//调用方法操作
List<User> list = dao.findAll();
for (User user : list) {
System.out.println("user = " + user);
}
//释放资源
sqlSession.close();
}
//模糊查询,方式1:#{username},'%'
@Test
public void f5() throws Exception {
//得到MyBatis的核心配置文件的文件流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//加载MyBatis的核心配置文件 获得SqlSessionFactory对象
//使用了建造者模式和工厂模式,得到SqlSessionFactory 相当于连接池对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//获得sqlSession对象 相当于Connection对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//获得dao的代理对象 使用了代理模式
UserDao dao = sqlSession.getMapper(UserDao.class);
//调用方法操作
List<User> list = dao.getUserListByName1("张");
for (User user : list) {
System.out.println("user = " + user);
}
//关闭流
sqlSession.close();
is.close();
}
//方式二:${value}%
@Test
public void f6() throws Exception {
//获取核心文件流
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用业务处理
UserDao dao = sqlSession.getMapper(UserDao.class);
//获取list集合
List<User> list = dao.getUserListByName2("z");
for (User user : list) {
System.out.println("user = " + user);
}
//释放资源
sqlSession.close();
}
}
提取工具类:
package com.Mr_Xu.utils;
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 java.io.IOException;
import java.io.InputStream;
/**
* @Author: Mr.Xu
* @description:
* @Date: 2021/11/3 8:58
*/
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
//1.读取MyBatis核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.加载MyBatis配置文件获取 SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
System.err.println("加载MyBatis核心配置文件失败!");
}
}
/**
* 获取SqlSession对象
* @return SqlSession
*/
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
/**
* 释放资源
* @param sqlSession
*/
public static void getClose(SqlSession sqlSession){
if (sqlSession != null){
sqlSession.close();
}
}
}
使用工具类实现:
//使用工具类改造
//增加
@Test
public void f10() throws Exception {
//调用dao处理业务
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = new User(null,"张三","男",new Date(),"深圳");
dao.addUser(user);
//提交事务
sqlSession.commit();
//释放资源
MyBatisUtils.getClose(sqlSession);
}
//删除
@Test
public void f11(){
//获得SqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//调用业务处理
UserDao dao = sqlSession.getMapper(UserDao.class);
dao.deleteUser(8);
sqlSession.commit();
//释放资源
MyBatisUtils.getClose(sqlSession);
}
//修改
@Test
public void f12(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = new User(7, "李四", "女", new Date(), "北京");
dao.Update(user);
sqlSession.commit();
MyBatisUtils.getClose(sqlSession);
}
//查看
@Test
public void f13(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
List<User> list = dao.findAll();
for (User user : list) {
System.out.println("user = " + user);
}
sqlSession.commit();
MyBatisUtils.getClose(sqlSession);
}
//模糊查询,方式一:#{username},'%'
@Test
public void f14(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
List<User> list = dao.getUserListByName1("李");
for (User user : list) {
System.out.println("user = " + user);
}
sqlSession.commit();
MyBatisUtils.getClose(sqlSession);
}
//方式二:${value}%
@Test
public void f15(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
List<User> list = dao.getUserListByName2("l");
for (User user : list) {
System.out.println("user = " + user);
}
sqlSession.commit();
MyBatisUtils.getClose(sqlSession);
}