2.Mybatis基本使用(三种方式)

本文详细介绍了Mybatis的基本使用步骤,包括通过Resources.getResourceAsStream加载配置文件,构建SqlSessionFactory,创建SqlSession,以及通过Mapper接口或XML配置执行SQL操作。同时,对比了不使用Mapper接口、使用Mapper接口和使用注解的不同方式,推荐使用Mapper接口进行开发。
摘要由CSDN通过智能技术生成

目录


Mybatis专栏目录(点击进入…)



Mybatis执行流程

1.通过Resources.getResourceAsStream加载xml文件,将配置文件解析为一个流

String resource = "sqlMapConfig.xml"; // 文件名
InputStream is = Resources.getResourceAsStream(resource); //获取文件的输入流

2.SqlSessionFactoryBuilder.build()完成对配置文件的读取,构建SqlSessionFactory会话工厂

SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);

3.通过SqlSessionFactory创建SqlSession

SqlSession sqlSession = build.openSession();

4.通过mapper文件的namespace和子元素的id来找到相应的SQL,从而执行查询操作

// ①:不使用接口
sqlSession.selectList("user.findUserById", "name like '曹%'");

// ②:使用mapper接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getFindUser(10);
session.commit();

5.关闭SqlSession对象

openSession.close();

Myabtis详细使用

(1)不使用Mapper接口(传统,少用)

1.导入Jar包

2.配置mybatis-config.xml核心配置文件

<configuration> 
    <settings>
        <!-- 打印查询语句 -->
        <setting name="logImpl" value="STDOUT_LOGGING" />
	</settings>
    <!-- 和Spring整合后environment配置都会被干掉 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理,目前由mybatis来管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池,目前由mybatis来管理 -->
            <dataSource type="POOLED"><!--有关于mysql数据库的各种信息-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--将操作配置文件User.xml系添加进mapper-->
        <mapper resource="mybatis/user.xml" />
	</mappers>
</configuration>

3.实体类

public class User {
	private String id;
	private String password;
	private String username;
    //省略getter/setter方法
}

4.实体对应的Mapper映射XML文件

<!-- 注意:因为这边没有用到mapper接口,所以这里的namespace不需要是完全的类名 -->
<mapper namespace="user"> 
    <!-- 通过id查询用户 -->
    <select id="findUserById" parameterType="int" resultType="com.mvc.User">
        <include refid="selectStr"/> id = #{id}
    </select>
    
    <!--通过name查找一个list的用户,模糊匹配-->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.mvc.User">
        select * from user where name like '%${value}%'
    </select>
    
    <!--插入用户信息-->
    <insert id="insertUser" parameterType="com.mvc.User">
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            select uuid()   <!-- 这里是对于主键属性的id进行赋值 -->
        </selectKey>
        insert into user(id,username,password) values(#{id},#{username},#{password})
    </insert>
    <!--删除用户信息-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>
    
    <!--更新用户信息-->
    <update id="updateUser" parameterType="com.mvc.User">
        <!-- update user set name=#{name},password=#{password} where id=#{id} -->
        update user
        <set>
            <if test="username != null && username != ''">username=#{username},</if>
            <if test="password != null && password != ''">password=#{password},</if>
        </set>
        where id= #{id}
	</update>
</mapper>

5.创建SqlSession工具类

(1)SqlSessionFactoryBuilder

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

(2)SqlSessionFactory

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

(3)SqlSession

每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的范围是请求或方法范围
绝对不能将SqlSession实例的引用放在一个类的静态域(静态变量),甚至一个类的实例变量也不行。也绝不能将SqlSession实例的引用放在任何类型的管理范围中

比如:Serlvet架构中的HttpSession。如果现在正在使用一种Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围中。换句话说,每次收到的HTTP请求,就可以打开一个SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,应该把这个关闭操作放到finally块中以确保每次都能执行关闭

public class MybatisSessionUtil {
    static SqlSessionFactory sqlSessionFactory = null;
    
    static {
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        try {
            sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream(”mybatis-config.xml”));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }   
}

6.Dao层(合并了实现类)

public class UserDao {
    SqlSession session = MybatisSessionUtil.getSession();
    
	public int insert(User user){
		// 第一个参数是mapper xml里的namespace+MappedStatement对应的id
        int rint = session.insert("user.insertUser",user); 
        session.commit();  // 不要忘记提交
        return rint;
    }
}

(2)使用Mapper接口(推荐使用)

该方式开发,不需要写dao层的实现类,而是mybatis根据映射文件等信息对接口进行jdk动态代理生成代理类来实现接口中的方法,因此,采用这种方式,只需要编辑接口,而不需要去写实现

开发代理规范
①mapper接口的全限定名要和mapper映射文件的namespace值一致
②mapper接口的方法名称要和mapper映射文件的statement的id一致
③mapper接口的方法参数类型要和mapper映射文件的statement的parameterType的值一致,而且它的参数是一个
④mapper接口的方法返回值类型要和mapper映射文件的statement的resultType的值一致

1.导入jar包(同上)

2.配置mybatis-config.xml核心配置文件(同上)

3.实体类(同上)

4.Mapper接口(多个)

// 接口名要和xml映射的文件名一致
public interface UserMapper {
    int insertUser(User user);
    // 其它方法略...
}

5.实体对应Mapper配置XML文件

<!-- 这边的namespace一定要写完整正确(Mapper接口全限定类名) -->
<mapper namespace="com.mybatis.mapper.UserMapper">
    <!-- 通过id查询用户 -->
    <select id="findUserById" parameterType="int" resultType="com.mvc.User">
        select * from user where id = #{id}
    </select>
    <!--通过name查找一个list的用户,模糊匹配-->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.mvc.User">
        select * from user where name like '%${value}%'
    </select>
    <!--插入用户信息-->
    <insert id="insertUser" parameterType="com.mvc.User">
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
            select uuid()         <!--  这里是对于主键属性的id进行赋值 -->
        </selectKey>
        insert into user(id,username,password) values(#{id},#{username},#{password})
    </insert>
    <!--删除用户信息-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>
    <!--更新用户信息-->
    <update id="updateUser" parameterType="com.mvc.User">
        update user set name=#{name},password=#{password} where id=#{id}
	</update>
</mapper>

6.获取SqlSession工具类(同上)

7.测试

public class UserDao {
    SqlSession session = MybatisSessionUtil.getSession();
    // 使用接口方式
    public int insert2(User user){
        UserMapper userMapper = session.getMapper(UserMapper.class);
        int rint = userMapper.insertUser(user);
        session.commit();
        return rint;
    }
}

(3)注解(不推荐使用)

使用mybatis强大的sql编写功能,在注解里是受到限制的,只有写在mapper.xml里才能发挥的淋漓尽致。myatis官方也不推荐。

@Delete、@Update、@Insert、@Select

MyBatis提供了4种Provider注解,分别是@SelectProvider、@InsertProvider、@UpdateProvider和@DeleteProvider

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未禾

您的支持是我最宝贵的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值