MyBatis(二)

1.MyBatis执行SQL的两种方式

1.用 Mapper 接口发送 SQL--sqlSession.getMapper();[推荐]
    2.SqlSession 发送 SQL  sqlSession.insert()/update()/delete()/selectOne.....
    建议采用 SqlSession 获取 Mapper 的方式,理由如下:
1.使用 Mapper 接口编程可以消除 SqlSession 带来的功能性代码,提高可读性,而 SqlSession 发送 SQL,需要一个 SQL id 去匹配 SQL,比较晦涩难懂。
2.使用Mapper.selectPersonById(1)方式,IDE会提示错误和校验,而使用 
    sqlSession.selectOne(“com.wangxing.mybatis.mapper.PersonMapper.selectPersonById”,1)语法,只有在运行中才能知道是否会产生错误。

2.MyBatis的程序构成

1.数据访问接口+SQL映射文件【推荐】
2.数据访问接口+注解

3.创建项目接口+注解

1.创建项目,导入依赖,完善结构

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
</dependency>

2.创建数据模型javabean

package com.student.bean;

public class StudentBean {
    private int stuid;
    private String stuname;
    private int stuage;
    private String stuaddress;

    public StudentBean(int stuid, String stuname, int stuage, String stuaddress) {
        this.stuid = stuid;
        this.stuname = stuname;
        this.stuage = stuage;
        this.stuaddress = stuaddress;
    }
    public StudentBean() {
    }

    public int getStuid() {
        return stuid;
    }

    public void setStuid(int stuid) {
        this.stuid = stuid;
    }

    public String getStuname() {
        return stuname;
    }

    public void setStuname(String stuname) {
        this.stuname = stuname;
    }

    public int getStuage() {
        return stuage;
    }

    public void setStuage(int stuage) {
        this.stuage = stuage;
    }

    public String getStuaddress() {
        return stuaddress;
    }

    public void setStuaddress(String stuaddress) {
        this.stuaddress = stuaddress;
    }
}

3.创建数据访问接口

import org.apache.ibatis.annotations.*;

import java.util.List;

public interface StudentMapper {
    /**
     * 添加数据
     * @param studentBean
     * @return
     */
    @Insert("insert into t_student values(null,#{stuname},#{stuage},#{stuaddress});")
    boolean insertStudent(StudentBean studentBean);
    /**
     * 修改数据
     * @param studentBean
     * @return
     */
    @Update("update t_student set stu_name=#{stuname},stu_age=#{stuage}," +
            "stu_address=#{stuaddress} where stu_id=#{stuid};")
    boolean updateStudent(StudentBean studentBean);
    /**
     * 删除数据
     * @return
     */
    @Delete("delete from t_student where stu_id=#{stuid};")
    boolean deleteStudentById(int stuid);
    /**
     * 根据id查询数据
     * @return
     */
    @Results(id = "stuMapid",value = {
            @Result(column = "stu_id" , property = "stuid"),
            @Result(column = "stu_name",property = "stuname"),
            @Result(column = "stu_age",property = "stuage"),
            @Result(column = "stu_address",property = "stuaddress"),
    })
    @Select("select * from  t_student where stu_id=#{stuid};")
    StudentBean selectStudentById(int stuid);
   
    /**
     * 查询所有数据
     * @return
     */	
    @Results(id = "stuMap",value = {
            @Result(column = "stu_id" , property = "stuid"),
            @Result(column = "stu_name",property = "stuname"),
            @Result(column = "stu_age",property = "stuage"),
            @Result(column = "stu_address",property = "stuaddress"),
    })
    //@ResultMap("可以引用SQL映射文件中的ResultMap")
    @Select("select * from  t_student;")
    List<StudentBean> selectStudent();
}

4.在resources下创建数据库访问字符串资源文件【mydata.properties】

mydrivername=com.mysql.jdbc.Driver
myurl=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
myusername=root
mypassword=123456

5.在resources下创建数据访问接口的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="com.wangxing.mybatisdemo.StudentMapper">
	原本出现在这里的元素都被注解元素代替
</mapper>


6.在resources下创建MyBatis核心配置文件

<?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="mydata.properties"></properties>
    <!-- 配置mybatis默认的连接数据库的环境 -->
    <environments default="development">
        <environment id="development">
            <!-- 配置事务管理器 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="${mydrivername}"/>
                <property name="url" value="${myurl}"/>
                <property name="username" value="${myusername}"/>
                <property name="password" value="${mypassword}"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置MyBatis数据访问接口的SQL映射文件路径 -->
    <mappers>
        <mapper resource="StudentMapper.xml"></mapper>
    </mappers>
