Mybatis入门详解

1 为什么学Mybatis?

2 JDBC编程回顾与存在的问题分析

2.1 开发步骤

2.2 Jdbc访问数据库的过程

2.3 Jdbc存在的问题

3 Mybatis介绍

4 Mybatis入门

4.1 需求列表

4.2 工程搭建

4.3 完成需求

4.3.1 完成需求步骤

4.3.2 根据用户ID查询用户信息

4.3.2.1 映射文件与sql
4.3.2.2 MyBatis访问数据库代码

4.3.3 抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程

4.3.4 根据用户名查找用户列表

4.3.4.1 映射文件与sql
4.3.4.2 MyBatis访问数据库代码

4.3.5 添加用户

4.3.5.1 映射文件与sql
4.3.5.2 MyBatis访问数据库代码
4.3.5.3 Mysql自增返回

4.3.6 修改用户

4.3.7 删除用户

4.4 Mybatis入门小结与Mybatis架构图

1.为什么学Mybatis?

  • 目前最主流的持久层框架为hibernate与mybatis,而且国内目前情况使用Mybatis的公司比hibernate要多。
  • Hibernate学习门槛不低,要精通门槛更高。门槛高在怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate缓存与数据加载策略方面需要你的经验和能力都很强才行。国内目前前的情况精通hibernate技术大牛非常少。
  • sql优化方面,Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。当然了,Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。说得更深入一些,如果有个查询要关联多张表,比如5张表,10张表时,而且,我们要取的字段只是其中几张表的部分字段。这时用hibernate时就会显得非常力不从心。就算用hibernate的sqlquery,后续的维护工作也会让人发狂。

2.JDBC编程回顾与存在的问题分析

2.1 开发步骤
  • 导入数据脚本
  • 创建工程,导入mysql的jar包
  • 编写代码
2.2 JDBC访问数据库过程
  • 加载数据库驱动
  • 创建数据库连接
  • 创建statement
  • 设置sql语句
  • 设置查询参数
  • 执行查询,得到ResultSet
  • 解析结果集ResultSet
  • 释放资源
2.3 JDBC存在的问题
  • 多次创建和打开、关闭数据库连接、消耗大量资源
  • SQL语句存在硬编码,不利于维护
  • SQL参数设置硬编码,不利于维护
  • 结果集获取与遍历复杂,存在硬编码,不利于维护

3.Mybatis 介绍

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
Mybatis是面向sql的持久层框架,他封装了jdbc访问数据库的过程,我们开发,只需专注于sql语句本身的拼装,其它复杂的过程全部可以交给mybatis去完成。

4.Mybatis 入门

4.1 Mybatis 需求列表

  • 根据用户ID查询用户信息
  • 根据用户名查找用户列表
  • 添加用户
  • 修改用户
  • 删除用户

4.2 Mybatis 工程搭建

<?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>
    <!--环境配置-->
    <!--默认环境-->

    <environments default="development">
        <!--mysql环境-->
        <environment id="development">
            <!--JDBC事务-->
            <!-- 使用JDBC管理事务-->
            <transactionManager type="JDBC"/>
            <!--POOLED连接池-->
            <!--数据库连接池 -->
            <dataSource type="POOLED">
                <!--四大参数-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis_01?characterEncoding=utf-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
  • 配置log4j.properties
# 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

  • 复制pojo到工程目录下(pojo下有两个java类。User和Order类)这里就直接把写好的类复制进去了,资源链接

链接:https://pan.baidu.com/s/1_d3sateMC92c2qTIyIdwEQ
提取码:hpwm

  • 配置sql查询的映射文件

  • 加载映射文件,在SqlMapConfig.xml中添加

<!--    加载映射文件-->
    <mappers>
        <mapper resource="user.xml"/>
    </mappers>

4.3 完成需求

4.3.1 需求完成步骤
  • 编写SQL语句
  • 配置user映射文件
  • 编写测试程序
4.3.2 根据用户ID查询用户信息
4.3.2.1 映射文件与SQL

user.xml里添加

<!-- id:statementId
		 resultType:查询结果集的数据类型
		 parameterType:查询的入参
	-->
	<select id="getUserById" parameterType="int" resultType="com.lpp.mybatis.pojo.User" >
		SELECT * FROM USER WHERE id = #{id1}
	</select>

4.3.2.2 MyBatis访问数据库代码

测试

@Test
	public void testGetUserById() throws IOException {
		// 创建SqlSessionFactoryBuilder对象
		SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
		// 查找配置文件创建输入流
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
			// 加载配置文件,创建SqlSessionFactory对象
		SqlSessionFactory	sqlSessionFactory = sfb.build(inputStream);
		// 创建SqlSession对象
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 执行查询,参数一:要查询的statementId ,参数二:sql语句入参
		User user = sqlSession.selectOne("user.getUserById", 2);
		// 输出查询结果
		System.out.println(user);
		// 释放资源
		sqlSession.close();
	}


