首先,在了解mybatis的内容之前,我们先学习了解一下mybatis的主配置文件,主配置文件(Mybatis-config.xml)是我们构建SqlSessionFactory的依据。作为Mybatis的核心内容,其内部标签的顺序,一系列配置都会影响Mybatis的运行。
1.主配置文件(Mybatis-config.xml)的部分内容:
<?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="jdbc.properties"></properties>
<!--给类型起别名 -->
<typeAliases>
<!-- <typeAlias type="com.ape.bean.Student" alias="student" /> -->
<package name="com.ape.bean"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除 配置数据库环境信息,注册数据源,配置数据库事务-->
<environments default="development">
<!-- 单个数据库环境信息,可以有多个enviroment -->
<environment id="development">
<!-- 使用jdbc事务管理 -->
<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}" />
</dataSource>
</environment>
</environments>
<mappers>
<!--文件路径 / 划分,有后缀:com/ape/mapper/StudentMapper.xml -->
<!-- <mapper resource="com/ape/mapper/StudentMapper.xml" />
<!-- 以包的形式引入-->
<package name="com.ape.mapper"/>
</mappers>
</configuration>
2.主配置文件中的标签,以及其顺序,(注意:官方文档中说明了顺序。注意不要搞乱顺序)
3.主配置文件的解读:
我们观察主配置文件的内容就了解其层次结构,是以configuration包裹一系列内部标签,那么其内部标签的作用都是啥,我们解读分析需要用到的,最重要的几个,例如configuration,properties,typeAliases,environments,environment,transactionManager,dataSource,property,mapper等。
1.configuration:功能:标识配置文件的起始,所有的配置文件都存在在这。
2.properties;功能:引入外部的properties文件,resource属性写文件名加后缀,其文件内部的属性,就可以在配置文件上下文使用。
3.typeAliases:功能:给我们自定义的“类型起别名”。并且大小写不敏感(当我们需要将数据库查询到的结果集映射为Java对象时,就需要映射类型,并且需要让mybatis知道)
注意:配置时,以单个实体类配置可以,也可以以包引入配置。
mybatis内部支持的别名有:
4.environments:配置数据库环境信息,注册数据源,配置数据库事务。属性default表示默认的数据库环境(和spring整合后,将会被废除)
5.environment:单个数据库环境信息的标识,(可有多个)
6.transactionManager:配置数据库事务。使用 MANAGED 的事务管理机 制,这种机制 MyBatis 自身不会去实现事务管理,而是让程序 的容器(JBOSS,WebLogic)来 实现对事务的管理;
7.dataSource:配置数据环境中数据连接信息
8.property:配置环境信息的属性,包含driver驱动,url,数据库用户名,数据库密码
9.mapper:用来在myabtis初始化时引入mapper映射文件,可以以xml文件的相对路径引入,也可以以包引入。
4.实现简单增删改查
首先,我们需要创建与数据库相对应的实体类,在IMapper接口中定义对应的方法,sqlMapper.xml中书写映射所需的sql语句。通过加载主配置文件获取到的SqlSession,去执行对应sql语句,通过返回值,判断事务提交还是回滚,
创建与数据库对应的实体类
Student.java(注意:提供必要的getter和setter方法,以及有参无参构造方法,tostring方便我们观察结果)
package com.ape.bean;
import java.util.Date;
public class Student {
private int sid;
private String sname;
private Date birthday;
private String ssex;
private int classid;
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public Student(int sid, String sname, Date birthday, String ssex, int classid) {
super();
this.sid = sid;
this.sname = sname;
this.birthday = birthday;
this.ssex = ssex;
this.classid = classid;
}
public Student() {
super();
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", birthday=" + birthday + ", ssex=" + ssex + ", classid="
+ classid + "]";
}
}
数据库表:
创建dao中mapper接口:
public interface IStudentDao {
//1.添加学生
public int insertStudent(Student stu);
//2.修改学生
public int updateStudent(Student stu);
//3.删除学生
public int deleteStudent(int id);
//查询单个学生
public Student findStudentById(int id);
//查询所有学生
public List<Student> findAllStudent();
}
创建对应SqlMapper.xml,书写sql语句
<?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="test">
<!--
sqlMapper 文件 执行方法,和sql语句映射
-->
<!--类路径 .分割, 无后缀 : com.ape.bean.Student-->
<select id="findAllStudent" resultType="com.ape.bean.Student">
select * from student
</select>
<select id="findStudentById" parameterType="int" resultType="com.ape.bean.Student">
select * from student where sid=#{sid}
</select>
<insert id="insertOneStudent" parameterType="com.ape.bean.Student">
insert into student values(null,#{sname},#{birthday},#{ssex},#{classid})
</insert>
<delete id="deleteStudentById" parameterType="int">
delete from student where sid = #{sid}
</delete>
<update id="updateStudentById" parameterType="com.ape.bean.Student">
update student set sname=#{sname},birthday=#{birthday},ssex=#{ssex},classid=#{classid} where sid=#{sid}
</update>
</mapper>
创建对应接口的实现类,通过sqlSession实现接口,作业务逻辑判断
package com.ape.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.ape.bean.Student;
import com.ape.dao.IStudentDao;
import com.ape.util.DaoUtil;
public class StudentDaoImpl implements IStudentDao {
@Override
public int insertStudent(Student stu) {
SqlSession sqlSession = DaoUtil.getSqlSession();
int i = sqlSession.insert("insertOneStudent",stu);
//事务操作
if(i>0) {
sqlSession.commit();
}else {
sqlSession.rollback();
}
return i;
}
@Override
public int updateStudent(Student stu) {
SqlSession sqlSession = DaoUtil.getSqlSession();
int i = sqlSession.update("updateStudentById",stu);
//事务操作
if(i>0) {
sqlSession.commit();
}else {
sqlSession.rollback();
}
return i;
}
@Override
public int deleteStudent(int sid) {
SqlSession sqlSession = DaoUtil.getSqlSession();
int i = sqlSession.delete("deleteStudentById", sid);
//事务操作
if(i>0) {
sqlSession.commit();
}else {
sqlSession.rollback();
}
return i;
}
@Override
public Student findStudentById(int id) {
SqlSession sqlSession = DaoUtil.getSqlSession();
Student stu = sqlSession.selectOne("findStudentById",id);
DaoUtil.closeResouces(sqlSession);
return stu;
}
@Override
public List<Student> findAllStudent() {
SqlSession sqlSession = DaoUtil.getSqlSession();
List<Student> stulist = sqlSession.selectList("findAllStudent");
DaoUtil.closeResouces(sqlSession);
return stulist;
}
}
测试结果:
public class StudentTest {
public static void main(String[] args) {
updatestu();
}
public static void insertstu() {
IStudentDao is = new StudentDaoImpl();
int i = is.insertStudent(new Student(11,"吉吉",new Date(),"猴子",1));
System.out.println(i);
}
public static void updatestu(){
IStudentDao is = new StudentDaoImpl();
int i=is.updateStudent(new Student(11,"吉吉",new Date(),"猴子",1));
System.out.println(i);
}
public static void deletestu() {
IStudentDao is = new StudentDaoImpl();
int i = is.deleteStudent(24);
System.out.println(i);
}
public static void findstuOne() {
IStudentDao is = new StudentDaoImpl();
Student stu = is.findStudentById(11);
System.out.println(stu);
}
public static void findAllstu() {
IStudentDao is = new StudentDaoImpl();
List<Student> list = is.findAllStudent();
list.forEach(System.out::println);
}
不同的方法,返回不同语句的执行结果,这次我们只是简单实现增删改查,后面我们会通过动态代理和映射器实现。