初识mybatis框架

什么是mybatis ?

       MyBatis 是一款一流的支持自定义 SQL、存储过程和高级映射的持久化框架。MyBatis 几乎消除了所有的 JDBC 代码,也基本不需要手工去设置参数和获取检索结果。MyBatis 能够使用简单的XML 格式或者注解进行来配置,能够映射基本数据元素、Map 接口和 POJOs(普通 java 对象)到 数据库中的记录。

简单理解的话 , 就是与专门与数据库交互的框架

目录

mybatis架构 : 

1. 核心配置文件

2. sql映射文件

3. POJO 对象输出映射

搭建 : 


mybatis架构 : 

1. 核心配置文件

MyBatis 的配置文件包含了对 MyBatis 行为的设置信息。 配置文档的顶层结构如下(标签需要按照特定顺序排放):
每一个标签的位置都是固定的 , 随意排序便会出错
其中environment配置连接的数据库 , mappers 配置接口与对应xml文件的映射
properties 元素
它们都是外部化,可替代的属性。可以配置在一个典型的 Java 属性文件中,或者通过
properties 元素的子元素进行配置。
这个标签下 , 我们一般配置一些可变的参数,将这些参数单独放入一个文件,然后在 properties导入
Settings 元素
Setting 元素下是些非常重要的设置选项,用于设置和改变 MyBatis 运行中的行为。下面的
表格列出了 Setting 元素支持的属性、默认值及其功能。
这里面包含很多mybatis的设置, 开启之后会有一些功能
typeAliases 元素
别名是一个较短的 Java 类型的名称。这只是与 XML 配置文件相关联,减少输入多余的完整类名。
因为我们必须要传入全类名,否则会找不到, 我们可以在此给类起一个别名
例如 :  全类名: com.org.model.User   别名: User  
Environments 元素
MyBatis 能够配置多套运行环境,这有助于将您的 SQL 映射到多个数据库上。例如,在您的
开发、测试、生产环境中,您可能有不同的配置。或者您可能有多个共享同一 schema 的生产用数据库,或者您想将相同的 SQL 映射应用到两个数据库等等许多用例。
在此配置数据库的连接方式 ,事务管理等等, 这是必须配置的
Mappers 元素
现在,MyBatis 的行为属性都已经在上面的配置元素中配置好了,接下来开始定义映射 SQL
语句。但首先,我们需要告诉 MyBatis 在哪里能够找到我们定义的映射 SQL 语句。在这方面, JAVA 自动发现没有提供好的方法,因此最好的方法是告诉 MyBatis 在哪里能够找到这些映射文件

这个元素中我们告诉mybatis与哪个接口进行映射

2. sql映射文件

       我们只提供与数据库交互的接口方法, sql 写在对应的xml文件中, 
<?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.ff.mybatis.dao.UserDao"> </mapper>

<mapper></mapper>上面是约束 , <mapper>里面的namespace属性就是这个xml文件对应的接口

那么我们要如何在接口对应的xml文件中写sql呢 ? 

插入数据