4.3.3 抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程

public class SqlSessionFactoryUtils {
	
	private static SqlSessionFactory sqlSessionFactory;

	static {
		// 创建SqlSessionFactoryBuilder对象
		SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
		try {
			// 查找配置文件创建输入流
			InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
			// 加载配置文件,创建SqlSessionFactory对象
			sqlSessionFactory = sfb.build(inputStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static SqlSessionFactory getSqlSessionFactory() {
		return sqlSessionFactory;
	}
}

4.3.4 根据用户名查找用户列表

4.3.4.1 映射文件与sql

user.xml里添加

<!-- resultType:如果要返回数据集合,只需设定为每一个元素的数据类型 -->
	<select id="getUserByName" parameterType="string" resultType="com.lpp.mybatis.pojo.User">
		SELECT * FROM USER WHERE username LIKE #{name}
	</select>

4.3.4.2 MyBatis访问数据库代码

测试

@Test
	public void getUserByName() {
		SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
		List<User> users = sqlSession.selectList("user.getUserByName", "%张%");
		for (User user : users) {
			System.out.println(user);
		}

		// 释放资源
		sqlSession.close();
	}

4.3.5 添加用户

4.3.5.1 映射文件与sql

user.xml里添加

<!--  插入用户-->
    <!-- useGeneratedKeys:使用自增,keyProperty与之配套使用,这里是user的主键-->
    <insert id="insertUser" parameterType="pojo.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(username,birthday,sex,address)values ( #{username},#{birthday},#{sex},#{address});
    </insert>

4.3.5.2 MyBatis访问数据库代码

测试

 @Test
    public void testInsertUser(){
        SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
       User user=new User();
       user.setUsername("Linda");
        user.setBirthday(new Date());
       user.setSex("1");
       user.setAddress("浙江宁波");
       sqlSession.insert("User.insertUser",user);
       //提交事务
        sqlSession.commit();
        sqlSession.close();
    }
4.3.5.3 Mysql自增返回
<!-- useGeneratedKeys:标识插入使用自增id
		 keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性
	 -->
	 <insert id="insertUserKey" parameterType="com.lpp.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
	 	<!-- selectKey:用于配置主键返回
	 		 keyProperty:要绑定的pojo属性
	 		 resultType:属性数据类型
	 		 order:指定什么时候执行,AFTER之后
	 	-->


		<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
			 SELECT LAST_INSERT_ID()
		</selectKey> -->
        insert into user(username,birthday,sex,address)values ( #{username},#{birthday},#{sex},#{address});
    </insert>


4.3.6 修改用户

user.xml里添加

<!--更新用户-->
    <update id="updateUser" parameterType="pojo.User">
        update user set username =#{username} where id=#{id};
    </update>

测试

 @Test
    public void testUpdate(){
        SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
        User user=new User();
        user.setId(31);
        user.setUsername("张婉清");
        //user.setSex("2");
       // user.setAddress("上海");
        sqlSession.update("User.updateUser",user);
        sqlSession.commit();
        sqlSession.close();
    }

4.3.7 删除用户

user.xml里添加


   <!-- 删除用户-->
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
</delete>

测试

 @Test
    public void testDeleteUser(){
        SqlSession sqlSession=SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
        User user=new User();
        user.setId(30);
        sqlSession.delete("User.deleteUser",user);
        sqlSession.commit();
        sqlSession.close();
    }

注:user.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命名空间-->
<mapper namespace="User">

    <select id="getUserById" parameterType="int" resultType="com.lpp.mybatis.pojo.User">
    SELECT id,username,birthday,sex,address FROM user where id=#{id};
</select>

    <!--如果返回结果为集合:只需设置为每一个的数据类型-->
    <select id="getUserByUserName" parameterType="String" resultType="com.lpp.mybatis.pojo.User">
        SELECT id,username,birthday,sex,address  FROM user WHERE username LIKE #{name};
    </select>
    <!--  插入用户-->
    <!-- useGeneratedKeys:使用自增,keyProperty与之配套使用,这里是user的主键-->
    <insert id="insertUser" parameterType="com.lpp.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
        insert into user(username,birthday,sex,address)values ( #{username},#{birthday},#{sex},#{address});
    </insert>

    <!--更新用户-->
    <update id="updateUser" parameterType="com.lpp.mybatis.pojo.User">
        update user set username =#{username} where id=#{id};
    </update>

   <!-- 删除用户-->
    <delete id="deleteUser" parameterType="int">
        delete from user where id=#{id}
</delete>

</mapper>

我使用的工具是IDEA,把jar包放到lib下lib文件夹下,并导入到项目中

在这里插入图片描述

4.4 Mybatis入门小结与Mybatis架构图

在这里插入图片描述

发布了8 篇原创文章 · 获赞 12 · 访问量 205

猜你喜欢

转载自blog.csdn.net/weixin_44228113/article/details/104320746
今日推荐