Mybatis学习笔记一:Mybatis框架安装与搭建,Mybatis配置,Mybatis与Jdbc,Hibernate区别,Mybatis动态代理开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33322074/article/details/89445522

1. Mybatis学习笔记一:

1.1. jdbc缺点

  1. 需要不断地开启连接,关闭连接,代码冗余大,频繁创建连接,浪费资源。
  2. 硬编码问题。一旦sql语句改变都会变。需要重新编码。
  3. 参数传参也存在硬编码问题
  4. 处理返回的结果集,也存在硬编码问题。

mybatis架构

1.2. Mybatis安装

  1. 下载地址:https://github.com/mybatis/mybatis-3/releases
  2. 解压,获取里面的jar包
    • 需要将lib包里的jar添加到工程里,还有一个Mybatis-jar的核心包

mybatis目录图

1.3. Mabatis框架搭建

  1. 添加jar包
  2. 创建配置文件sqlMapConfig.xml,这个是主配置文件,在项目下的 config文件目录下,相当于HIbernate的hibernate.hbm.xml.
    • 其中里面配置连接数据库的内容,在引入spring后会被废除掉。由spring连接数据库。
<?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配置将废除 -->
	<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>
</configuration>
  1. 配置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
  1. 配置jdbc.properties文件

1.4. Mybatis实现增删查改操作

1.4.1. Mybatis实现通过ID名查找
  1. 加载核心配置文件
  2. 从配置文件中获取sessionFactory工厂
  3. 从sessionFactory获取一个session
  4. 通过Mapper.xml执行sql语句并传递相应的参数。
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//获取session
SqlSession sqlSession = sqlSessionFactory.openSession();
//执行sql语句
User user = sqlSession.selectOne("test.findUserById", 10);
System.out.println(user);
1.4.2. Mybatis的Mapper.xml参数配置
  1. 配置头文件
<?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">
  1. 写sql语句
    • namespace的命名空间要和java中设置参数的命名空间一致。
    • select的id是标识,用于java中的配置sql参数的定位。
    • 配置参数类型parameterType
    • 配置查询结果返回类型resultType
    • 书写sql语句,其中sql的占位符是#{}而不是*,这个是通配符。
<!-- 写Sql语句   -->
<mapper namespace="test">
    <!-- 通过ID查询一个用户 -->
    <select id="findUserById" parameterType="Integer" resultType="User">
        select * from user where id = #{v}
    </select>
</mapper>

1.5. Mybatis中#{}和${}的区别

#{}:在mybatis数据库语句中表示占位符,占位符有个特点就是自动加上’'单引号。

${}:在mybatis数据库语句中是拼接的意思,没有加上单引号。

Mybatis配置模糊查询

  1. 注意:也可以用’%${}%'作为占位符。
<select id="findUserByUsername" parameterType="String" resultType="com.it.mybatis.pojo.User">
    select * from user where username like "%"#{haha}"%"
</select>

Mybatis配置添加

  1. java文件需要提交事务,添加,修改,删除都要写上提交事务操作。
//执行Sql语句 
User user = new User();
user.setUsername("何炅");
user.setBirthday(new Date());
user.setAddress("sadfsafsafs");
user.setSex("男");
int i = sqlSession.insert("test.insertUser", user);
sqlSession.commit();
  1. 配置文件
    • 添加配置中有一个select LAST_INSERT_ID()这个操作是用来返回当前插入记录的最新id.java代码中可以通过对象.getID()的方式获取该值。
    • keyProperty的值要和实体对象中的属性值相同。
    • order值在mysql中,用after,在oracle中用Before。因为mysql一般是先插入其他值最后再塞入id.