<insert id=" 唯一标识 " useGeneratedKeys=" 把新增加的主键赋值到自己定义的 keyProperty " keyProperty=“ 接收主键的属性 parameterType=" 参数类型 ">
      insert into user(userName,userAge)values(#{userName},#{userAge})
</insert>
其中 id属性 对应的是接口中的方法名
插入数据采用<insert>标签, 这里面有两个属性 useGeneratedKeys 和 keyProperty
        简单理解就是, 如果你数据库的主键设置为自增的话 , 插入数据的时候 , 如果你需要刚刚生成的这个主键的值的话, 那么你可以将 useGeneratedKeys 设置为 true , 这样它就会将刚生成的主键值映射到 keyProperty 属性上, 这个时候你只需要配置keyProperty对应的是哪个属性即可,这样我们就可以直接在java代码中拿到这个值
#{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入
这里还有一种方式 ${}
${} , 采用的是字符串拼接方式, 多用于传列名
修改数据
<update id= " 唯一标识 " parameterType=“ 参数类型 ">
update ts_user set userName = #{userName},userAge = #{userAge} where userId = #{userId}
</update>
删除数据
<delete id= " 唯一标识 " parameterType= " 参数类型 " >
     delete from ts_user where userId = #{id}
</delete>
查询数据
<select id=" 唯一标识 " resultType=" 返回结果集类型 ">
     select * from ts_user where id= #{id}
</select>

其中 resultType 是查询返回的结果类型

参数传递

         parameterType为传入的参数类型 , 一般传入的类型较复杂时使用

如果仅仅传入一个 int 型,则没有必要使用,例如
User selectUsers(int id);
delete from ts_user where userId = #{id}
 这里直接就可以接收 id 的值
如果传入多参数就必须加 @Param(“id”)绑定 , 例如
User selectUsers(@Param(“id”)int id,@Param(“name”)String name);

这里也是可以直接拿到对应的值

那么什么时候用到parameterType呢 ? 

       我们一般在传入一个对象类型的时候使用 , 它可以拿出对象里面的值,例如

<insert id = "insertUser" parameterType = "User" >
      insert into users (id, username, password) values (#{id}, #{username}, #{password})
</insert>

这里我们也可以使用map传递

User selectUser(Map<Integer,String> map)
<select id="selectUser" parameterType="map" resultType="User">
    select * from t_user where id=#{id}
</select>

parameterType选择 map 或者hashmap , #{id} 表示map的键, sql直接通过键拿到值

3. POJO 对象输出映射

当我们与数据库交互获得查询后的结果时,mybatis怎么去处理它们呢?

当返回基本类型时

  int findUserInfoCount();
<select id="findUserInfoCount" resultType="int">
      select count(*) from userInfo
</select>

resultType选择 int , 接口的返回值类型也是 int 

但如果 我们接口中定义的方法返回值是一个对象, 这时怎么办呢?

User userLogin(String name)      //返回值为自定义的引用类型

       这时我们只需将 resultType的值设置为我们自定义的引用类型即可 , 当查询到结果后, 如果数据库字段和我们自定义类中的属性一致的话 , mybatis就会自动创建一个对象,将查询到的结果直接映射到对象中, 然后把该对象给我们返回, 这里 mybatis为我们创建对象默认调用无参的构造方法

       这就是mybatis框架的便捷之处 , 另外也可以在settings配置中设置驼峰映射

<setting name="mapUnderscoreToCamelCase" value="true"/>

       由于命名规范 , 在数据库中我们一般命名字段为 user_name, java中的匹配属性为userName,开启此设置, 我们便不考虑必须使得数据库中的字段和java中类的属性名字一样

搭建 : 

先在pom.xml中导入 mybatis 与 mysql 的 jar包依赖
<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.4.2</version>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.22</version>
</dependency>

创建 model 目录 创建User类

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}

新建dao目录 , 创建LoginDao接口

public interface LoginDao {
    //定义方法
    User userLogin(String name);
}

在 resources 目录下创建 mapper目录 ,新建LoginMapper.xml文件

<?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="dao.LoginDao">
    <!-- sql语句-->
    <select id="userLogin" resultType="User">
        select name from t_user where name=#{name}
    </select>
</mapper>

resources目录下新建config.properties配置文件

driverName=com.mysql.cj.jdbc.Driver
urlName=jdbc:mysql://127.0.0.1:3306/demo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
userName=root
password=root

resources目录下新建mybatis核心配置文件Mybatis-cof.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">

<!--mybatis核心配置-->
<configuration>
    <!-- 导入配置文件-->
    <properties resource="config.properties">

    </properties>
    <!-- 为类配置别名-->
    <typeAliases>
        <typeAlias type="model.User" alias="User"/>
    </typeAliases>
    <!-- 配置环境-->
    <environments default="development">
        <environment id="development">
            <!--配置事务管理类型,使用jdbc事务管理7-->
            <transactionManager type="JDBC">

            </transactionManager>
            <!--加载mysql驱动-->
            <dataSource type="UNPOOLED">
                <property name="driver" value="${driverName}"/>
                <property name="url" value="${urlName}"/>
                <property name="username" value="${userName}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>

    </environments>
    <!--添加sql映射文件-->
    <mappers>
        <mapper resource="mapper/LoginMapper.xml"/>
    </mappers>

</configuration>

新建 util 目录 , 创建MybatisUtil类 

public class MybatisUtil {

    static SqlSessionFactory sessionFactory=null;

    static {
        Reader reader=null;
        try {
            //读取mybatis核心配置文件
            reader = Resources.getResourceAsReader("Mybatis-cof.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //创建SqlSessionFactory对象,它是创建SqlSession的工厂
        //创建开销较大,一个程序只有一个,创建既不用关闭
        sessionFactory=new SqlSessionFactoryBuilder().build(reader);
    }

    public static SqlSession getSqlSession() {
        return sessionFactory.openSession();
    }
}

测试类 :

public class Test {

    public static void main(String[] args) {

        SqlSession sqlSession= MybatisUtil.getSqlSession();
        //获得接口的代理对象
        LoginDao mapper=sqlSession.getMapper(LoginDao.class);

        User user = mapper.userLogin("b李雷");

        System.out.println(user);
        //提交事务
        sqlSession.commit();
        //销毁关闭
        sqlSession.close();
    }
}

测试所用数据库表如下 : 

执行 : 

查询成功 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值