版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33322074/article/details/89445522
文章目录
1. Mybatis学习笔记一:
1.1. jdbc缺点
- 需要不断地开启连接,关闭连接,代码冗余大,频繁创建连接,浪费资源。
- 硬编码问题。一旦sql语句改变都会变。需要重新编码。
- 参数传参也存在硬编码问题
- 处理返回的结果集,也存在硬编码问题。
1.2. Mybatis安装
- 下载地址:https://github.com/mybatis/mybatis-3/releases
- 解压,获取里面的jar包
- 需要将lib包里的jar添加到工程里,还有一个Mybatis-jar的核心包
1.3. Mabatis框架搭建
- 添加jar包
- 创建配置文件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>
- 配置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
- 配置jdbc.properties文件
1.4. Mybatis实现增删查改操作
1.4.1. Mybatis实现通过ID名查找
- 加载核心配置文件
- 从配置文件中获取sessionFactory工厂
- 从sessionFactory获取一个session
- 通过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参数配置
- 配置头文件
<?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">
- 写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配置模糊查询
- 注意:也可以用’%${}%'作为占位符。
<select id="findUserByUsername" parameterType="String" resultType="com.it.mybatis.pojo.User">
select * from user where username like "%"#{haha}"%"
</select>
Mybatis配置添加
- 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();
- 配置文件
- 添加配置中有一个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的优势
- 对于JDBC的频繁创建连接问题,Mybatis解决方案是在sqlMapConfig.xml中配置连接池,使用连接池管理数据库的连接。
- JDBC中将sql代码写在了java代码中,造成了不易维护,就是有些sql语句变换较大,需要修改java代码,而Mybatis通过Mapper.xml实现数据库语句与代码的分离,解决了频繁修改java代码的问题。
- JDBC中传参很麻烦,因为sql语句的where条件不一定,那么就要来回修改代码,另外参数多少不一,还要用到占位符,还必须一一对应,而使用Mybatis,自动将java对象映射 到sql语句,通过statement中的,parameterType定义输入参数的类型。
- JDBC对结果集解析比较麻烦,sql变化,导致解析代码的变化,且解析前需要遍历,Mybatis采取的做法是自动将sql执行结果集映射到pojo对象,通过,statement中的resultType定义输出结果的类型。
Mybatis与Hibernate的区别
- Mybatis不是一个完全的ORM框架,程序员需要自己写sql语句,而Hibernate不需要写sql语句,Mybatis是通过xml注解方式灵活配置要运行的sql语句,返回的结果直接映射到对象中。
- Mybatis学习门槛低,程序员写原生的sql语句。但是Mybatis无法做到数据库无关性,比如换成Oracle数据库,需要改动代码。Hibernate能做到数据库无关性 。
Mybatis动态代理开发与Mybatis的别名
为什么要实现动态代理
- 我们正常写dao层是通过一个接口,一个实现类完成的。每次创建实现一个方法我们都要开启一个session,唯一不同的是我们传递Mapper.xml的参数不同,说白了Mybatis框架让dao层不再由sql语句,封装了传递参数的方法和返回值,这样编程重心就由代码转到了xml配置上了。Mybatis框架对dao层的又一种封装机制,通过动态代理方式实现方法增强。
- 步骤分析:
- 创建一个接口,里面包含要实现的方法。(四个原则)
- 对Mapper.xml文件进行配置
- 对sqlMapConfig.xml进行别名配置
- 实现接口。
- 创建接口(四项原则)
- 接口中方法名 == Mapper.xml 中 id 名
- 返回值类型 与 Mapper.xml文件中返回值类型要一致
- 方法的入参类型 与Mapper.xml中入参的类型要一致
- 命名空间 绑定此接口
public User findUserById(Integer id);
<mapper namespace="com.it.mybatis.mapper.UserMapper">
- 对Mapper.xml进行配置
- id要与接口中的方法名一致,返回值类型要与接口中方法名的返回值类型一致,参数类型一致。
- 可以通过在sqlMapConfig.xml中配置别名,对路径名进行简写。
- 实现接口是通过类的反射机制,这个机制是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>
总结
- 我们不用再写dao层的实现类了,我们只需要通过类的加载机制就能生成一个实现类。
- 我们也不必再一段一段的写那么多实现方法了,我们只需要根据接口和反射机制调用某个方法就行了,大量减少了代码。比hibernate强太多了。
Eclipse快捷键
- ctrl+shift+t–打开类型,它可以打开当前eclipse的工作区所有工程中所有java文件,包括jar包中的类和接口
- ctrl+shift+r–打开资源,它可以打开当前eclipse的工作区中所有(打开的)工程中所有类型的文件,但只限手动编写的文件,不含工程中引用到的jar包中的类、接口。
- Alt+shift+L–快速创建有返回值的对象。将光标放在有返回值的代码句的分号后面。在弹窗中输入变量名即可。
- ctrl+shift+o–快速添加缺少的包。
- fore+alt+/–创建for循环。
- syso+alt+/–补全打印语句。