一.Mybatis简介
 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
 Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatement、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。
  
 1.在数据库中创建student的表
  
2.注入mysql驱动依赖
    <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.45</version>
     </dependency>
  
     <dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus</artifactId>
       <version>3.3.2</version>
     </dependency>
       <dependency>
           <groupId>org.junit.jupiter</groupId>
           <artifactId>junit-jupiter</artifactId>
           <version>RELEASE</version>
           <scope>compile</scope>
       </dependency>
 3.创建实体类,student--保存表中的一行数据的
public class Student {
     private Integer id;
     private String name;
     private String email;
     private Integer age;
  
     @Override
     public String toString() {
         return "Student{" +
                 "id=" + id +
                 ", name='" + name + '\'' +
                 ", email='" + email + '\'' +
                 ", age=" + age +
                 '}';
     }
  
     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 String getEmail() {
         return email;
     }
  
     public void setEmail(String email) {
         this.email = email;
     }
  
     public Integer getAge() {
         return age;
     }
  
     public void setAge(Integer age) {
         this.age = age;
     }
 }
 4.创建持久层的dao接口,定义操作数据库的方法
public interface StudentDao {
  
     //查询所有
     public List<Student> query();
  
     //添加
     public void add(Student student);
  
     //修改
     public void update(Student student);
  
     //查询一条
     public Student queryById(Integer id);
  
     //删除
     public void delete(Integer id);
 }
 5.创建一个mybatis使用的配置文件
叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件。
这个文件是xml文件。
要求:在接口所在的目录中,文件名称和接口保持―致。
6.封装session工具类
public class BaseDao {
     static  SqlSessionFactory sqlMapper ;
     static {
         String resources = "mybatis-config.xml";
         Reader reader=null;
         try {
             reader= Resources.getResourceAsReader(resources);
         } catch (IOException e) {
             e.printStackTrace();
         }
          sqlMapper= new SqlSessionFactoryBuilder().build(reader);
     }
  
     public SqlSession getSession(){
         SqlSession session=sqlMapper.openSession();
         return session;
     }
  
     public void closeSession(SqlSession session){
         session.close();
     }
 }
 7.编写业务层接口和实现类,调用dao层
public interface StudentService {
  
     public List<Student> query();
  
     public void add(Student student);
  
     public void update(Student student);
  
     public void delete(Integer id);
  
     public Student queryById(Integer id);
 }
  
 //接口的实现类
 public class StudentServiceImpl extends BaseDao implements StudentService {
     SqlSession session ;
     StudentDao dao ;
  
  
     @Override
     public List<Student> query() {
         //获取一个连接
         session = getSession();
         //方法内部产生了BlogMapper的实现类。
         dao = session.getMapper(StudentDao.class);
         //调用dao层方法,获取list集合
         List<Student> list = dao.query();
         //关闭连接
         closeSession(session);
         //返回结果集
         return list;
     }
  
     @Override
     public void add(Student student) {
         session = getSession();
         dao = session.getMapper(StudentDao.class);
         //执行方法
         dao.add(student);
         //自动提交事务,
         session.commit();
         //关闭连接
         closeSession(session);
     }
  
     @Override
     public void update(Student student) {
         session = getSession();
         dao = session.getMapper(StudentDao.class);
         dao.update(student);
         session.commit();
         closeSession(session);
     }
  
     @Override
     public void delete(Integer id) {
         session = getSession();
         dao = session.getMapper(StudentDao.class);
         dao.delete(id);
         session.commit();
         closeSession(session);
     }
  
     @Override
     public Student queryById(Integer id) {
         session = getSession();
         dao = session.getMapper(StudentDao.class);
         Student ById = dao.queryById(id);
         session.commit();
         closeSession(session);
         return ById;
     }
 }
 8.
创建mybatis的主配置文件:
一个项目就一个主配置文件。
主配置文件提供了数据库的连接信息和sql映射文件的位置信息
<?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>
     <!--settings控制mybatis全局行为的-->
     <settings>
         <!--设置mybatis输出日志-->
         <setting name="logImpl" value="STDOUT_LOGGING"/>
     </settings>
     <!--环境配置  就是数据库的连接信息
         default必须和某个environment的id值一样
         告诉mybatis使用那个数据库的连接信息,也就是访问哪个数据库-->
     <environments default="mysql">
         <!--environment:一个数据库信息的配置,叫做:环境
             id是唯一值,自定义的,表示环境名称的-->
         <environment id="mysql">
             <!--transactionManager:mybatis的事物类型
                 type:JDBC(表示使用jdbc中connection对象的commit,rollback做事物处理的)-->
             <transactionManager type="JDBC"/>
             <!--dataSource:代表数据源,连接数据库的
                 type:表示数据源的类型 POOLED表示使用连接池的-->
             <dataSource type="POOLED">
                 <property name="driver" value="${db.driver}"/>
                 <property name="url" value="${db.url}"/>
                 <property name="username" value="${db.username}"/>
                 <property name="password" value="${db.password}"/>
             </dataSource>
         </environment>
  
         <environment id="online">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="com.mysql.jdbc.Driver"/>
                 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF8"/>
                 <property name="username" value="root"/>
                 <property name="password" value="123456"/>
             </dataSource>
         </environment>
     </environments>
  
  
  
     <!--sql mappers(SQL映射文件)的位置-->
     <mappers>
         <!--一个mappers标签指定一个文件的位置,
             从类路径开始的路径信息
             target/clasess(类路径)-->
         <mapper resource="mapper/studentMapper.xml"/>
         <!--<mapper resource="com/dyxpowernode/dao/SchoolDao.xml"/>-->
     </mappers>
 </configuration>
         <!--
             mybatis的主配置文件:主要定义了数据库的配置信息,sql映射文件的位置
             1.约束文件的说明
             <!DOCTYPE configuration
                 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
                 "http://mybatis.org/dtd/mybatis-3-config.dtd">
             mybatis-3-config.dtd:是约束文件的名称,固定值
             2.configuration跟标签。
         -->
 9.测试类
public class MybayisStudentTest {
     public static void main(String[] args) {
         StudentService ss = new StudentServiceImpl();
         Student student = new Student();
         student.setName("呵呵");
         student.setEmail("12138");
         student.setAge(15);
         ss.add(student);
  
         List<Student> list = ss.query();
         System.out.println(list);
  
     }
  
     @Test
     public void updata(){
         StudentService ss = new StudentServiceImpl();
         Student student = new Student();
         student.setId(1);
         student.setName("芜湖");
         student.setEmail("548");
         student.setAge(56);
         ss.update(student);
         List<Student> list = ss.query();
         System.out.println(list);
     }
     
     @Test
     public void delete(){
         StudentService ss = new StudentServiceImpl();
  
         ss.delete(3);
  
         List<Student> list = ss.query();
     }
  
     @Test
     public void queryById(){
         StudentService ss = new StudentServiceImpl();
         Student student = ss.queryById(2);
         System.out.println(student);
  
     }
 }