</configuration>

3.MyBatis 的工作原理

1.读取MyBatis的核心配置文件【mybatis-condif.xml】。
2.加载数据库连接的资源文件初始化数据源。
3.加载数据访问接口对应的SQL映射文件。
4.创建SqlSessionFactory接口对象。
5.通过SqlSessionFactory接口对象创建出SqlSession对象。
6.SqlSession对象调用MyBatis底层定义了一个Executor接口【将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。】
7.Executor接口中的执行方法中的封装输入参数的映射信息,生成需要执行的 SQL 语句执行,将数据库运行结果转换成输出结果映射。

注意:Executor 执行器执行SQL语句时,是根据SQL映射文件中对应元素的<insert><update><delete><select>的id属性值去选择对应的sql语句,由于SQL映射文件中对应元素的<insert><update><delete><select>的id属性值是数据访问接口的方法名,所以数据访问接口中的方法是不能重载的。

4.MyBatis的核心组件

1.SqlSessionFactoryBuilder:通过读取MyBatis核心配置文件构建SqlSessionFactory的接口对象
new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-config.xml"));
注意:MyBatis核心配置文件的位置和名称

2.SqlSessionFactory(工厂接口):依靠它来生成 SqlSession,使用的是工厂模式。
SqlSession sqlSession=sqlSessionFactory.openSession();

3.SqlSession:一个既可以发送 SQL 执行返回结果,也可以获取数据访问接口。
        在 MyBatis 中有两个实现类,DefaultSqlSession 和 SqlSessionManager。
        DefaultSqlSession 是单线程使用的,而 SqlSessionManager 在多线程环境下使用。

        SqlSession执行SQL语句的方法有2种

1.SqlSessiont提供的insert/update/delete/select......
int  insert(“数据访问接口的包名+接口名+方法名” ,  数据访问接口的方法的参数);
int  update(“数据访问接口的包名+接口名+方法名” ,  数据访问接口的方法的参数);
int  delete(“数据访问接口的包名+接口名+方法名” ,  数据访问接口的方法的参数);
<T>  selectOne(“数据访问接口的包名+接口名+方法名” ,  数据访问接口的方法的参数);
List<T>  selectList(“数据访问接口的包名+接口名+方法名” ,  数据访问接口的方法的参数);
2.通过getMapper得到数据访问接口对象调用接口方法完成sql语句执行
        数据访问接口对象=SqlSession对象.getMapper(数据访问接口的反射对象);
StudentMapper studentMapper  =(StudentMapper)sqlSession.getMapper(StudentMapper.class);

4.SQLMapper(映射器):MyBatis新设计存在的组件,它由一个Java接口和XML文件(或注解)构成,需要给出对应的 SQL 和映射规则。它负责发送 SQL 去执行,并返回结果。
SQL Mapper(映射器)=数据访问接口+SQL映射文件/注解,负责发送 SQL 去执行,并返回结果。

5.MyBatis的配置文件

1.SQL映射文件----【为数据访问接口配置SQL语句】
      命名:与数据访问接口同名【.xml】
      位置:1.resources资源目录下
      resources资源目录下的子文件夹中

2.与数据访问接口用一个包中

<?xml version="1.0" encoding="UTF-8"?>

由于xml文件中的元素【根元素/子元素...】都是可以自己定义,所以就需要一个MyBatisSQL映射文件的约束文件,这个约束文件就规定了在SQL映射文件中的元素不能自己随意定义,只能使用约束文件中定义的元素编写。

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

3.mapper

    是SQL映射文件的根元素
        namespace属性---设置的是数据访问接口的包名+接口名。
        如果这个属性没有设置,那么我们在编写SQL映射文件insert/update/delete/select...这些元素时id属性就需要设置成“数据访问接口的包名+接口名+方法名”

4.sql语句的映射

insert--设置添加的sql语句
      id属性---方法名
      parameterType属性---参数类型

update--设置修改的sql语句
        id属性---方法名
        parameterType属性---参数类型

    delete--设置删除的sql语句
        id属性---方法名
        parameterType属性---参数类型
    select--设置查询的sql语句
        id属性---方法名
        parameterType属性---参数类型
        resultMap / resultType --- 设置查询结果的数据类型
    resultMap---设置查询结果的映射
        id属性--resultMap元素的名称
        type属性--查询结果的数据类型

        id子元素---设置数据表中的主键的映射关系
            column属性--设置数据库表的列名称
            property属性---设置java类中的成员变量
        
        result子元素---设置数据表中的非主键的映射关系
            column属性--设置数据库表的列名称
            property属性---设置java类中的成员变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值