Mybatis基础配置及使用

1、创建Project并添加Maven支持

我指里以IDEA为例来说明如何创建,如下图所示:

java mybatis yml 配置mysql链接 mybatis如何配置_数据库

然后在pom.xml文件中添加相关依赖,我们这里一共添加三个,一个mybatis、单元测试、mysql驱动,如下:

java mybatis yml 配置mysql链接 mybatis如何配置_bc_02

如此一来,mybatis环境就搭好了。

2、通过xml创建mybatis配置

在创建xml配置文件的时候,对于数据库的配置信息我们可以直接创建一个db.properties文件,然后将数据库的配置信息放入其中,如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=sang

注意,所有的配置文件我们都放在resources文件夹下(如果放错了会出现文件找不到的情况,如下图:

有了数据库配置信息,接下来我们就可以创建mybatis的配置文件了,我这里配置文件取名为mybatis-conf.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="db.properties"/>
    <typeAliases>
        <typeAlias type="org.sang.bean.User" alias="user"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <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>
        <mapper resource="userMapper.xml"/>
    </mappers>
</configuration>
3、创建Mapper

1、创建java接口

public interface UserMapper {
    public User getUser(Long id);

    public int insertUser(User user);

    public int deleteUser(Long id);
}

2、创建配置文件

在resources中创建userMapper.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="org.sang.db.UserMapper">
    <select id="getUser" resultType="user" parameterType="Long">
        select * from user where id = #{id}
    </select>
    <insert id="insertUser" parameterType="user">
        INSERT INTO user(username,password,address) VALUES (#{username},#{password},#{address})
    </insert>
    <delete id="deleteUser" parameterType="Long">
        DELETE FROM user where id=#{id}
    </delete>
</mapper>

3、配置文件说明:

1.mapper节点的namespace属性就是UserMapper接口的全路径
2.select节点的id属性就是UserMapper中的方法名称,resultType属性的值是我们在mybatis-conf.xml中定义给User类定义的别名,parameterType是指getUser方法参数的类型。

4、Mybatis组件以及执行基本流程
  • SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码生成SqlSessionFactory(工厂接口)
  • SqlSessionFactory:依靠工厂来生成SqlSession。
  • SqlSession:是一个既可以发送SQL去执行并返回结果的,也可以获取Mapper接口,通过Mapper接口查询并封装数据。
    下图表达上述组件之间的关联
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1h5CXgZd-1617674139116)(images/mybatis执行过程.jpg)]
5、select中字段映射问题

select元素用来执行一条查询语句,Select可以算作是最常用,最复杂的元素之一,我们在使用Select的时候可以自定义元素自定义结果集等,非常灵活。

<select id="getUser" resultType="user" parameterType="Long">
        select * from user where id = #{id}
    </select>

我们直接从user表中查询一条数据出来,查询的结果是一个user对象,即mybatis会自动帮我们把查询的结果转为一个user对象,那么mybatis在转化的过程中怎么知道数据库的哪个字段对应JavaBean中的哪个属性呢?很简单,只要两者的名称一样,系统就能就能自动识别出来。那么在实际开发中,JavaBean中的属性命名我们习惯于驼峰命名法,在数据库中我们更常用下划线命名法。

使用resultMap来解决

resultMap可以用来描述从数据库结果集中来加载对象,有的时候映射过于复杂,我们可以在Mapper中定义resultMap来解决映射问题,比如还是上面那个问题,我可以在userMapper中这样来定义一resultMap:

<resultMap id="userMap" type="org.sang.bean.User">
        <id property="id" column="id" javaType="long" jdbcType="NUMERIC"/>
        <result property="userName" column="user_name" javaType="string" jdbcType="VARCHAR"/>
        <result property="password" column="password" javaType="string" jdbcType="VARCHAR"/>
        <result property="address" column="address" javaType="string" jdbcType="VARCHAR"/>
    </resultMap>

关于这个resultMap,我说如下几点:

1.首先我们给resultMap加了一个id,这个id是resultMap的唯一标识符,我们在后面引用这个resultMap的时候就是通过这个id来引用,然后还定义了type属性,type属性指明了这个resultMap它对应的是哪个JavaBean。
2.在resultMap节点中,id表示哪个字段代表这主键,result节点定义了普通的映射关系,这里的property表示JavaBean中的属性名称,column表示数据库中的字段名称,javaType代表JavaBean中该属性的类型,jdbcType则表示数据库中该字段的类型。

6、insert中的主键回填

我这里简单解释下,比如我们在创建表的时候设置了表的id为自增长字段,我在Java代码中存储一条数据时先构建了一个JavaBean,这个JavaBean的id属性是为null,因为id不需要插入到数据库中去 ,那么当我将数据插入成功之后系统会自动给该对象的id属性赋值,值为刚刚插入那条数据的id,这就称作主键回填。这个在我们开发中也是非常常见的需求,我可能希望知道刚刚插入成功的数据的id是多少,而很多时候id可能都是按照某种既定规则去生成,我们在插入之前并不知晓,这种时候就可以使用主键回填。

<insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user2(user_name,password,address) VALUES (#{userName},#{password},#{address})
    </insert>

useGeneratedKeys=“true” keyProperty=“id”>
INSERT INTO user2(user_name,password,address) VALUES (#{userName},#{password},#{address})

insert节点多了一点东西,其实就多了两个东西,首先keyProperty属性指定了哪个是主键字段,useGeneratedKeys的含义则是告诉mybatis这个主键是否使用数据库内置的策略生成