MyBatis入门案例演示

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/shunli008/article/details/100179916

官方文档:http://www.mybatis.org/mybatis-3/zh/index.html

1.引入jar包

2.配置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配置,用于加载外部的配置文件
    -->
    <properties resource="db.properties"/>
    <!--
    environments 主要用于进行数据源的配置
    可以配置多个数据源  通过default属性来指定当前项目运行过程中使用的是哪个数据源
    -->
    <environments default="development">
        <!--environment配置一个独立数据源-->
        <environment id="development">
            <!--transactionManager用于配置事务管理器,默认使用JDBC-->
            <transactionManager type="JDBC"/>
            <!--dataSource数据源的连接信息 type属性用于指定是否使用连接池-->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        <environment id="product">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--
    mappers 配置外部的映射配置文件路径
    在主配置中需要引入加载映射配置文件
    D:\eclipse_workspace1\selection_course\src\main\resources\mapper\usersMapper.xml
    -->
    <mappers>
        <mapper resource="mapper/usersMapper.xml"/>
    </mappers>
</configuration>

数据库相关的信息配置在db.properties中,通过引入外部的配置文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root

这个地方映射了配置文件usersMapper.xml,配置下这个文件,里面的sql配置可以参考官方文档,
这里列举了select和insert,其中select使用到了一个resultMap 的映射,
insert时,id是自增主键,使用useGeneratedKeys=“true” keyProperty="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 命名空间 主要进行session级别的缓存管理 一般是实体类的全路径
-->
<mapper namespace="com.shunli.entity.Users">
    <select id="findUsers"   resultMap="forUsers">
        select * from users where 1 = 1
        <if test="id != null">
            and id = #{id}
        </if>
    </select>

    <!--自定义映射关系集合:主要包含对于一些自定义操作的配置,如不一致的属性和字段-->
    <resultMap id="forUsers" type="com.shunli.entity.Users">
        <!--配置主键不一致的情况-->
        <!--<id column="" property="">-->

        <!--result配置:主要配置普通属性, column配置数据库字段名称 property配置实体类的属性名称-->
        <result column="username" property="name"/>
    </resultMap>

    <sql id="user_fields">
        username, userpass, nickname, age, gender, email, telnum, createdate, statusdate, lastlogin, status, remark
    </sql>
    <insert id="addUsers" useGeneratedKeys="true" keyProperty="id">
        insert into users(<include refid="user_fields"></include>)
        values (#{username}, #{userpass}, #{nickname}, #{age}, #{gender}, #{email}, #{telnum}, #{createdate},
                #{statusdate}, #{lastlogin}, #{status}, #{remark})
    </insert>

</mapper>

配置实体类

package com.shunli.entity;

import java.util.Date;

/**
 * @author shunli
 */
public class Users {
    private Integer id;
    private String username;
    private String name;
    private String userpass;
    private String nickname;
    private Integer age;
    private String gender;
    private String telnum;
    private String email;
    private int status;
    private Date statusdate;
    private Date createdate;
    private Date lastlogin;
    private String remark;

    public Users() {
    }

    public Users(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpass() {
        return userpass;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setUserpass(String userpass) {
        this.userpass = userpass;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getTelnum() {
        return telnum;
    }

    public void setTelnum(String telnum) {
        this.telnum = telnum;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public Date getStatusdate() {
        return statusdate;
    }

    public void setStatusdate(Date statusdate) {
        this.statusdate = statusdate;
    }

    public Date getCreatedate() {
        return createdate;
    }

    public void setCreatedate(Date createdate) {
        this.createdate = createdate;
    }

    public Date getLastlogin() {
        return lastlogin;
    }

    public void setLastlogin(Date lastlogin) {
        this.lastlogin = lastlogin;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    @Override
    public String toString() {
        return "Users{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", name='" + name + '\'' +
                ", userpass='" + userpass + '\'' +
                ", nickname='" + nickname + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", telnum='" + telnum + '\'' +
                ", email='" + email + '\'' +
                ", status=" + status +
                ", statusdate=" + statusdate +
                ", createdate=" + createdate +
                ", lastlogin=" + lastlogin +
                ", remark='" + remark + '\'' +
                '}';
    }

    public Users(String username, String userpass, String nickname, Integer age, String gender, String telnum, String email, int status, Date statusdate, Date createdate, Date lastlogin, String remark) {
        this.username = username;
        this.userpass = userpass;
        this.nickname = nickname;
        this.age = age;
        this.gender = gender;
        this.telnum = telnum;
        this.email = email;
        this.status = status;
        this.statusdate = statusdate;
        this.createdate = createdate;
        this.lastlogin = lastlogin;
        this.remark = remark;
    }
}

使用前介绍几个类(官方文档上的介绍)
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在,以保证所有的 XML 解析资源可以被释放给更重要的事情。

SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。 换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。 这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。 下面的示例就是一个确保 SqlSession 关闭的标准模式:

demo演示

package com.shunli.utils;

import com.shunli.entity.Users;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Test {
    private  static String RESOURCE = "mybatis_config.xml";
    private static SqlSessionFactory sqlSessionFactory; //旦被创建就应该在应用的运行期间一直存在
    private SqlSession sqlSession;

    @org.junit.Test
    public void demo1(){
        try {
            InputStream inputStream = Resources.getResourceAsStream(RESOURCE);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            sqlSession = sqlSessionFactory.openSession();
            List<Users> list = sqlSession.selectList("findUsers");
            sqlSession.close();
            System.out.println(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/shunli008/article/details/100179916