mybatis入门总结

概论:  MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
作用:
Mybatis将sql语句配置到xml配置文件中,然后将输入参数进行映射,由mybatis框架将映射后的sql片段拼接到配置到xml中的sql语句。然后由mybatis框架来执行映射后的sql语句。执行之后的结果将由mybatis框架映射成java对象

执行特点::动态sql语句,缓存技术,(hibernate框架)
优点:
1、简单易学
mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

2、灵活
mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。

3、解除sql与程序代码的耦合
通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

4、提供映射标签,支持对象与数据库的orm字段关系映射
5、提供对象关系映射标签,支持对象关系组建维护
6、提供xml标签,支持编写动态sql。
缺点:
1、编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
2、SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
3、框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
4、二级缓存机制不佳
mybatis的优点同样是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限。
5、 mybatis没有hibernate那么强大,但是mybatis最大的优点就是简单小巧易于上手,方便浏览修改sql语句

核心原理:
1.加载核心xml文件
2.通过加载这个核心xml文件,就能得到一个sqlSessionFactory。
3.得到这个工厂来产生sqlSession,但这个对象本身不能操作我们的数据库
4.sqlSession产生一个解析器Executor,可以产生一个MappedStatements,可以执行sql语句
(MappedStatements是Statement的子类)
5.最后给我们返回数据(map, int, list);

在这里插入图片描述

MyBatis核心配置文件的基本结构:

configuration —— 根元素
properties —— 定义配置外在化
settings —— 一些全局性的配置
typeAliases —— 为一些类定义别名
typeHandlers —— 定义类型处理,也就是定义java类型与数据库中的数据类型之间的转换关系
objectFactory
plugins —— Mybatis的插件,插件可以修改Mybatis内部的运行规则
environments —— 配置Mybatis的环境
environment
transactionManager —— 事务管理器
dataSource —— 数据源
databaseIdProvider
mappers —— 指定映射文件或映射类
前提导入相关种jar包:
在这里插入图片描述

一:第一种配置方式(最原始,容易理解) 测试类test

       String path="mybatis-config.xml";
        //得到一个输入流对象
        InputStream is= Resources.getResourceAsStream(path);

        //得到sqlSessionFactory
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

        //通过SqlSessionFactory得到SqlSession
        SqlSession sqlSession = ssf.openSession();

        //返回一列的就用SelectOne
        int num = sqlSession.selectOne("com.offcn.dao.UserMapper.selectAllUser");

        List<User> list = sqlSession.selectList("com.offcn.dao.UserMapper.selectAllUser");

        System.out.println(num);

,mybatis.xml核心文件配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!--配置环境,连接数据库environments的s表示可以配置多个环境,可以包括你学过的mysql,oracle-->
<environments default="development">
    <environment id="development">
        <!--配置JDBC事务,由mybatis管理-->
        <transactionManager type="JDBC"></transactionManager>
        <!--配置数据源(jndi)是一个由tomcat容器给你分配的数据源,pooled(这是一种mybatis自带的数据源)-->
        <dataSource type="POOLED">
            <property name="url" value="jdbc:mysql://localhost:3306/smbms?useUnicode=true&amp&characterEncoding=utf-8"></property>
            <property name="driver" value="com.mysql.jdbc.Driver"></property>
            <property name="username" value="root"></property>
            <property name="password" value="root}"></property>

        </dataSource>
    </environment>
</environments>
<!--这里的点要换成/-->
<mappers>
   <mapper resource="com/offcn/dao/UserMapper.xml"></mapper>
</mappers>

UserMapper接口:
package com.offcn.dao;

import com.offcn.entity.User;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface UserMapper {
//全查

//List<User> selectAllUser();

//根据查询总记录数--selectCount与xml的id对应一样
//int selectCount();

//增加的方法
//int insertUser(User user);

//模糊查询
//List<User> selectLikeUser(String name);

}
所需要的User实例类
package com.offcn.entity;

import java.util.Date;

