MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录—-摘自官网说明
MyBatis也是ORM框架的实现,跟Hibernate一样,都是持久层的框架,只是MyBatis涉及到的SQL都需要自己写。
1、创建数据库和表
create database db_m1;
use db_m1;
create table tb_stu(id int auto_increment primary key,name varchar(10),age int);
2、创建数据库表对应的类
//代表的是tb_stu表
public class Student {
private int id;
private String name;
private int age;
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3、创建Dao层接口和对应的Mapper文件
接口:
public interface StudentDao {
//保存学生对象
void save(Student stu);
//修改
int update(Student stu);
//删除
int delete(Student stu);
//查询
List<Student> query();
}
对应的Mapper文件
<?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">
<!--设置映射配置:接口的配置
内部就是写出接口中抽象方法所需的SQL语句
namespace:对应接口的全称 -->
<mapper namespace="cn.code404.dao.StudentDao">
<!--什么样的SQL就用什么样的标签 -->
<!--insert:实现插入语句的编写
常用属性:
id:就是对应的方法名称
parameterType:形式参数的类型
-->
<!--1、新增数据 -->
<insert id="save" parameterType="Student" keyProperty="id">
<!--获取自增主键的值方式二 -->
<!-- <selectKey keyProperty="id">
select LAST_INSERT_ID()
</selectKey> -->
insert into tb_stu(name,age) values(#{name},#{age})
</insert>
<!--2、修改数据 -->
<update id="update" parameterType="Student">
update tb_stu set name=#{name},age=#{age} where id=#{id}
</update>
<!--3、删除数据 -->
<delete id="delete" parameterType="Student">
delete from tb_stu where id=#{id}
</delete>
<!--4、查询数据 -->
<select id="query" resultType="Student">
select * from tb_stu
</select>
</mapper>
4、MyBatis的配置文件
该配置文件存储在src下,也就是类路径下
<?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="dbconfig.properties"/>
<!--全局设置 -->
<settings>
<setting name="useGeneratedKeys" value="true"/>
</settings>
<!--别名,主要是为mapper文件中的参数的类型写上简称 -->
<typeAliases>
<!--为单个的类写别名 -->
<!-- <typeAlias alias="Student" type="org.qf.domain.Student"/> -->
<!--为整个包设置,这样的话mapper文件使用改包的类就可以直接使用无需包名 -->
<package name="cn.code404.domain"/>
</typeAliases>
<!--数据库的环境设置
default使用哪个配置-->
<environments default="test">
<!--配置信息,id唯一标记 -->
<environment id="test">
<!--配置事物管理
type:类型
取值说明:
1、JDBC:直接使用JDBC的事物模块,设置connection开启事物,根据情况进行回滚或提交
2、MANAGED:这个值标记本身什么都不做,不会提交或回滚事物,但是可以使用容器来管理事物
默认会关闭连接,closeConnection设置为false -->
<transactionManager type="MANAGED"></transactionManager>
<!--配置数据库的连接数据源
type:类型
取值说明:
1、UNPOOLED:不使用数据库连接池
2、POOLED:使用数据库连接池 -->
<dataSource type="UNPOOLED">
<property name="driver" value="${driverclass}"/>
<property name="url" value="${dburl}"/>
<property name="username" value="${dbuser}"/>
<property name="password" value="${dbpass}"/>
</dataSource>
</environment>
</environments>
<!--映射文件,就是需要MyBatis管理的接口实现类对应的映射文件 -->
<mappers>
<!--基于xml的实现 -->
<mapper resource="cn/code404/dao/StudentDaoMapper.xml"/>
<!-- 基于注解的实现 -->
<!-- <mapper class=""/> -->
<!--标记指定的包 -->
<!-- <package name="cn.code404.dao"/> -->
</mappers>
</configuration>
数据库的配置文件dbconfig.properties
driverclass=com.mysql.jdbc.Driver
dburl=jdbc:mysql://localhost:3306/db_m1?characterEncoding=utf-8
dbuser=lx
dbpass=lx
5、测试
测试类:
//演示MyBatis的使用
public class MyTest1 {
// 基本使用,新增数据
@Test
public void test1() throws IOException {
// 使用步骤
// 1、使用流加载配置文件
InputStream iStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2、创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(iStream);
// 3、创建会话对象
SqlSession session = factory.openSession();
// 4、获取接口的实现类对象
StudentDao dao = session.getMapper(StudentDao.class);
// 5、调用接口中方法实现数据的操作
Student student = new Student();
student.setAge(20);
student.setName("李四");
dao.save(student);
// 6、提交
session.commit();
System.out.println(student.getId());
// 7、关闭
session.close();
iStream.close();
}
// 修改和删除
@Test
public void test2() throws IOException {
// 加载配置
InputStream iStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(iStream);
// 创建Session
SqlSession session = factory.openSession();
// 获取接口实现类
StudentDao dao = session.getMapper(StudentDao.class);
// 修改
Student stu1 = new Student();
stu1.setAge(16);
stu1.setName("西施");
stu1.setId(5);
System.out.println("修改:" + dao.update(stu1));
// 删除
Student stu2 = new Student();
stu2.setId(2);
System.out.println("删除:" + dao.delete(stu2));
// 提交
session.commit();
// 关闭
session.close();
// 释放
iStream.close();
}
// 查询
@Test
public void test3() throws IOException {
// 加载配置
InputStream iStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 创建工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(iStream);
// 创建Session
SqlSession session = factory.openSession();
// 获取接口实现类
StudentDao dao = session.getMapper(StudentDao.class);
System.out.println(dao.getClass().getName());
List<Student> list=dao.query();
for(Student s:list){
System.out.println(s.getId());
}
}
}