Mybatis的学习

简介:

MyBatis是一款优秀的持久层框架,相比Hibernate而言,更适合做需求不明确,需求经常变化的互联网项目,因为Mybatis能更好的定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

官方学习文档:http://www.mybatis.org/mybatis-3/zh/configuration.html

工程完成后的全部目录:

Mybatis的学习

1.新建工程

Mybatis的学习

创建完的项目目录

Mybatis的学习

2.在pom.xml引入Mybatis所需要的架包

//这段代码加在<dependencies></dependencies>这个标签里面
<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>

3.新建数据库名字叫mybatisstu,里面新建user表

Mybatis的学习Mybatis的学习

4.资源文件的配置

4.1在main文件夹下新建resource类型的文件config的配置文件

Mybatis的学习

注意这个文件类型一定要设置为resource类型不要后面运行程序会报:

java.io.IOException: Could not find resource mybatis-config.xml

Mybatis的学习

4.2在config里面新建这几个文件:

Mybatis的学习

mybatis-config.xml是我们的配置文件,

log4.properties是我们的日志文件,没有他,我们将看不到,每次运行都干了什么,比如sql语句的打印

config.properties是我们的数据库信息

User.xml是我们的映射文件

4.3配置config.properties文件:

jdbc.databaseurl=jdbc:mysql://127.0.0.1:3306/mybatisstu?characterEncoding=UTF-8&serverTimezone=GMT%2b8
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.username=root
jdbc.password=root
jdbc.maxActive=100
jdbc.maxWait=5000
jdbc.filters=wall,stat

4.4配置log4.properties

#在开发环境下日志级别设置成DEGUG,生成环境配置成info 或者error
log4j.rootLogger=debug, stdout, R
#
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=firestorm.log

log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.com.codefutures=DEBUG

4.3和4.4这两个文件都是不变的,以后都可以照写,除了更改4.3中数据库的名字

4.5非常重要的mybatis-config.xml的配置

xml文件属性介绍:

Mybatis的学习

properties

           这些属性都是可外部配置且可动态替换的,既可以在典型的java属性文件中配置,亦可通过 properties 元素的子元素来传递,                        例如:我外部有个文件config.properties,现在通过properties将这个文件引入xml配置文件里

Mybatis的学习

                现在获取这些值:用${这里添配置文件里得参数名}

 <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.databaseurl}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

 

settings

            这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。下表描述了设置中各项的意图、默认值等。

Mybatis的学习

typeAliases

            类型别名是为java类型设置一个短的名字。他只和xml有关,存在的意义仅在于用来减少类完全限定名的冗余

例如:

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
  <typeAlias alias="Comment" type="domain.blog.Comment"/>
  <typeAlias alias="Post" type="domain.blog.Post"/>
  <typeAlias alias="Section" type="domain.blog.Section"/>
  <typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>

然后就还可以通过别名来代替使用较长的路径名.

映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。例如:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

 

完整的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>
<!--这个很重要,用来连接刚才存放数据库信息的文件,有了这个连接,我们才能拿到那个文件里面的信息-->
    <properties resource="config.properties"/>
   
<!--这个配置也很重要,我们可以给我们类起一个别名,这样子当我们需要引用User这个类的时候,就不需要写全部路径,直接用他的别名User就可以了-->
    <typeAliases>
        <typeAlias type="zjc.model.User" alias="User"/>
    </typeAliases>


    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.databaseurl}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!--加载映射文件-->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>

 

4.6配置User.xml映射文件

注意:

mapper的namespace属性的作用:namespace命名空间,作用是对sql进行分类化管理,理解sql隔离 注意:使用mapper代理方法                                                                             开发,namespace有特殊重要的作用

id标识映射文件中的sql,

标识为statement的id 将sql语句分装到mappedStatement的对象中

#{}标识一个占位符

parameterType指定输入参数的类型

resultType指定sql输出结果所映射的单条java对象类型

只能是单条 #{id}:中的id标识接受输入的参数,参数的名称是id