public class User {
private Integer id; //id
private String userCode; //用户编码
private String userName; //用户名称
private String userPassword; //用户密码
private Integer gender; //性别
private Date birthday; //出生日期
private String phone; //电话
private String address; //地址
private Integer userRole; //用户角色
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate; //更新时间

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getUserCode() {
    return userCode;
}

public void setUserCode(String userCode) {
    this.userCode = userCode;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getUserPassword() {
    return userPassword;
}

public void setUserPassword(String userPassword) {
    this.userPassword = userPassword;
}

public Integer getGender() {
    return gender;
}

public void setGender(Integer gender) {
    this.gender = gender;
}

public Date getBirthday() {
    return birthday;
}

public void setBirthday(Date birthday) {
    this.birthday = birthday;
}

public String getPhone() {
    return phone;
}

public void setPhone(String phone) {
    this.phone = phone;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public Integer getUserRole() {
    return userRole;
}

public void setUserRole(Integer userRole) {
    this.userRole = userRole;
}

public Integer getCreatedBy() {
    return createdBy;
}

public void setCreatedBy(Integer createdBy) {
    this.createdBy = createdBy;
}

public Date getCreationDate() {
    return creationDate;
}

public void setCreationDate(Date creationDate) {
    this.creationDate = creationDate;
}

public Integer getModifyBy() {
    return modifyBy;
}

public void setModifyBy(Integer modifyBy) {
    this.modifyBy = modifyBy;
}

public Date getModifyDate() {
    return modifyDate;
}

public void setModifyDate(Date modifyDate) {
    this.modifyDate = modifyDate;
}

}
sql的映射文件UserMapper.xml的配置:

<?xml version="1.0" encoding="UTF-8" ?> id是唯一的,是你访问的一个标识符 <!–查询总记录数sql–> <!–resultType返回值类型 ,sql语句不加“;”–> select count(1) from smbms_user <!–全查,resultType可以设置别名–> select * from smbms_user
&lt;!&ndash;模糊查询&ndash;&gt;

<!– parameterType代表参数类型 #{userName}代表一个?号占位符 模糊查询一定要加上concat–>

select * from smbms_user where userName like concat(’%’,#{userName},’%’)

</select>

<select id="selectLikeUserId" resultType="com.offcn.entity.User" parameterType="int">
    select * from  smbms_user where id =#{id}

</select>

&lt;!&ndash;修改根据id修改名字,密码返回值类型int **-userName对应你mysql的列&ndash;&gt;
<select id="updateById" parameterType="com.offcn.entity.User" resultType="int">
    update smbms_user set userName=#{userName},userPassword=#{userPassword} where id=#{id}

</select>

&lt;!&ndash;根据id删除&ndash;&gt;
<select id="deleteById" parameterType="int" >
    delete from smbms_user where id=#{id}
</select>

&lt;!&ndash;  增加一个    &ndash;&gt;
<select id="insertUser" parameterType="com.offcn.entity.User" resultType="int">
    insert into  smbms_user(userName,userPassword) values(#{userName},#{userPassword})
</select>

二:第二种配置方式:
创建单例模式工具类:
package com.offcn.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

/*

  • 得到SqlSession的工具类

  • */
    public class SqlSessionUtils {
    private static SqlSessionUtils sqlSessionUtils;
    public SqlSession sqlSession;
    //这个构造要读取核心配置文件
    private SqlSessionUtils() {
    try {

         String path = "mybatis-config.xml";
         InputStream is = Resources.getResourceAsStream(path);
         SqlSessionFactory ssf =  new SqlSessionFactoryBuilder().build(is);
         sqlSession = ssf.openSession(true);
    
     }catch (Exception e){
         e.printStackTrace();
     }
    

    }
    //得到一个对外的方法得到这个对象
    /第一个同步锁,锁方法(可能会出现死锁),保证只有一个线程能进入这个方法/
    public static synchronized SqlSessionUtils getSqlSessionUtils() {
    if (sqlSessionUtils == null) {
    /*在Java jvm 实例化对象有4个步骤,
    为了避免这种情况(当走到第一个步骤时,而另外的线程又开始实例化对象)产生,
    * 保证了永远只有一个这样的类
    /
    synchronized (SqlSessionUtils.class){
    if (sqlSessionUtils == null) {
    sqlSessionUtils = new SqlSessionUtils();
    }
    }
    }
    return sqlSessionUtils;
    }
    }

**,mybatis.xml核心文件配置:**如下

<?xml version="1.0" encoding="UTF-8" ?>
<typeAliases>
    <!--给你当前包下面的所有类取别名 别名的名字就是你的类名-->
    <!--<package name="com.offcn.entity"></package>-->
    <!--给具体的类加上别名-->
    <!--type 就是要加的别名的包下面的类的全路径名-->
    <!--alias 就是你要取得别名-->
    <typeAlias type="com.offcn.entity.Address" alias="Addss"></typeAlias>
</typeAliases>

<!--配置环境,连接数据库environments的s表示可以配置多个环境,可以包括你学过的mysql,oracle-->
<environments default="development">
    <environment id="development">
        <!--配置JDBC事务,由mybatis管理-->
        <transactionManager type="JDBC"></transactionManager>
        <!--配置数据源(jndi)是一个由tomcat容器给你分配的数据源,pooled(这是一种mybatis自带的数据源)-->
        <dataSource type="POOLED">
            <property name="url" value="${url}"></property>
            <property name="driver" value="${driver}"></property>
            <property name="username" value="${username}"></property>
            <property name="password" value="${password}"></property>

        </dataSource>
    </environment>
</environments>
<!--与UserMapper.xml进行关联***** resource可以配置多个xml映射文件路径-->
<!--这里的点要换成/-->
<mappers>
   <!--<mapper resource="com/offcn/dao/UserMapper.xml"></mapper>-->

</mappers>
**测试类如下:**--调用工具类进行实例的创建与映射 SqlSession sqlSession= SqlSessionUtils.getSqlSessionUtils().sqlSession;
        List<User> list = sqlSession.selectList("com.offcn.dao.UserMapper.selectLikeUser", "李");

        for (User user:list){
            System.out.println(user.getUserName()+"/t"+user.getUserRole());
        }

其他的类,接口不变.

三:就是用注解配置进行sql语句的映射,就不用创建UserMapper.xml的映射文件:
要加入的jar包:
在这里插入图片描述

package com.offcn.dao;

import com.offcn.entity.User;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
@Mapper
public interface UserMapper {
//全查–注解配置sql语句—调用selectAllUser时就执行该sql语句
@Select(“select * from smbms_user”)
List selectAllUser();

//根据查询总记录数--selectCount与xml的id对应一样
//int selectCount();

//增加的方法
//int insertUser(User user);

//模糊查询
//List<User> selectLikeUser(String name);


/*------最总版-------*/
List<User> selectAllLIst();

}

测试类:
/-----注解配置的映射------/
/查询mysql表中所有Address的方法/
SqlSession sqlSession= SqlSessionUtils.getSqlSessionUtils().sqlSession;
AddressMapper mapper = sqlSession.getMapper(AddressMapper.class);
List

list = mapper.selectAllAddress();
for (Address aa:list) {
System.out.println(aa.getContact()+"###");
}

猜你喜欢

转载自blog.csdn.net/weixin_42772943/article/details/83018141
今日推荐