学习完实现第一个Mybatis第一个程序之后,要开始写一个最最最基本的增删改查了。这篇文章主要会讲述以下几个方面的内容:
一、第一个Mybatis的重构
二、Mybatis主配置文件的介绍
三、Mybatis实现简单的增删改查
首先开始第一个部分
一、第一个Mybatis的重构
学了好几个持久层的框架,发现他每一个框架都需要进行编写工具类,Mybatis也不例外。
package 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;
/**
* mybatis的工具类
*/
public class MybatisUtil {
//声明一个sqlSession对象
public static volatile SqlSessionFactory sqlSessionFactory;
public static SqlSession getSqlSession() {
try {
if (sqlSessionFactory == null) {
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis.xml");
synchronized (MybatisUtil.class) {
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return sqlSessionFactory.openSession();
}
}
这个工具类的主要目的就是为了获得sqlSession对象,然后更方便实现增删改查的方法,写完上面这个工具类,那么就可以在dao的实现类中获取sqlsession对象,然后调用里面的方法。
@Override
public void insertStudent(Student student) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
sqlSession.insert("insertStudent",student);
sqlSession.commit();
}
这样就能够持续的用sqlSession了,不用每一次都需要加载mybatis.xml配置文件
二、Mybatis主配置文件的介绍
Mybatis的配置文件是非常重要的,下面就是简单的介绍常用的配置:
数据库连接配置:
db.properties文件:
jbdc.drive=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/learnmybatis?serverTimezone=UTC
jdbc.user=root
jdbc.password=自己的数据库连接密码
数据库环境配置:
transactionManager标签
该标签用于指定MyBatis所使用的事务管理器。 MyBatis 支持两种事务管理器类型:
- JDBC:该事务器就是我们之前通过Connection的commit()方法提交,通过rollback()方法回滚,默认是需要手动提交的。
- MANAGED:由容器来管理事务的整个事务的生命周期,默认情况下会关闭连接,将来学习spring框架之后,就不用在配置事务管理器了,spring会使用自带的管理器。
dataSource标签
该项主要用于配置数据源和数据库连接基本属性,有以下三种内建的数据源类型:
- UNPOOLED:该配置表示不使用连接池,每次请求都会创建一个数据库连接,使用完毕后再关闭。当项目对数据库性能要求不大的时候,可以使用该配置。
- POOLED:改配置表示使用mybatis自带的数据库连接池,可以在dataSource下的property属性中设置数据库连接池的基本信息,该部分可以在mybatis的官网中看到。
- JNDI:配置外部数据源
mapper映射配置:
<mappers>
<!--使用相对于类路径的资源引用-->
<mapper resource="XXXXX/StudentMapper.xml"/>
</mappers>
使用别名:
这个意思就是在mapper文件中编写代码时,要引用相应包下面的类,为了减少代码量所写的配置文件:
具体例子:
配置之前:
<mapper namespace="zhiguo98">
<!--parameterType可省略-->
<insert id="insertStudent" parameterType="domain.Student">
INSERT INTO t_student(name,age,score) VALUES (#{name},#{age},#{score})
</insert>
</mapper>
配置之后:
关于Mybatis的配置就说这么多,其实有的地方我也不太懂,不懂的地方用到了再去查吧!
三、Mybatis实现简单的增删改查
首先就是要编写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">
<mapper namespace="zhiguo98">
<!--parameterType可省略-->
<!--增加-->
<insert id="insertStudent" parameterType="student">
INSERT INTO t_student(name,age,score) VALUES (#{name},#{age},#{score})
</insert>
<!--删除-->
<delete id="deleteStudent" parameterType="student">
delete from t_student where id=#{id}
</delete>
<!--修改-->
<update id="updateStudent" parameterType="student">
update t_student set name=#{name},age=#{age},score=#{score} where id=#{id}
</update>
<!--查询一个-->
<select id="findOne" resultType="student">
select * from t_student where id=#{id}
</select>
<!--查询多个-->
<select id="findAll" resultType="student">
select * from t_student
</select>
</mapper>
StudentDao.java文件:
package dao;
import domain.Student;
import java.util.List;
public interface StudentDao {
public abstract void insertStudent(Student student);
public abstract void deleteStudent(int id);
public abstract void updateStudent(Student student);
public abstract Student findOne(int id);
public abstract List<Student> findAll();
}
StudentDaoImpl2.java文件:
package dao.impl;
import dao.StudentDao;
import domain.Student;
import org.apache.ibatis.session.SqlSession;
import utils.MybatisUtil;
import java.util.List;
public class StudentDaoImpl2 implements StudentDao {
/**
* 插入一个数据
* @param student
*/
@Override
public void insertStudent(Student student) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
sqlSession.insert("insertStudent",student);
sqlSession.commit();
}
/**
* 根据id删除一个数据
* @param id
*/
@Override
public void deleteStudent(int id) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
sqlSession.delete("deleteStudent",id);
sqlSession.commit();
}
/**
* 更新一条信息
* @param student
*/
@Override
public void updateStudent(Student student) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
sqlSession.update("updateStudent",student);
sqlSession.commit();
}
/**
* 根据id查询一条信息
* @param id
* @return
*/
@Override
public Student findOne(int id) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
Student stu = sqlSession.selectOne("findOne", id);
System.out.println(stu);
sqlSession.commit();
return stu;
}
/**
* 查询所有的信息
* @return
*/
@Override
public List<Student> findAll() {
SqlSession sqlSession = MybatisUtil.getSqlSession();
List<Student> findAll = sqlSession.selectList("findAll");
for (Student student : findAll) {
System.out.println(student);
}
return findAll;
}
}
测试文件:
package test;
import dao.StudentDao;
import dao.impl.StudentDaoImpl;
import dao.impl.StudentDaoImpl2;
import domain.Student;
import org.junit.jupiter.api.Test;
import java.util.List;
public class StudentTest01 {
/**
* 测试插入一条数据
*/
@Test
public void insertStudent(){
StudentDao studentDao = new StudentDaoImpl2();
Student student = new Student();
student.setName("zhiguo98");
student.setAge(12);
student.setScore(99.0);
studentDao.insertStudent(student);
}
/**
* 测试删除一条数据
*/
@Test
public void deleteStudent(){
StudentDao studentDao = new StudentDaoImpl2();
studentDao.deleteStudent(2);
}
/**
* 测试更新信息方法
*
*/
@Test
public void updateStudent(){
StudentDao studentDao = new StudentDaoImpl2();
Student student = new Student(1,"zhiguo98",23,23);
studentDao.updateStudent(student);
}
/**
* 测试查找一条信息的方法
*/
@Test
public void findOne(){
StudentDao studentDao = new StudentDaoImpl2();
Student one = studentDao.findOne(3);
System.out.println(one);
}
/**
* 测试查询所有的方法
*/
@Test
public void findAll(){
StudentDao studentDao = new StudentDaoImpl2();
List<Student> all = studentDao.findAll();
for (Student student : all) {
System.out.println(student);
}
}
}
这篇博客就学到这,下午的时间开始练算法题。。。。。。