MyBatis入门知识

Posted wings丶xh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis入门知识相关的知识,希望对你有一定的参考价值。

1.什么是MyBatis?

MyBatis是一个ORM的数据库持久化框架,是Java的持久层框架 Mybatis是一个支撑框架,它以映射sql语句orm方式来数据库持久化操作。

数据库持久化把内存中数据保存到数据库中。

     数据持久化就是将内存中的数据模型转换为存储模型。

     常见的数据持久有:磁盘持久化和数据库持久化。

     数据库持久化是数据持久化的其中一种,就是把内存中的数据保存到数据库中。

2.MyBatis与传统jdbc的比较

jdbc:

  1.重复代码比较多;

  2.封装对象比较麻烦;

  3.没有性能控制,如果要提高效率,需要自己写缓存(一级缓存、二级缓存)

mybatis:

  1.易于上手和掌握;

  2.没有太多重复代码;

  3.sql写在xml里,便于统一管理和优化;

  4.解除sql与程序代码的耦合;

  5.提供映射标签,支持对象与数据库的orm字段关系映射;

  6.提供对象关系映射标签,支持对象关系组建维护;

  7.提供xml标签,支持编写动态sql。

3.如何使用MyBatis

(1) 导入jar包;

  使用任何框架都离不开jar包的引入,今天我们只是对MyBatis做基本的认识以及相关的比较简单的CRUD等测试,所以我们不需要建立Maven项目,只需要建立普通java项目,所需要的jar包如下图所示:

 

 

 

(2) 配置相关文件,如:MyBatis-Config.xml / jdbc.properties / UserMapper.xml

MyBatis-Config.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">
<!-- 配置-->
<configuration>
    <!--引入jdbc.propeties文件-->
    <properties resource="jdbc.properties" />
    <!-- 环境们 (很多环境的意思)
        default:默认使用哪一个环境(必需对应一个环境的id)
     -->
    <!--MyBatis自定义别名-->
    <typeAliases>
        <package name="cn.itsource.domain"/>
        <package name="cn.itsource.query"/>
        <!--<typeAlias type="cn.itsource.domain.User"/>-->
    </typeAliases>
    <environments default="development">
        <!--
            一个环境  id:为这个环境取唯一一个id名称
        -->
        <environment id="development">
            <!--
                事务管理   type:JDBC(支持事务)/MANAGED(什么都不做)
            -->
            <transactionManager type="JDBC" />
            <!-- 数据源, 连接池  type(POOLED):MyBatis自带的连接池 -->
            <dataSource type="POOLED">
                <!-- 连接数据库的参数 -->
                <property name="driver" value="${jdbc.driverClassName}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!-- 这个mappers代表的是相应的ORM映射文件 -->
    <mappers>
        <mapper resource="cn/itsource/domain/UserMapper.xml" />
    </mappers>
</configuration>

jdbc.properties:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=root

(3) 测试

4.MyBatis完成CRUD

新增:

 1 @Override
 2     public void save(User user) throws IOException {
 3       //读取配置文件
 4         Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
 5       //得到SqlSessionFactory
 6         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
 7         SqlSession sqlSession = sqlSessionFactory.openSession();
 8       //调用方法 namespace+id
 9         sqlSession.insert("cn.itsource.dao.IUserDao.save", user);
10       //提交
11         sqlSession.commit();
12     }

修改:

1 @Override
2     public void update(User user) throws IOException {
3         Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
4         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
5         SqlSession sqlSession = sqlSessionFactory.openSession();
6         sqlSession.update("cn.itsource.dao.IUserDao.update", user);
7         sqlSession.commit();
8     }

删除:

1 @Override
2     public void delete(Long id) throws IOException {
3         Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
4         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
5         SqlSession sqlSession = sqlSessionFactory.openSession();
6         sqlSession.delete("cn.itsource.dao.IUserDao.delete", id);
7         sqlSession.commit();
8     }

查询所有:

1 @Override
2     public List<User> findAll() throws IOException {
3         //读取配置文件
4         Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
5         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
6         SqlSession sqlSession = sqlSessionFactory.openSession();
7         List<User> list = sqlSession.selectList("cn.itsource.dao.IUserDao.findAll");
8         return list;
9     }

查询单条:

1 public User findOne(Long id) throws IOException {
2         Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
3         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
4         SqlSession sqlSession = MyBatisUtils.INSTANCE.getSqlSession();
5         User user = sqlSession.selectOne("cn.itsource.dao.IUserDao.findOne", id);
6         return user;
7     }

