mybatis学习笔记(2)-入门实例

目标

  • 使用mybatis完成对单个表的CRUD操作

步骤

使用idea新建一个maven项目,这个相信大家都会,就不啰嗦了。

配置pom.xml文件

<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
    </dependencies>

mybatis配置文件:

    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"></setting>
    </settings>
    <!-- 和spring整合后 environments配置将废除-->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理,事务控制由mybatis-->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池,由mybatis管理-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis001?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
    <!-- 加载映射文件-->
    <mappers>
        <mapper resource="mapper/User.xml"/>
    </mappers>

其中这一段配置能将mybatis的sql语句执行过程打印在控制台上,方便debug,具体截图后面有

<settings>
   <setting name="logImpl" value="STDOUT_LOGGING"></setting>
</settings>

log4j.properties配置文件:

# Global logging configuration
log4j.rootLogger=ERROR,WARN,INFO,DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#配置日志信息的布局格式
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

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

User.xml配置

<!-- namespace 命名空间,作用就是对sql进行分类化管理,理解为sql隔离
 注意:使用mapper代理方法开发,namespace有特殊重要的作用
 -->
<mapper namespace="test">
    <!-- 在映射文件中配置很多sql语句 -->
    <!--需求:通过id查询用户表的记录 -->
    <!-- 通过select执行数据库查询
     id:标识映射文件中的sql,称为statement的id
     将sql语句封装到mappedStatement对象中,所以将id称为statement的id
     parameterType:指定输入参数的类型
     #{}标示一个占位符,
     #{value}其中value表示接收输入参数的名称,如果输入参数是简单类型,那么#{}中的值可以任意。

     resultType:指定sql输出结果的映射的java对象类型,select指定resultType表示将单条记录映射成java对象
     -->
    <select id="findUserById" parameterType="int" resultType="com.will.entiy.User">
        SELECT * FROM  user  WHERE id=#{value}
    </select>

    <!-- 根据用户名称模糊查询用户信息,可能返回多条
    resultType:指定就是单条记录所映射的java对象类型
    ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
    使用${}拼接sql,引起 sql注入
    ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
     -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.will.entiy.User">
        SELECT * FROM user WHERE username LIKE '%${value}%'
    </select>


</mapper>

最后测试类:

@Test
    public void findUserByIdTest() throws IOException {
        // mybatis配置文件
        String resource = "mybatis-config.xml";
        // 得到配置文件流
        InputStream inputStream =  Resources.getResourceAsStream(resource);
        //创建会话工厂,传入mybatis配置文件的信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 通过SqlSession操作数据库
        // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
        // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
        // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
        // selectOne查询出一条记录
        User user = sqlSession.selectOne("test.findUserById", 1);
        System.out.println(user);
        // 释放资源
        sqlSession.close();
    }

    @Test
    public void findUserByNameTest() throws IOException {
        // mybatis配置文件
        String resource = "mybatis-config.xml";
        // 得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        // 创建会话工厂,传入mybatis的配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
        // 通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // list中的user和映射文件中resultType所指定的类型一致
        List<User> list = sqlSession.selectList("test.findUserByName", "小明");
        System.out.println(list);
        sqlSession.close();
    }

哦,对了,还有一个实体类,用户实体

public class User {
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
    。。。。。//getter,setter方法省略
    }

使用单元测试,结果如下:
这里写图片描述

总结

  • MyBatis将SQL语句放在映射配置文件中,而不是放在Java代码中编写,这样有利于程序维护,本文只演示了CRUD中的查询操作,后续文章会使用其他方式完善其他功能。在配置文件中通过标签来实现查询功能,SQL语句和相关配置信息也写在标签体内,增、删、改则可分别通过< insert>、< delete>、< update>标签来完成,与查询操作类似,此处不加以赘述。
  • 对于查询操作而言,在Java测试代码中,如果查询的结果是单个的,则使用SqlSession会话提供的selectOne方法来调用SQL语句,如果查询的结果是多个的,则应使用selectList方法。且查询结果为多个时,配置文件中的resultType值应为单条记录所映射的Java对象类型,而不是List类型。
  • #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
    如果接收简单类型,#{}中可以写成value或其它名称。
    {}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。

猜你喜欢

转载自blog.csdn.net/lin74love/article/details/80911253
今日推荐