Mybatis入门

209 阅读5分钟

ORM介绍

ORM-->Object Relational Mapping:对象关系映射

指的是持久化数据和对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。

图片.png

MyBatis介绍

图片.png

原始JDBC的操作问题解决方案

图片.png

MyBatis介绍:

图片.png

MyBatis入门程序

1.数据准备(数据库与数据表)

图片.png

图片.png

2.导入jar包

图片.png

3.映射配置文件 StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

//名称空间
<mapper namespace = "StudentMapper">
    //查询,id唯一标识,resultType将来把查询出来的数据封装到哪里
    <select id = "selectAll" resultType="com.itheima.bean.Student">
    //SQL语句
        SELECT * FROM student
    </select>
</mapper>

4.核心配置文件(拿到数据库的连接) MyBatisConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
      
//核心根标签      
<configuration>
//字标签,会自动添加相关信息,default将来采用何种配置,要和下面的id保持对应
    <environments default="mysql">
        <environment id = "mysql">
        //事务的支持,采用JDBC支持的事务
            <transactionManager type="JDBC">
            </transactionManager>
        //数据库连接池
            <dataSource type = "POOLED">
            //第一个是注册驱动
                <property name = "driver" value="com.mysql.jdbc.Driver"/>
            //第二个是URL   
                <property name = "url" value="jdbc:mysql://localhost:3306/连接的数据库"/>
            //第三个是用户名    
                <property name = "username" value="root"/>
            //第四个是密码    
                <property name = "password" value="zjl19790118"/>   
            </dataSource>
        </environment>
    </environments>
    
//将映射配置文件加载进来,引入映射配置文件
    <mappers>
        <mapper resource="StudentMapper.xml"/>
    </mappers>
</configuration>

5.编写测试类完成API的使用

StudentTest01

实现查询全部的功能
public void selectAll() throws Exception{
    1.加载核心配置文件,并返回一个inputStream字节输入对象并抛异常
    InputStream is = Resources getResourceAsStream("MyBatisConfig.xml");
    
    2.获取SqlSession工厂对象,将得到的输入流对象传进去
    SqlSessionFactory sqlSessionFactorynew = SqlSessionFactoryBuilder().build(is);
    
    3.通过SqlSession工厂对象的openSession方法获取SqlSession对象,我们最终就靠sqlSession来操作
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    4.执行映射配置文件中的sql语句,并接受结果.selectList就是查询所有的方法
    参数是:映射配置文件中的名称空间.id的名称
    这样就能找到映射配置文件中的语句了,并且返回集合
    List<Student> list =  sqlSession.selectList("StudentMapper.selectAll");
    
    5.处理结果,对集合进行遍历
    for(Student stu : list){
        System.out.println(stu)
    }
    
    6.释放资源
    sqlSession.close();
    is.close();关闭输入流对象
}

6.使用

MyBatis相关API

Resources:MyBatis提供的,不用也是可以的

图片.png

图片.png

SqlSessionFactoryBuilder

图片.png

图片.png

SqlSessionFactory

图片.png

图片.png

SqlSession

图片.png

图片.png

API小结

图片.png

映射配置文件

StudentMapper.xml

图片.png

查询功能:
<mapper namespce="StudentMapper">
    <select id = "selectById"
     resultType="com..Student"
     parameterType="java.lang.Integer">//有参数就得这样写
        SELECT * FROM student WHERE id = #{id}
    </select>
</mapper>

此时测试类:StudentTest

图片.png

新增功能

图片.png

图片.png

或者也可以不提交事务,而是将openSession设置为true(自动提交事务);查询不会影响真实数据,所以不用管理事务

图片.png

图片.png

修改功能

图片.png

图片.png

图片.png

删除功能

图片.png

图片.png

图片.png

核心配置文件

图片.png

有两个environment id数据库,具体指定使用哪个,根据environments default来指定数据库

图片.png

图片.png

图片.png

数据库连接配置文件引入

图片.png

将value抽取到properties中,并引入

图片.png

图片.png

如何引入?

图片.png

图片.png

起别名