以上写法重复代码比较多,其实每个Dao的方法都要获取SQLSession,并且使用完都要关闭,对象获取和关闭等操作都应该交给工具处理。因此,我们可以抽取一个工具类,在这里我使用的是枚举类:

 1 package cn.itsource.utils;
 2 
 3 import org.apache.ibatis.io.Resources;
 4 import org.apache.ibatis.session.SqlSession;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7 
 8 import java.io.IOException;
 9 import java.io.Reader;
10 
11 /**
12  * MyBatis工具类
13  */
14 public enum MyBatisUtils {
15 
16     INSTANCE;
17 
18     private static SqlSessionFactory sqlSessionFactory;
19 
20     static {
21         try {
22             Reader reader = Resources.getResourceAsReader("MyBatis-Config.xml");
23             sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
24         } catch (IOException e) {
25             e.printStackTrace();
26             throw new RuntimeException("读取配置文件错误:" + e.getMessage());
27         }
28     }
29 
30     public SqlSession getSqlSession() {
31         return sqlSessionFactory.openSession();
32     }
33 
34 }

将工具类抽取成功之后,我们只需要调用这个工具类就可以获取到SqlSession对象了。例如:

1 @Override
2     public void save(User user) throws IOException {
3         SqlSession sqlSession = MyBatisUtils.INSTANCE.getSqlSession();
4         sqlSession.insert("cn.itsource.dao.IUserDao.save", user);
5         sqlSession.commit();
6     }

5.MyBatis使用的一些细节

(1)主键

    <insert id="save" parameterType="User" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into t_user(name) values(#{name})
    </insert>

(2)日志log4j怎么使用

# 日志输出级别 输出到控制
log4j.rootLogger=ERROR, stdout
#log4j.rootLogger=NONE
log4j.logger.cn.itsource=TRACE
# 输出到控制台的配置信息
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# 输出到控制台的 格式类
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

(3)MyBatis中的别名

  内置别名:

 

 

 

 自定义别名:

<typeAliases>
       <!-- 
      配置单独类 <typeAlias type="cn.itsource.domain.User" alias="user"></typeAlias>
--> <!--配置包--> <package name="cn.itsource.domain"></package> </typeAliases>

 

(4)#与$的区别

  ① $ {id} 找的类参数类的里面 getId这个方法,如果有 就不会报错,没有就会报错

  ② # 占位符,$ 拼接字符串形式 -- 比较重要点

    userMapper.xml update t_user set name=${name} where id=#{id} 生成语句 update t_user set name=xxx where id=?

    $ 拼接字符串方式 --Statement --存在sql注入问题

    \'# 占位符 -- PreparedStatement

  ③ 平时使用比较多还是 #{id}

  ④ $一般使用在orderby + limit 上面,其他情况下就是使用#

 6.批量操作

 1   <!--批量删除-->
 2     <delete id="deleteBatch" parameterType="list">
 3         delete from t_user where id in
 4         <foreach collection="list" item="id" open="(" separator="," close=")">
 5             #{id}
 6         </foreach>
 7     </delete>
 8     <!--批量新增-->
 9     <insert id="saveBatch" parameterType="list">
10         insert into t_user(name) values
11         <foreach collection="list" item="user" separator=",">
12             (#{user.name})
13         </foreach>
14     </insert>

7.MyBatis的动态sql

 

 1 <!-- 批量插入: 
 2     parameterType:传入参数是:java.util.List的类型的; 
 3         对传入的list进行foreach循环:取出值填入插入的values中: 
 4     collection="list":这个不能修改,表示传入的一个list类似于一个key是list,得到传入的list集合
 5     index="index":每一次遍历的序号 
 6     item="item":每次遍历的这个对象别名,可以修改 
 7     separator=",":每遍历一次后的分隔符
 8 -->
 9     <!--高级查询-->
10     <sql id="whereSql">
11         <where>
12             <if test="name!=null">
13                 and name like #{name}
14             </if>
15             <if test="age!=null">
16                 and age=#{age}
17             </if>
18         </where>
19     </sql>
20     <select id="queryAll" parameterType="userQuery" resultType="User">
21         select * from t_user
22         <include refid="whereSql"/>
23     </select>

 

以上是关于MyBatis入门知识的主要内容,如果未能解决你的问题,请参考以下文章

markdown [mybatis参考]关于mybatis #mybatis的一些片段

mybatis学习(39):动态sql片段

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级

推荐学java——MyBatis高级