当前位置: 首页 > news >正文

【MyBatis从入门到入土】告别JDBC原始时代:零基础MyBatis极速上手指南

在这里插入图片描述

👨‍💻程序员三明治:个人主页

🔥 个人专栏: 《设计模式精解》 《重学数据结构》

🤞先做到 再看见!

Mybatis-01

1. 框架

​ 框架相当于是一个脚手架,内部已经写好了很多代码,我们只要其基础上进行开发就可以提高我们的开发效率。

框架阶段学习:

①先去学习如何使用框架

②然后再使用熟练的情况下去猜测内部的原理

③通过源码去验证自己的猜测。

2.Mybatis介绍

  • MyBatis 是一款优秀的持久层框架。

  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

  • 官网:https://mybatis.org/mybatis-3/zh/#

在这里插入图片描述

3. 快速入门

①数据准备

CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis_db` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `mybatis_db`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(50) DEFAULT NULL,`age` int(11) DEFAULT NULL,`address` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert  into `user`(`id`,`username`,`age`,`address`) values (1,'UZI',19,'上海'),(2,'PDD',25,'上海');

②导入依赖

        <!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency>

③编写核心配置

在资源目录下创建:mybatis-config.xml 内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/sangeng/dao/UserDao.xml"/></mappers>
</configuration>

④定义接口及对应的xml映射文件

com.sangeng.dao.UserDao:

public interface UserDao {List<User> findAll();
}

资源目录下:com/sangeng/dao/UserDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sangeng.dao.UserDao"><select id="findAll" resultType="com.sangeng.pojo.User">select * from user</select>
</mapper>

⑤编写测试类

获取SqlSession,通过SqlSession获取UserDao调用对应的方法

    public static void main(String[] args) throws IOException {//定义mybatis配置文件的路径String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取Sqlsession对象SqlSession sqlSession = sqlSessionFactory.openSession();//获取UserDao实现类对象UserDao userDao = sqlSession.getMapper(UserDao.class);//调用方法测试List<User> userList = userDao.findAll();System.out.println(userList);//释放资源sqlSession.close();}

3.9 高效编程

3.9.1 配置代码模板

在这里插入图片描述

3.9.2 Mybatis插件

​ 下载安装Free Mybatis plugin,安装完后重启IDEA
在这里插入图片描述

4. 参数获取

4.1 一个参数

4.1.1 基本参数

​ 我们可以使用#{}直接来取值,写任意名字都可以获取到参数。但是一般用方法的参数名来取。

例如:

接口中方法定义如下

User findById(Integer id);

xml中内容如下:

<select id="findById" resultType="com.sangeng.pojo.User">  select * from user where id = #{id}</select>
4.1.2 POJO

​ 我们可以使用POJO中的属性名来获取对应的值。

例如:

接口中方法定义如下

User findByUser(User user);

xml中内容如下:

    <select id="findByUser" resultType="com.sangeng.pojo.User">select * from user where id = #{id} and username = #{username} and age = #{age} and address = #{address}</select>
4.1.3 Map

​ 我们可以使用map中的key来获取对应的值。

例如:

接口中方法定义如下

User findByMap(Map map);

xml中内容如下:

    <select id="findByMap" resultType="com.sangeng.pojo.User">select * from user where id = #{id} and username = #{username} and age = #{age} and address = #{address}</select>

方法调用:

        Map map = new HashMap();map.put("id",2);map.put("username","PDD");map.put("age",25);map.put("address","上海");userDao.findByMap(map);

4.2 多个参数

​ Mybatis会把多个参数放入一个Map集合中,默认的key是argx和paramx这种格式。

例如:

接口中方法定义如下

User findByCondition(Integer id,String username);

最终map中的键值对如下:

{arg1=PDD, arg0=2, param1=2, param2=PDD}

​ 我们虽然可以使用对应的默认key来获取值,但是这种方式可读性不好。我们一般在方法参数前使用@Param来设置参数名。

例如:

接口中方法定义

User findByCondition(@Param("id") Integer id,@Param("username") String username);

最终map中的键值对如下:

{id=2, param1=2, username=PDD, param2=PDD}

所以我们就可以使用如下方式来获取参数

    <select id="findByCondition" resultType="com.sangeng.pojo.User">select * from user where id = #{id} and username = #{username}</select>

4.3 总结

​ 建议如果只有一个参数的时候不用做什么特殊处理。如果是有多个参数的情况下一定要加上@Param来设置参数名。

5. 核心类

5.1 SqlSessionFactory

​ SqlSessionFactory是一个SqlSession的工厂类。主要用来获取SqlSession对象。、

成员方法如下:

SqlSession openSession();
//获取SqlSession对象,传入的参数代表创建的SqlSession是否自动提交
SqlSession openSession(boolean autoCommit);

5.2 SqlSession

​ SqlSession 提供了在数据库执行 SQL 命令所需的所有方法 。它还提供了事务的相关操作。

成员方法如下:

T getMapper(Class<T> type);//获取mapper对象
void commit();//提交事务
void rollback();//回滚事务
void close();//释放资源

6.Mybatis实现增删改查

6.1 新增

①接口中增加相关方法

void insertUser(User user);

②映射文件UserDao.xml增加响应的标签

    <insert id="insertUser">insert into user values(null,#{username},#{age},#{address})</insert>

注意:要记得提交事务。

6.2 删除

①接口中增加相关方法

void deleteById(Integer id);

②映射文件UserDao.xml增加响应的标签

    <delete id="deleteById">delete from user where id = #{id}</delete>

注意:要记得提交事务。

6.3 修改

①接口中增加相关方法

void updateUser(User user);

②映射文件UserDao.xml增加响应的标签

    <!--更新用户--><update id="updateUser">UPDATE USER SET age = #{age} , username = #{username},address = #{address} WHERE id = #{id}</update>

注意:要记得提交事务。

6.4 根据id查询

①接口中增加相关方法

User findById(Integer id);

②映射文件UserDao.xml增加响应的标签

   <select id="findById" resultType="com.sangeng.pojo.User">select * from user where id = #{id}</select>

6.5 查询所有

①接口中增加相关方法

List<User> findAll();

②映射文件UserDao.xml增加响应的标签

    <select id="findAll" resultType="com.sangeng.pojo.User">select * from user</select>

7. 配置文件详解

7.1 properties

​ 可以使用properties读取properties配置文件。使用其中的resource属性来设置配置文件的路径。

​ 然后使用${key}来获取配置文件中的值

例如:

在resources目录下有jdbc.properties文件,内容如下:

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

在mybatis-config.xml中:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--设置配置文件所在的路径--><properties resource="jdbc.properties"></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--获取配置文件中配置的对应的值来设置连接相关参数--><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments>
</configuration>

7.2 settings

​ 可以使用该标签来设置进行一些设置

例如:

    <settings><!--开启自动驼峰命名映射--><setting name="mapUnderscoreToCamelCase" value="true"/></settings>

具体的设置参考:https://mybatis.org/mybatis-3/zh/configuration.html#settings

7.3 typeAliases

​ 可以用来设置给全类名设置别名,简化书写。一般设置一个包下的类全部具有默认别名。默认别名是类目首字母小写。例如:com.sangeng.pojo.User别名为user

   <typeAliases><package name="com.sangeng.dao"></package></typeAliases>

7.4 environments

​ 配置数据库相关的环境,例如事物管理器,连接池相关参数等。

    <!--设置默认环境--><environments default="development"><!--设置该环境的唯一标识--><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--获取配置文件中配置的对应的值来设置连接相关参数--><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments>

7.5 mappers

​ 该标签的作用是加载映射的,加载方式有如下几种(主要使用第四种):

​ ①使用相对于类路径的资源引用,例如:

<!-- 使用相对于类路径的资源引用 -->
<mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/><mapper resource="org/mybatis/builder/BlogMapper.xml"/><mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

​ ②使用完全限定资源定位符(URL),例如:

<!-- 使用完全限定资源定位符(URL) -->
<mappers><mapper url="file:///var/mappers/AuthorMapper.xml"/><mapper url="file:///var/mappers/BlogMapper.xml"/><mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>

​ ③使用映射器接口实现类的完全限定类名,例如:

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers><mapper class="org.mybatis.builder.AuthorMapper"/><mapper class="org.mybatis.builder.BlogMapper"/><mapper class="org.mybatis.builder.PostMapper"/>
</mappers>

​ ④将包内的映射器接口实现全部注册为映射器,例如:

<!-- 定义dao接口所在的包。要求xml文件存放的路径和dao接口的包名要对应 -->
<mappers><package name="org.mybatis.builder"/>
</mappers>

8. 打印日志

①log4j配置 在resources目录下创建log4j.properties文件,内容如下:

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=debug, stdout

②引入依赖

        <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

9.获取参数时 #{}和${}的区别

​ 如果使用#{}.他是预编译的sql可以防止SQL注入攻击
​ 如果使用${}他是直接把参数值拿来进行拼接,这样会有SQL注入的危险

如果使用的是#{}来获取参数值日志如下:
Preparing: select * from user where id = ? and username = ? and age = ? and address = ?
Parameters: 2(Integer), 快乐风男(String), 29(Integer), 北京(String)

如果使用${}来获取参数值日志如下:
Preparing: select * from user where id = 2 and username = 快乐风男 and age = 29 and address = 北京






如果我的内容对你有帮助,请辛苦动动您的手指为我点赞,评论,收藏。感谢大家!!
在这里插入图片描述

http://www.dtcms.com/a/464723.html

相关文章:

  • MaxScript 科研绘图教程:从数据到精确的可视化
  • org.apache.http.conn.HttpHostConnectException: Connect to localhost:8086
  • 深度学习入门(一)——从神经元到损失函数,一步步理解前向传播(上)
  • 沧州网站制作公司宁波网站的优化
  • 工程承包去哪个网站做网站的步骤 优帮云
  • 网站建设课程wordpress 去掉左上角
  • 怎么创建一个博客网站wordpress电影下载
  • 搭建网站案例精粹北京cos网站
  • 云南澄江县建设局网站做网站江门
  • 企业外贸网站建设互联网创业项目概述
  • 关于企业网站建设数据现状分析重庆百度推广关键词优化
  • 手机网站免费网站安全建设费用预算表
  • 网站seo推广计划网页制作工具可以分为
  • 北京企业建设网站制作建设网站总经理讲话范本
  • 沂南网站设计不用wordpress
  • 长春网站建设吉网传媒实力牜网页视频下载安卓
  • 用书籍上的文章做网站更新南海建设工程交易中心网站
  • 高品质网站设计制作竞价排名是按照什么来计费的
  • 上海建设房屋网站北京网页设计公司兴田德润优秀
  • 宜都网站seoico众筹WordPress
  • wordpress thread comment泰安seo外包公司
  • 什么网站做品牌特卖北京高级网站开发
  • 品牌型网站开发网站开发商怎么关闭图片显示
  • captcha wordpress提升seo搜索排名
  • 爱站数据网络销售有限公司
  • 网站站点风格西安seo排名收费
  • 网站魔板大全什么是品牌vi设计
  • 自助建站 知乎英迈思做网站怎么样
  • 做电影网站要多少钱北京网站优化首页
  • 泰安可信赖的企业建站公司长春网站建设选择星宿科技