1.Mybatis介绍

  • MyBatis 是一款优秀的持久层框架。
    - MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
    Mybatis官网:https://mybatis.org/mybatis-3/zh/

    2. 快速入门

  1. 准备一些mysql的数据

    1. CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis_db` /*!40100 DEFAULT CHARACTER SET utf8 */;
    2. USE `mybatis_db`;
    3. DROP TABLE IF EXISTS `user`;
    4. CREATE TABLE `user` (
    5. `id` int(11) NOT NULL AUTO_INCREMENT,
    6. `username` varchar(50) DEFAULT NULL,
    7. `age` int(11) DEFAULT NULL,
    8. `address` varchar(50) DEFAULT NULL,
    9. PRIMARY KEY (`id`)
    10. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    11. insert into `user`(`id`,`username`,`age`,`address`) values (1,'UZI',19,'上海'),(2,'PDD',25,'上海');
  2. 导入Mybatis和mysql相关依赖

         <!--mybatis依赖-->
         <dependency>
             <groupId>org.mybatis</groupId>
             <artifactId>mybatis</artifactId>
             <version>3.5.4</version>
         </dependency>
         <!--mysql驱动-->
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
             <version>5.1.47</version>
         </dependency>
    
  3. 编写核心配置——mybatis-config.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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/sangeng/dao/UserDao.xml"/>
    </mappers>
</configuration>
  1. 定义接口及对应的xml映射文件

    public interface UserDao {
     List<User> findAll();
    }
    

    resources目录下创建一个包:切记不能用“.”来分级,要用“/”来分级,不然只能当做一个文件夹,创建好之后就可以再创建一个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.sangeng.dao.UserDao">
    
    <select id="findAll" resultType="com.sangeng.pojo.User">
     select * from user
    </select>
    </mapper>
    
  2. 编写测试类

获取SqlSession,通过SqlSession获取UserDao调用对应的方法

 public static void main(String[] args) throws IOException {
        //定义mybatis配置文件的路径
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取Sqlsession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取UserDao实现类对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        //调用方法测试
        List<User> userList = userDao.findAll();
        System.out.println(userList);
        //释放资源
        sqlSession.close();
    }

2.9 高效编程

2.9.1 配置代码模板

  1. 打开settings
  2. 搜索File and Code Templates
  3. 添加一个文件
  4. name = mybatis-config.xml Extension = xml

    ~~~~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>
     <environments default="development">
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <property name="driver" value="com.mysql.jdbc.Driver"/>
                 <property name="url" value="jdbc:mysql://localhost:3306/10yen"/>
                 <property name="username" value="root"/>
                 <property name="password" value="123456"/>
             </dataSource>
         </environment>
     </environments>
     <mappers>
         <mapper resource="com/zhx/dao/UserDao.xml"/>
     </mappers>
    </configuration>
    
  5. 勾选Enable Live Templates

    2.9.2 安装Mybatis插件

    在settings里面找到plugins(安装插件)选项
    然后在里面搜索MybatisX 安装重启IDEA即可

    3.参数获取

    3.1 一个参数

    3.1.1 基本参数

    我们可以用#{}直接来取值,任意名字都可以获取到参数,但是一般用方法的参数名来取。
    例如:
    接口中定义的方法如下

    User findById(Integer id);
    

    xml如下

    <select id="findById" resultType="com.sangeng.pojo.User">  select * from user where id = #{id}</select>
    

    3.1.2 POJO

    我们可以使用POJO中的属性名来获取对应的值。
    例如:
    接口中方法定义如下

    User findByUser(User user);
    

    xml中内容如下

    <select id="findByUser" resultType="com.sangeng.pojo.User">
         select * from user where id = #{id} and username = #{username} and age = #{age} and address = #{address}
     </select>
    

    3.1.3 Map

    我们可以使用map中的key来获取对应的值。
    例如:
    接口中方法定义如下

    User findByMap(Map map);
    

    xml中内容如下

    <select id="findByMap" resultType="com.sangeng.pojo.User">
         select * from user where id = #{id} and username = #{username} and age = #{age} and address = #{address}
     </select>
    

    方法调用

    Map map = new HashMap();
         map.put("id",2);
         map.put("username","PDD");
         map.put("age",25);
         map.put("address","上海");
         userDao.findByMap(map);
    

    3.2 多个参数

    Mybatis会把多个参数放入一个Map集合中,默认的key是argx和paramx这种格式。
    例如:
    接口中方法定义如下

    User findByCondition(Integer id,String username);
    

    最终map中的键值对如下:

    {arg1=PDD, arg0=2, param1=2, param2=PDD}
    

    用@Param注解来定义参数
    例如:
    接口中方法定义

    User findByCondition(@Param("id") Integer id,@Param("username") String username);
    

    最终map中的键值对如下:

    {id=2, param1=2, username=PDD, param2=PDD}
    

    所以我们就可以使用如下方式来获取参数

    <select id="findByCondition" resultType="com.zhx.pojo.User">
          select * from user where id = #{id} and username = #{username}
    </select>
    

    3.3 总结

    建议如果只有一个参数的时候不用做什么特殊处理。如果是有多个参数的情况下一定要加上@Param来设置参数名。

    4. 核心类

    4.1 SqlSessionFactory

    SqlSessionFactory是一个SqlSession的工厂类。主要用来获取SqlSession对象。
    成员方法如下:

    SqlSession openSession();
    //获取SqlSession对象,传入的参数代表创建的SqlSession是否自动提交
    SqlSession openSession(boolean autoCommit);
    

    4.2 SqlSession

    SqlSession 提供了在数据库执行 SQL 命令所需的所有方法 。它还提供了事务的相关操作。

    T getMapper(Class<T> type);//获取mapper对象
    void commit();//提交事务
    void rollback();//回滚事务
    void close();//释放资源
    

    5. Mybatis实现增删改查

    5.1 添加数据 insert

    void insertUser(User user);
    
    <insert id="insertUser">
    insert into user values(null,#{username},#{age},#{address})
    </insert>
    

    注意 记得提交事务 sqlSession.commit();

    5.2 删除数据 delete

    void deleteById(Integer id);
    
    <delete id="deleteById">
         delete from user where id = #{id}
    </delete>
    

    注意 记得提交事务 sqlSession.commit();

    5.3 修改数据 update

    void updateUser(User user);
    
    <update id="updateUser">
         UPDATE USER SET age = #{age} , username = #{username},address = #{address} WHERE id = #{id}
    </update>
    

    注意 记得提交事务 sqlSession.commit();

    5.4 根据ID查询数据

    User findById(Integer id);
    
    <select id="findById" resultType="com.sangeng.pojo.User">
    select * from user where id = #{id}
    </select>
    

    5.5 查询所有

    List<User> findAll();
    

    6. 配置文件详解

    6.1 properties

    在mybatis-config.xml文件里面加一个标签
    用resource属性来获取配置文件路径
    配置文件为jdbc.properties
    然后用${}来获取文件里面的值
    properties文件内容如下:

    jdbc.url=jdbc:mysql://localhost:3306/10yen
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.username=root
    jdbc.password=123
    
    <?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="jdbc.properties"></properties>
    <environments default="development">
     <environment id="development">
       <transactionManager type="JDBC"/>
       <dataSource type="POOLED">
         <!--获取配置文件中配置的对应的值来设置连接相关参数-->
         <property name="driver" value="${jdbc.driver}"/>
         <property name="url" value="${jdbc.url}"/>
         <property name="username" value="${jdbc.username}"/>
         <property name="password" value="${jdbc.password}"/>
       </dataSource>
     </environment>
    </environments>
    </configuration>
    

    6.2 settings

    可以使用该标签来设置进行一些设置
    例如:

    <settings>
         <!--开启自动驼峰命名映射-->
         <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    

    具体的设置参考:https://mybatis.org/mybatis-3/zh/configuration.html#settings

    6.3 typeAliases

    可以用来设置给全类名设置别名,简化书写。一般设置一个包下的类全部具有默认别名。默认别名是类目首字母小写。例如:com.sangeng.pojo.User别名为user

    <typeAliases>
         <package name="com.sangeng.dao"></package>
    </typeAliases>
    

    6.4 environments

    配置数据库相关的环境,例如事物管理器,连接池相关参数等。

    <!--设置默认环境-->
     <environments default="development">
    
         <!--设置该环境的唯一标识-->
         <environment id="development">
             <transactionManager type="JDBC"/>
             <dataSource type="POOLED">
                 <!--获取配置文件中配置的对应的值来设置连接相关参数-->
                 <property name="driver" value="${jdbc.driver}"/>
                 <property name="url" value="${jdbc.url}"/>
                 <property name="username" value="${jdbc.username}"/>
                 <property name="password" value="${jdbc.password}"/>
             </dataSource>
         </environment>
    </environments>
    

    6.5 mappers

    该标签的作用是加载映射的,加载方式有如下几种(主要使用第四种):

  6. 使用相对于类路径的资源引用,例如:

    <!-- 使用相对于类路径的资源引用 -->
    <mappers>
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
    <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
    <mapper resource="org/mybatis/builder/PostMapper.xml"/>
    </mappers>
    
  7. 使用完全限定资源定位符(URL),例如:

    <!-- 使用完全限定资源定位符(URL) -->
    <mappers>
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
    <mapper url="file:///var/mappers/BlogMapper.xml"/>
    <mapper url="file:///var/mappers/PostMapper.xml"/>
    </mappers>
    
  8. 使用映射器接口实现类的完全限定类名,例如:

    <mappers>
    <mapper class="org.mybatis.builder.AuthorMapper"/>
    <mapper class="org.mybatis.builder.BlogMapper"/>
    <mapper class="org.mybatis.builder.PostMapper"/>
    </mappers>
    
  9. 将包内的映射器接口实现全部注册为映射器,例如:

    <!-- 定义dao接口所在的包。要求xml文件存放的路径和dao接口的包名要对应 -->
    <mappers>
    <package name="org.mybatis.builder"/>
    </mappers>
    

    7. 打印日志

  10. log4j配置 在resources目录下创建log4j.properties文件,内容如下: ```properties

    direct log messages to stdout

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

direct messages to file mylog.log

log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=c:/mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

set log levels - for more verbose logging change ‘info’ to ‘debug’

log4j.rootLogger=debug, stdout


2. 导入依赖
```xml
<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
</dependency>

8. 获取参数时 #{}和${}的区别

如果使用#{}的话 它是预编译的sql可以防止sql注入攻击
如果使用${}的话 它可以直接把参数进行拼接 这样会有sql注入的风险
如果使用的是#{}来获取参数值日志如下:

Preparing: select * from user where id = **?** and username = **?** and age = **?** and address = **?** 
Parameters: 2(Integer), 快乐风男(String), 29(Integer), 北京(String)

如果使用${}来获取参数值日志如下:

Preparing: select * from user where id = 2 and username = 快乐风男 and age = 29 and address = 北京