<insert id="insertUser" parameterType="com.it.mybatis.pojo.User">
    <selectKey keyProperty="id" resultType="Integer" order="AFTER">
        select LAST_INSERT_ID()
    </selectKey>
    insert into user (username,birthday,address,sex) 
    values (#{username},#{birthday},#{address},#{sex})
</insert>

Mybatis配置更新

<update id="updateUserById" parameterType="com.it.mybatis.pojo.User">
    update user 
    set username = #{username},sex = #{sex},birthday = #{birthday},address = #{address} where id = #{id}
</update>

Mybatis配置删除

<delete id="deleteUserById" parameterType="Integer">
    delete from user where id = #{vvvvv}
</delete>

Mybatis相对于JDBC的优势

  1. 对于JDBC的频繁创建连接问题,Mybatis解决方案是在sqlMapConfig.xml中配置连接池,使用连接池管理数据库的连接。
  2. JDBC中将sql代码写在了java代码中,造成了不易维护,就是有些sql语句变换较大,需要修改java代码,而Mybatis通过Mapper.xml实现数据库语句与代码的分离,解决了频繁修改java代码的问题。
  3. JDBC中传参很麻烦,因为sql语句的where条件不一定,那么就要来回修改代码,另外参数多少不一,还要用到占位符,还必须一一对应,而使用Mybatis,自动将java对象映射 到sql语句,通过statement中的,parameterType定义输入参数的类型。
  4. JDBC对结果集解析比较麻烦,sql变化,导致解析代码的变化,且解析前需要遍历,Mybatis采取的做法是自动将sql执行结果集映射到pojo对象,通过,statement中的resultType定义输出结果的类型。

Mybatis与Hibernate的区别

  1. Mybatis不是一个完全的ORM框架,程序员需要自己写sql语句,而Hibernate不需要写sql语句,Mybatis是通过xml注解方式灵活配置要运行的sql语句,返回的结果直接映射到对象中。
  2. Mybatis学习门槛低,程序员写原生的sql语句。但是Mybatis无法做到数据库无关性,比如换成Oracle数据库,需要改动代码。Hibernate能做到数据库无关性

Mybatis动态代理开发与Mybatis的别名

为什么要实现动态代理

  1. 我们正常写dao层是通过一个接口,一个实现类完成的。每次创建实现一个方法我们都要开启一个session,唯一不同的是我们传递Mapper.xml的参数不同,说白了Mybatis框架让dao层不再由sql语句,封装了传递参数的方法和返回值,这样编程重心就由代码转到了xml配置上了。Mybatis框架对dao层的又一种封装机制,通过动态代理方式实现方法增强。
  2. 步骤分析:
    • 创建一个接口,里面包含要实现的方法。(四个原则)
    • 对Mapper.xml文件进行配置
    • 对sqlMapConfig.xml进行别名配置
    • 实现接口。
  3. 创建接口(四项原则)
    • 接口中方法名 == Mapper.xml 中 id 名
    • 返回值类型 与 Mapper.xml文件中返回值类型要一致
    • 方法的入参类型 与Mapper.xml中入参的类型要一致
    • 命名空间 绑定此接口
public User findUserById(Integer id);

<mapper namespace="com.it.mybatis.mapper.UserMapper">

  1. 对Mapper.xml进行配置
    • id要与接口中的方法名一致,返回值类型要与接口中方法名的返回值类型一致,参数类型一致。
    • 可以通过在sqlMapConfig.xml中配置别名,对路径名进行简写。
  2. 实现接口是通过类的反射机制,这个机制是Mybatis框架封装的。
    • sqlSession在Mybatis机制下帮我们实现了一个实现类。如:第九行
//加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//SqlSEssion帮我生成一个实现类  (给接口)
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(10);
System.out.println(user);

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

别名–配置在sqlMapConfig.xml

<!-- 别名 包以其子包下所有类   头字母大小都行-->
<typeAliases>
    <!-- 		<typeAlias type="com.itheima.mybatis.pojo.User" alias="User"/> -->
    <package name="com.itheima.mybatis.pojo"/>
</typeAliases>

总结

  1. 我们不用再写dao层的实现类了,我们只需要通过类的加载机制就能生成一个实现类。
  2. 我们也不必再一段一段的写那么多实现方法了,我们只需要根据接口和反射机制调用某个方法就行了,大量减少了代码。比hibernate强太多了。

Eclipse快捷键

  1. ctrl+shift+t–打开类型,它可以打开当前eclipse的工作区所有工程中所有java文件,包括jar包中的类和接口
  2. ctrl+shift+r–打开资源,它可以打开当前eclipse的工作区中所有(打开的)工程中所有类型的文件,但只限手动编写的文件,不含工程中引用到的jar包中的类、接口。
  3. Alt+shift+L–快速创建有返回值的对象。将光标放在有返回值的代码句的分号后面。在弹窗中输入变量名即可。
    快捷键
  4. ctrl+shift+o–快速添加缺少的包。
  5. fore+alt+/–创建for循环。
  6. syso+alt+/–补全打印语句。

猜你喜欢

转载自blog.csdn.net/qq_33322074/article/details/89445522