<?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">
<!--namespace命名空间,作用是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="zjc">
    <!--在映射文件里面配置sql语句-->
    <!--
    id标识映射文件中的sql,标识为statement的id
    将sql语句分装到mappedStatement的对象中
    #{}标识一个占位符
    parameterType指定输入参数的类型
    resultType指定sql输出结果所映射的单条java对象类型 只能是单条
    #{id}:中的id标识接受输入的参数,参数的名称是id
    -->
    <select id="findUserById" parameterType="Integer" resultType="User">
        select * from user where id = #{id}
    </select>
    <!--模糊查询-->
    <select id="findUserByName" parameterType="String" resultType="User">
        select * from user where username like '%${value}%'
    </select>
    <!--添加用户-->
    <insert id="insertUser" parameterType="User">
        <selectKey keyProperty="id" order="AFTER" resultType="int">
            select last_insert_id()
        </selectKey>
        insert into user(id,username,birthday,sex,address) value (#{id},#{username},#{birthday},#{sex},#{address})
    </insert>
    <!--删除用户-->
    <delete id="deletUser" parameterType="Integer">
      delete from user where id = #{id}
    </delete>
    <!--更新用户-->
    <update id="updateUser" parameterType="User">
        update user set  username = #{username},birthday = #{birthday},sex=#{sex},address = #{address} where id = #{id}
    </update>
</mapper>

 

 

5.配置文件配完了,现在开始测试

注意:获取映射文件里面某条sql语句的时候是通过namespace+id来得到的。

新建一个MybatisFirst类

//测试通过id查找用户 
@Test
    public void findUserById() throws IOException {
        //mybatis配置文件
        String respurce = "mybatis-config.xml";
        //得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(respurce);
        //创建会话工厂,传入mybatis的配置文件
        //创建会话工程,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

//以上代码是不用变得

        //通过SqlSession操作数据库
        //第一个参数是:namespace+"."+id
        User user = sqlSession.selectOne("zjc.findUserById",1);
        System.out.println(user.getSex());

        sqlSession.close();
    }
 //模糊查询
    @Test
    public void findUserByName(){
        //mybatis配置文件
        String respurce = "mybatis-config.xml";
        //得到配置文件流
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(respurce);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //创建会话工厂,传入mybatis的配置文件
        //创建会话工程,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过SqlSession操作数据库
        //第一个参数是:namespace+"."+id
        List<User> list = sqlSession.selectList("zjc.findUserByName","余");
        System.out.println(list);

        sqlSession.close();
    }

 

   //插入数据
    @Test
    public void insertUser(){
        //mybatis配置文件
        String respurce = "mybatis-config.xml";
        //得到配置文件流
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(respurce);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //创建会话工厂,传入mybatis的配置文件
        //创建会话工程,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过SqlSession操作数据库
        //第一个参数是:namespace+"."+id
        User user = new User();
        user.setUsername("孙好");
        user.setBirthday(new Date());
        user.setSex("1");
        user.setAddress("杭州");
        sqlSession.insert("zjc.insertUser",user);

        //提交事务
        sqlSession.commit();
        System.out.println(user.getId());
        sqlSession.close();
    }
 //删除用户
    @Test
    public void deleteUser(){
        //mybatis配置文件
        String respurce = "mybatis-config.xml";
        //得到配置文件流
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(respurce);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //创建会话工厂,传入mybatis的配置文件
        //创建会话工程,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过SqlSession操作数据库
        //第一个参数是:namespace+"."+id
         sqlSession.delete("zjc.deletUser",6);
         sqlSession.commit();
        sqlSession.close();
    }
  //更新用户
    @Test
    public void updateUser(){
        //mybatis配置文件
        String respurce = "mybatis-config.xml";
        //得到配置文件流
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(respurce);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //创建会话工厂,传入mybatis的配置文件
        //创建会话工程,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过SqlSession操作数据库
        //第一个参数是:namespace+"."+id
        User user = new User();
        user.setId(3);//更新的时候必须设置id
        user.setUsername("孙好");
        user.setBirthday(new Date());
        user.setSex("1");
        user.setAddress("杭州");
        sqlSession.update("zjc.updateUser",user);
        sqlSession.commit();
        sqlSession.close();
    }

全部代码:

链接:

https://github.com/1169927533/SSM_Study

https://pan.baidu.com/s/1zn13pwDcqV4RcWxpo_UIqQ 
提取码:cql0