Mybatis学习

Posted miantiao312

tags:

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

1、Mybatis入门Demo实践

A、根据用户id查询一个用户信息
B、根据用户名称模糊查询用户信息列表

2、搭建Java工程

A、加入mybatis核心包、依赖包、数据驱动包

B、在classpath下创建log4j.properties(mybatis默认使用log4j作为输出日志信息)

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # 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

C、在classpath下创建SqlMapConfig.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>
        <!-- 和spring整合后 environments配置将废除
             SqlMapConfig.xml是mybatis核心配置文件,下边文件的配置内容为数据源、事务管理
        -->
        <environments default="development">
            <environment id="development">
                <!-- 使用jdbc事物管理 -->
                <transactionManager type="JDBC"/>
                <!-- 数据库连接池 -->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>   
            </environment>
        </environments>
        
        <!-- 加载映射文件,将Users.xml添加在SqlMapConfig.xml -->
        <mappers>
            <mapper resource="sqlmap/User.xml"/>
        </mappers>
    </configuration>        

D、pojo类

    public class User {

        private int id;
        private String username;
        private String sex;
        private Date birthday;
        private String address;
        
        getter/seetter方法省略
    }

E、在classpath下的sqlmap目录下创建sql映射文件Users.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">

    <!-- 
        namespace是命名空间,作用sql语句的隔离,后面还有重要作用 
        #{}作用就是占位符,相当于jdbc的“?”
        parameterType:查询的参数类型
        定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
        resultType:查询结果的数据类型,如果是pojo应该给全路径。
    -->
    <mapper namespace="test">
        <!-- 通过用户id获取用户 -->
        <select id="getUserById" parameterType="int" resultType="com.kid.mybatis.pojo.User">
            select * from user where id = #{id}
        </select>
        
        <!-- 通过用户名模糊查询用户 -->
        <select id="getUserByUsername" parameterType="string" resultType="com.kid.mybatis.pojo.User">
            <!-- ${value}表示使用参数将${value}替换,做字符串的拼接。
                  注意:如果是取简单数量类型的参数,括号中的值必须为value
             -->
            select * from user where username like ‘%${value}%‘
        </select>
        
        <!-- 添加用户 -->
        <insert id="insertUser" parameterType="com.kid.mybatis.pojo.User">
            insert into user(username,birthday,sex,address) 
            value(#{username},#{birthday},#{sex},#{address})
        </insert>
    </mapper>

F、加载映射文件:mybatis框架需要加载映射文件,将Users.xml添加在SqlMapConfig.xml

    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>

G、测试代码

    package com.kid.mybatis.first;

    import java.io.InputStream;
    import java.util.Date;
    import java.util.List;
    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 org.junit.Before;
    import org.junit.Test;
    import com.kid.mybatis.pojo.User;

    public class MybatisTest {
        
        //创建会话工厂
        private SqlSessionFactory sqlSessionFactory = null;
        
        @Before
        public void createSqlSessionFactory() throws Exception {
            //第一步:创建一个SQLSessionFactoryBuilder对象。
            SqlSessionFactoryBuilder sessionFactoryBuilder=new SqlSessionFactoryBuilder();
            //第二步:加载配置文件。
            InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
            //第三步:创建SQLSessionFactory对象
            sqlSessionFactory = sessionFactoryBuilder.build(inputStream);
        }
        
        @Test   //根据用户id获取用户
        public void getUserByIdTest() {
            // 数据库会话实例
            SqlSession sqlSession = null;
            try {
                // 创建数据库会话实例sqlSession
                sqlSession = sqlSessionFactory.openSession();
                // 查询单个记录,根据用户id查询用户信息
                User user = sqlSession.selectOne("getUserById", 10);
                System.out.println(user);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if (sqlSession != null) {
                    sqlSession.close();
                }
            }
        }
        
        @Test   //通过用户名查询用户
        public void findUserByUsernameTest() {
            // 数据库会话实例
            SqlSession sqlSession = null;
            try {
                // 创建数据库会话实例sqlSession
                sqlSession = sqlSessionFactory.openSession();
                //进行查询
                List<User> list=sqlSession.selectList("getUserByUsername","张");
                for (User user : list) {
                    System.out.println(user);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                //释放资源
                sqlSession.close();
            }   
        }
        
        @Test   //添加用户信息
        public void insertTest() {
            // 数据库会话实例
            SqlSession sqlSession = null;
            try {
                // 创建数据库会话实例sqlSession
                sqlSession = sqlSessionFactory.openSession();
                //创建User对象
                User user = new User();
                user.setUsername("小乔");
                user.setBirthday(new Date());
                user.setSex("2");
                user.setAddress("上海");
                //插入数据
                sqlSession.insert("insertUser",user);
                System.out.println(user.getId());
                //提交事务
                sqlSession.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                sqlSession.close();
            }
        }
    }

3、小结

    A、#{}和${}
    
    #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。  
    #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

    ${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,  
    ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

    B、parameterType和resultType
    
    parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
    resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。
    
    C、selectOne和selectList
    
    selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:
    org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)

    selectList可以查询一条或多条记录。

4、Demo结构图

技术分享图片

以上是关于Mybatis学习的主要内容,如果未能解决你的问题,请参考以下文章

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

Mybatis 学习笔记总结

Mybatis学习笔记:动态SQL

SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法