mybatis 的介绍
- MyBatis 是一种优秀的基于 Java 语言的持久层框架,它避免了很多传统的 JDBC 编程的冗余和复杂性,使得使用者只需关注 SQL 语句本身,而不必关心 SQL 执行的事务管理、结果集映射等操作细节,从而极大地简化了数据访问层的开发。
- MyBatis 提供了很多便捷的功能,其中最重要的是它通过 XML 或注解来配置和映射 Java 对象和数据库表,支持非常灵活的 SQL 编写方式。MyBatis 可以将 SQL 语句、结果映射和 Java 对象连接到一起,从而使得数据访问变得更加快捷和高效。通过 MyBatis,可以实现一些日常开发中常见的操作,例如几种基本的 SQL 操作(增、删、改、查)、分页查询、动态 SQL、多表联合查询等。
- MyBatis 的核心文件包括:
SqlSessionFactory:用于生成 SqlSession 对象的工厂类。SqlSession:用于与数据库进行交互的 Session 对象。Mapper:由 MyBatis 自动生成的用于访问数据库的 DAO。
- mybatis 需要导入的 jar
- mybatis-3.5.6.jar
- mysql-connector-java-5.1.20.jar
- dom4j-1.1.jar
- pagehelper 需要的 jar 包:
- pagehelper-5.1.11.jar
- jsqlparser-2.0.jar
- log4j 的 jar 包
- junit 需要的 jar 包:
模块的知识点
- mybatis 的自动映射和不使用接口映射
- mybatis 的配置文件
- properties 配置数据库连接
- SqlSession 工具类的创建
- dao 及 dao 实现类的创建(使用 sqlSession 执行 sql 语句)
- 基本的 curd
- 使用 mapper 为参数传递多个 sql 参数
- 模糊查询
- 映射文件的配置
- log4j 日志框架的使用
- 文件名为 log4j.properties
- 设置需要输出日志的路径和级别
- 不使用接口映射
- 使用自动映射 (动态代理)
- pageHelper 的使用
- 使用 param 注解传入多个参数
mybaits 的配置文件
<?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"/>
<typeAliases>
<package name="note.entity"/>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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}"/>
<property name="defaultAutoCommit" value="${jdbc.defaultAutoCommit}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="note.dao"/>
</mappers>
</configuration>
数据库的 properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/stage2?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123
jdbc.defaultAutoCommit=false
log4j 的配置 properties
log4j.rootLogger=OFF
log4j.logger.note.dao=DEBUG,CONSOLE,FILE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%p %c{1}:%L - %m%n
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %m [%t] %c [%l]%n
log4j.appender.FILE.File=file.log
生成 sqlssesion 的工具类
package note.util;
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;
public class SqlSessionUtil {
static SqlSessionFactory sqlSessionFactory= null;
public static SqlSession getSqlSession(){
if (sqlSessionFactory == null) {
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("mybatisConfig.xml");
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
return sqlSessionFactory.openSession(false);
}
}
entity 实体类
package note.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
private Boolean gender;
private Date birthday;
public Student(String name,Boolean gender,Date birthday) {
this.name = name;
this.gender = gender;
this.birthday = birthday;
}
}
dao 接口
package note.dao;
import note.entity.Page;
import note.entity.Student;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
public interface StudentDao {
int insert(Student student);
int insertResId(Student student);
int deleteById(int id);
Student selectById(int id);
int update(Student student);
List<Student> selectAll();
List<Student> selectRangeBirthday(@Param("dateLow") Date dateLow,@Param("dateHigh") Date dateHigh);
List<Student> selectLikeName(String name);
List<Student> selectAllByPageHelper();
}
package note.dao;
import note.entity.Student;
import org.apache.ibatis.annotations.Select;
public interface StudentDao2 {
@Select("select * from student where id = #{id}")
Student selectById2(int id);
}
dao 接口实现类
package note.dao.impl;
import note.dao.StudentDao;
import note.entity.Page;
import note.entity.Student;
import note.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.Date;
import java.util.List;
public class StudentDaoImpl implements StudentDao {
private SqlSession sqlSession = SqlSessionUtil.getSqlSession();
@Override
public int insert(Student student) {
return 0;
}
@Override
public int insertResId(Student student) {
return 0;
}
@Override
public int deleteById(int id) {
return 0;
}
@Override
public Student selectById(int id) {
Object o = sqlSession.selectOne("selectById", id);
Student student = (Student) o;
System.out.println("使用的是自定义的实现类实现查询");
sqlSession.close();
return student;
}
@Override
public int update(Student student) {
return 0;
}
@Override
public List<Student> selectAll() {
return null;
}
@Override
public List<Student> selectRangeBirthday(Date dateLow, Date dateHigh) {
return null;
}
@Override
public List<Student> selectLikeName(String name) {
return null;
}
@Override
public List<Student> selectByPage(Page page) {
return null;
}
@Override
public List<Student> selectAllByPageHelper() {
return null;
}
}
接口的 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="note.dao.StudentDao">
<insert id="insert" parameterType="Student" useGeneratedKeys="true" keyProperty="id">
insert into student(name, gender, birthday)
values (#{name}, #{gender}, #{birthday}); </insert>
<insert id="insertResId">
insert into student (name,gender,birthday) values (#{name},#{gender},#{birthday});
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT @@identity
</selectKey>
</insert>
<update id="update" parameterType="Student">
update student
set name=#{name}, gender=#{gender}, birthday=#{birthday} where id = #{id}; </update>
<delete id="deleteById" parameterType="int">
delete from student where id = #{id};
</delete>
<select id="selectById" resultType="note.entity.Student">
select *
from student where id = #{id}; </select>
<select id="selectAll" resultType="note.entity.Student">
select *
from student; </select>
<select id="selectRangeBirthday" resultType="note.entity.Student">
select *
from student where birthday between #{dateLow} and #{dateHigh}; </select>
<select id="selectLikeName" resultType="note.entity.Student">
select *
from student where name like '%' #{name} '%'; </select>
<select id="selectAllByPageHelper" resultType="note.entity.Student">
select *
from student </select>
</mapper>
测试类
package note.dao.impl;
import note.dao.StudentDao;
import note.entity.Student;
import note.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.List;
public class StudentDaoTest {
private SqlSession sqlSession = SqlSessionUtil.getSqlSession();
@Test
public void testSelectOne() {
Object o = sqlSession.selectOne("note.dao.StudentDao.selectById", 1);
Student student = (Student) o;
System.out.println("student = " + student);
sqlSession.close();
}
@Test
public void testSelectOne2() {
StudentDao studentDao = new StudentDaoImpl();
Student student = studentDao.selectById(1);
System.out.println("student = " + student);
sqlSession.close();
}
@Test
public void testSelectRangeBirthdayByMap() {
LocalDate dateLow = LocalDate.of(1999, 1, 1);
LocalDate dateHigh = LocalDate.of(2004, 9, 1);
HashMap<String, Object> map = new HashMap<>();
map.put("dateLow",dateLow.toString());
map.put("dateHigh",dateHigh.toString());
Object o = sqlSession.selectList("note.dao.StudentDao.selectRangeBirthday", map);
List<Student> students = (List<Student>) o;
System.out.println("students = " + students);
sqlSession.close();
}
}
package note.dao.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import note.dao.StudentDao;
import note.entity.Student;
import note.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class StudentDaoTest2 {
private SqlSession sqlSession = SqlSessionUtil.getSqlSession();
private StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
@Test
public void showStudentDao() {
System.out.println("studentDao = " + studentDao);
}
@Test
public void testInsertStudent() {
Date date = null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse("1999-4-26");
} catch (ParseException e) {
e.printStackTrace();
}
Student student = new Student("kace", true, date);
System.out.println("before:" + student);
studentDao.insert(student);
System.out.println("after:" + student);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testInsertStudentResId() {
Date date = null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse("1999-4-26");
} catch (ParseException e) {
e.printStackTrace();
}
Student student = new Student("noby", true, date);
System.out.println("before:" + student);
studentDao.insertResId(student);
System.out.println("after:" + student);
sqlSession.commit();
sqlSession.close();
}
@Test
public void testDeleteStudentById() {
System.out.println("studentDao.deleteById(42) = " +
studentDao.deleteById(42));
sqlSession.close();
}
@Test
public void testSelectStudentById() {
System.out.println("studentDao.selectById(3) = " +
studentDao.selectById(3));
sqlSession.close();
}
@Test
public void testUpdateStudent() {
Date date = null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse("1999-4-26");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(studentDao.update(new Student(6, "kace", true, date)));
sqlSession.commit();
sqlSession.close();
}
@Test
public void testSelectAllStudent() {
System.out.println("studentDao.selectAll() = " +
studentDao.selectAll());
sqlSession.close();
}
@Test
public void testSelectStudentRangeBirthday() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date dateLow = null;
Date dateHigh = null;
try {
dateLow = simpleDateFormat.parse("2022-1-29");
dateHigh = simpleDateFormat.parse("2022-9-1");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("studentDao.selectRangeBirthday(dateLow,dateHigh) = " +
studentDao.selectRangeBirthday(dateLow, dateHigh));
sqlSession.close();
}
@Test
public void testSelectStudentLikeName() {
System.out.println("studentDao.selectLikeName(\"冬梅\") = " +
studentDao.selectLikeName("冬梅")
);
sqlSession.close();
}
@Test
public void testSelectAllByPageHelper() {
PageInfo<Student> pageInfo;
PageHelper.startPage(1, 4);
List<Student> studentList = studentDao.selectAllByPageHelper();
pageInfo = new PageInfo<>(studentList);
System.out.println("pageInfo = " + pageInfo);
sqlSession.close();
}
}
package note.dao.impl;
import note.dao.StudentDao2;
import note.util.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class StudentDaoTest3 {
@Test
public void testSelectStudentById2() {
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
StudentDao2 mapper = sqlSession.getMapper(StudentDao2.class);
System.out.println("mapper.selectById(3) = " +
mapper.selectById2(3));
sqlSession.close();
}
}