每次引入的时候,我都需要把包名给写全,有什么办法可以解决?

图片.png

图片.png

只给具体的类取别名 图片.png

对包下所有的类都取别名 图片.png

数据类型也有内置的别名 图片.png

图片.png

核心配置文件小结

图片.png

传统方式实现DAO层

图片.png

持久层:直接对DB操作的语句,查询、修改什么的 图片.png

持久层实现类 图片.png

业务层:

图片.png

业务层的实现类:调用持久层的方法

图片.png

控制层:当做测试类,调用业务层

图片.png

为了提高代码的复用率,我们将实现类中的实现代码进行抽取,单独存放在utils工具类中。

工具类:不想被外界直接来创建对象,因为里面的功能提供的都是静态的,所以我们第一件事就是私有构造方法。

utils/MyBatisUtils.java工具类

//1.私有构造方法
private MyBatisUtils(){}

//2.声明工厂对象
private static SqlSessionFactory sqlSessionFactory;

//3.提供静态代码块,读取核心配置文件,并给工厂对象赋值
static{
    try{
       InputStream is =  Resources.getResourceAsStream("MyBatisConfig.xml");
       sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
   } catch(IOException e){
       e.printStackTrace();
   }
}

//4.提供静态方法,获取SqlSession对象
public static SqlSession getSqlSession(){
    return sqlSessionFactory.openSession(true);
    自动开启事务
}

编写完成后,去实现类StudentMapperImpl.java

实现selectAll方法

以前的配置就不用再写一遍了,美滋滋

图片.png

根据单个id,查询

图片.png

插入语句

图片.png

更新语句

图片.png

删除功能

图片.png

控制层测试

控制层-->业务层-->持久层-->DB数据库

控制层(StudentController)业务:调用了业务层(StudentServiceImpl)里的selectAll方法

图片.png

业务层业务:调用了持久层(StudentMapperImpl)里的方法

图片.png

持久层业务:StudentMapperImpl就是我们刚刚实现的方法,直接对标操作数据库

图片.png

最后梳理完,再回到控制层进行测试,结果可以查询出来

demo08.gif

其他测试方法:

图片.png

图片.png

LOG4J

图片.png

使用步骤:

1.导入jar包,然后右键jar包 add as library

2.修改核心配置文件(MyBatisConfig.xml)
    <settings>
    //固定格式
        <setting name="logImpl" value="log4j"/>
    </settings>    
    
3.在src下编写LOG4J配置文件

图片.png

图片.png

使用LOG4J后执行的效果:

demo08.gif

参数传递使用的问题

#{}和${} 两种方式的区别

图片.png

图片.png

图片.png

图片.png

传递表名:如果用#{}是会报错的,只能使用${}参数传递

图片.png

如下:

图片.png

图片.png

模糊查询

Sql语句的模糊查询:

//查询张姓的学生
select * from student where name like '%张'

MyBatis中的模糊查询

控制层:调用了Service层的

图片.png

业务层:调用了持久层的

图片.png

持久层:实现对DB的操作(参数是传递进来的条件)

图片.png

映射文件的配置(二选一)

图片.png

如果使用#{},需要进行拼接,因为?占位符会把他当成一个字符串

图片.png

返回主键自增

当我们添加一条数据后,想获取到主键自增后的数据,用于后续的使用。

需要将以前的映射配置文件修改,获取主键自增

<insert id="insert" parameterType = "student">
    //新增的selectKey标签
    resultType 返回自增后的id的数据类型为int
    keyColumn 想要操作数据表中的哪一列,为id列
    keyProperty 我查询出来的自增数据,要封装到哪个类中的成员变量
    order after 在执行sql语句之前查询还是之后查询
    <selectKey resultType="int" keyColumn="id" keyProperty="id" order="AFTER">
        select LAST_INSERT_ID() 数据库自带的函数,查询最后一次添加的数据
    </selectKey>
    insert into student values(#{id},#{name},#{age})
</insert>

添加之前是null

图片.png

之前我新增这里写的是null,后来我keyProperty将数据封装到student.id中了,所以后面我这里的null变成了插入进来的6

demo08.gif