mybatis原为Apache下的ibatis,2010年被谷歌收取,重新命名为mybati,那年也是mybatis3.0版本的发布
mybatis能干嘛:mybatis能够于数据库进行操作,简化对jdbc的操作,实现数据库的持久化,是一款非常优秀的orm框架
mybatis官网:https://mybatis.org/mybatis-3/
mybatis进行增删改查操作
项目架构
导包
<dependencies>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!-- mybatis包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!-- 日志包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
写配置
mybatis-config.xml (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">
<configuration>
<!-- 配置连接数据库的参数 -->
<properties resource="db.properties"></properties>
<environments default="dev">
<!-- environment开发坏境-->
<environment id="dev">
<!-- 配置事务的提交方式
JDBC:利用JDBC方式处理事务(commit rollback close)
MANAGED:将事务交由其他组件去托管
-->
<transactionManager type="JDBC" />
<!-- 数据源类型
POOLED:使用数据库连接池(推荐使用)
UNPOOLED:不使用数据库连接池 ,传统的JDBC模式(不推荐使用,每次访问数据库都需要进行打开,关闭数据库,很耗资源)
JNDI:从tomcat中获取一个内置的数据库连接池
-->
<dataSource type="POOLED">
<!-- 配置数据库信息 -->
<property name="driver" value="${jdbc_driver}" />
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
</dataSource>
</environment>
</environments>
<!-- 注册mapper -->
<mappers>
<mapper resource="mapper/StudentMapper.xml"></mapper>
</mappers>
</configuration>
StudentMapper.xml (数据与表的映射配置,在mybatis中也可以称为dao的实现类)
<?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">
<!-- namespace该mapper.xml唯一标识符 -->
<mapper namespace="com.stone.mybatis.mapper.StudentDao">
<!-- 根据id查询一个学生
select:查询语句
resultType:该方法的返回值
parameterType:输入参数类型
-->
<select id="selectOne" resultType="com.stone.mybatis.model.Student" parameterType="Integer">
select * from student where id=#{id}
</select>
<!-- 查询所有学生 -->
<select id="selectAll" resultType="com.stone.mybatis.model.Student">
select * from student
</select>
<!-- 添加学生 -->
<insert id="addStudent" parameterType="com.stone.mybatis.model.Student">
insert into student(name,age,sex) values (#{name},#{age},#{sex});
</insert>
<!-- 修改学生 -->
<update id="updStudent" parameterType="com.stone.mybatis.model.Student">
update student set name=#{name} where id=#{id}
</update>
<!-- 删除学生 -->
<delete id="delStudent" parameterType="Integer">
delete from student where id=#{id}
</delete>
</mapper>
Sstudent (实体类)
package com.stone.mybatis.model;
public class Student
{
private Integer id; // 学生学号
private String name; // 学生姓名
private Integer age; // 学生年龄
private String sex; // 学生性别
public Student()
{
}
public Student(Integer id, String name, Integer age, String sex)
{
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Integer getAge()
{
return age;
}
public void setAge(Integer age)
{
this.age = age;
}
public String getSex()
{
return sex;
}
public void setSex(String sex)
{
this.sex = sex;
}
@Override
public String toString()
{
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
StudentDao (dao层接口)
package com.stone.mybatis.mapper;
import com.stone.mybatis.model.Student;
import java.util.List;
public interface StudentDao
{
// 根据学号查询单个学生
Student selectOne(Integer id);
// 查询所有学生
List<Student> selectAll();
// 添加学生
void addStudent(Student student);
// 修改学生
void updStudent(Student student);
// 删除学生
void delStudent(Integer id);
}
增删改查测试
public class StudentTest
{
StudentDao mapper = null;
Reader reader = null;
SqlSessionFactory sessionFactory =null;
// 在每一次单元测试之前执行 (得到操作数据库对象)
@Before
public void bef() throws IOException
{
// 1. 加载mybatis配置文件
String resource = "mybatis-config.xml";
reader = Resources.getResourceAsReader(resource);
// 2.获取sqlsessionfactory
sessionFactory = new SqlSessionFactoryBuilder().build(reader);
}
// 在每一次测试方法执行之后 (关闭操作数据库需要释放的资源)
@After
public void aft()
{
if (reader != null)
{
try
{
reader.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
// 测试:根据id查询单个学生
@Test
public void test1()
{
// 3.获取session
SqlSession sqlSession = sessionFactory.openSession();
// 4.得到dao的接口
mapper = sqlSession.getMapper(StudentDao.class);
Student student = mapper.selectOne(1);
System.out.println(student);
}
// 测试:查询所有学生
@Test
public void test2()
{
// 3.获取session
SqlSession sqlSession = sessionFactory.openSession();
// 4.得到dao的接口
mapper = sqlSession.getMapper(StudentDao.class);
List<Student> student = mapper.selectAll();
System.out.println(student);
}
// 测试:添加学生
@Test
public void test3()
{
// 3.获取session
SqlSession sqlSession = sessionFactory.openSession();
// 4.得到dao的接口
mapper = sqlSession.getMapper(StudentDao.class);
// 设置需要添加的数据
Student student =new Student();
student.setName("xiaoqi");
student.setAge(27);
student.setSex("女");
// 添加学生
mapper.addStudent(student);
System.out.println(student);
// 提交事务 ,要不然无法添加
sqlSession.commit();
// 添加完之后查询所有学生
test2();
}
// 测试:根据id修改学生
@Test
public void test4()
{
// 3.获取session
SqlSession sqlSession = sessionFactory.openSession();
// 4.得到dao的接口
mapper = sqlSession.getMapper(StudentDao.class);
// 吧学号为一的zs同学修改为zxs同学
Student student =new Student();
student.setName("zxs");
student.setId(1);
mapper.updStudent(student);
// 事务提交
sqlSession.commit();
// 修改完之后查询所有学生
test2();
}
// 根据学号删除学生
@Test
public void test5(){
// 3.获取session
SqlSession sqlSession = sessionFactory.openSession();
// 4.得到dao的接口
mapper = sqlSession.getMapper(StudentDao.class);
// 删除学号为2的ls同学
mapper.delStudent(2);
// 事务提交
sqlSession.commit();
// 删除完之后查询所有学生
test2();
}
}