一,概述:

Mybatis官网

Mybatis介绍:

Mybatis是一款优秀的持久层框架,它支持定制化SQL,存储过程以及高级映射。mybaits 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
Mybatis可以使用简单的xml或注解来配置和映射原生信息,将接口和java的POJO(Plain Old java Objects,普通java对象)映射成数据库中的记录。

Mybatis是基于JDBC做的简单的映射包装。

Mybatis架构:


二,Mybatis使用

1, pom 文件引入依赖

    <!--MySQL的驱动jar--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency>

2,mybatis-config.xml :全局配置文件

配置数据源,事务,加载映射文件。 后文详解

3,创建pojo类(提供基本的get/set方法)

/*** 创建Pojo类,和数据库表Student对应* 属性需要与数据库一一对应*/
public class Student {private int SID;private String Sname;private String Ssex;private int Sage;省略get和set方法}

4,创建Mapper.java接口

该接口中的方法名需要唯一,每一个接口方法均与Mapper.xml文件sql语句一一映射

public interface StudentMapper {//   需求:通过ID查询Student表中用户信息//select * from Student where SID = XXXpublic Student getStudentById(int sid);
}

5,Mapper.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:指定接口的全路径名(包名+类名)
-->
<mapper namespace="com.dao.StudentMapper"><!--select查询操作标签id属性:对应接口中方法名,必填项、且在同一个namespace,ID不能重复#{XXX}:占位符 里面填写的是方法中的参数名parameterType属性:指定入参类型resultType属性:执行返回参数类型 指定全路径名--><select id="getStudentById" parameterType="java.lang.Integer" resultType="com.bean7.Student">select * from Student where SID = #{sid}</select>
</mapper>

将Mapper.xml 配置到全局配置文件中 mybatis-config.xml

     <mappers><mapper resource="mapper/StudentMapper.xml"/></mappers>

编程使用 :一般放在启动类中

  • SqlSessionFactory :会话工厂,
    通过读取配置文件创建,配置文件只需读取一次即可,可以将SqlSessionFactory设置单例
  • SqlSession: 会话
    通过SqlSessionFactory 得到,对数据库的CRUD操作都是通过SqlSession来操作的
    SqlSession是线程不安全的,将其设置为方法的局部变量
    一级缓存是基于sqlsession来创建的,mybatis默认开启一级缓存
/*** @Created with IntelliJ IDEA* @Description:* @Package: PACKAGE_NAME* @author: FLy-Fly-Zhang* @Date: 2019/7/26* @Time: 13:56*/
public class App {public static void main(String[] args) throws IOException {String resource="mybatis-config.xml";//读取配置文件InputStream inputStream=Resources.getResourceAsStream(resource);//创建sqlSessionFactory SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);//设置是主动提交事务还是手动,默认手动sqlSessionFactory.openSession(true);//得到sqlSessionSqlSession sqlSession=sqlSessionFactory.openSession();//通过动态代理产生StrudentMapper对象StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);//调用对应接口方法,进行sql语句操作Student student = mapper.getStudentById(1);//若未设置主动提交事务,进行手动提交sqlSession.commit();System.out.println(student);}
}

三,配置文件详解:

全局配置文件

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mybatis
db.username=root
db.password=12345678
 <!--properties标签:读取配置文件,一般配置数据源--><properties>--><property name="db.properties" value="db.properties"/></properties><!--settings标签:设置mybatis全局性配置--><settings><!--打开延时加载的开关--><!--<setting name="lazyLoadingEnabled" value="true"/>--><!--将积极加载改为消极加载即按需加载--><!--<setting name="aggressiveLazyLoading" value="false"/>--><!--开启二级缓存--><!--<setting name="cacheEnabled" value="true"/>--></settings><!--typeAliases标签:取别名--><typeAliases><!--typeAlias:指定单个的类型取别名type属性:指定的要取别名的类的全路径名alias属性:取别名--><typeAlias type="com.bean7.Student" alias="student"/><!--package标签:批量取别名name属性:指定要取别名的包路径--><!--<package name="com.bean7"/>--></typeAliases><!--环境配置--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><!-- 配置数据源,采用property进行配置 --><dataSource type="POOLED"><property name="driver" value="${db.driver}"/><property name="url" value="${db.url}"/><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/></dataSource><!--配置数据源--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="xxxx"/><property name="password" value="xxxxx"/><!--读取配置--><!--<property name="password" value="${passsword}"/>--></dataSource></environment></environments><!--对象映射--><mappers><!--mappers映射有三种方式:resource方式:对单个的mapper进行映射、mapper.xml和mapper.java文件名可以不一样,可以不用存放在同一个目录下class方式:对单个的mapper进行映射mapper.xml和mapper.java文件名必须一样,必须存放在同一个目录下package方式:批量对mapper映射mapper.xml和mapper.java文件名必须一样,必须存放在同一个目录下--><mapper resource="mapper7/StudentMapper.xml"/><!--<mapper class="com.dao5.StudentMapper"/>--><!--<package name="com.dao7"/>--></mappers>
setting标签


mapper配置文件

#{} 和${}区别:

mybatis中有两个常见的符号#和KaTeX parse error: Expected 'EOF', got '#' at position 25: …的时候是很常见的,我的理解就是#̲是需要进行预编译的,是字符串进…是直接进行字符串的替换工作,两者各有有缺点。

  • #{} :表示一个占位符 ?
  1. 通过#{ }可以实现preparedStatement向占位符中设置值,

  2. 自动进行java类型和jdbc类型转换,

  3. #{ }可以有效防止sql注入。

  4. #{ }可以接收简单类型值或pojo属性值。

  5. 如果parameterType传输单个简单类型值,#{ }括号中可以是value或其它名称。

我们一般在刚刚接触到mybatis的时候都是使用的是#{变量名字},来进行sql语句的赋值工作,比如 select * from table_name where name = #{name},来进行查询,在接口里面传入Map或者是String都是可以的,这样的是mybatis进行了语句的编译工作,#{name},必须要放到name=后面,这样才会编译通过,进行执行sql语句。

  • $ {}
  1. ${ }可以将parameterType 传入的内容拼接在sql中

  2. 不进行jdbc类型转换,

  3. $ { }可以接收简单类型值或pojo属性值,

  4. 如果parameterType传输单个简单类型值,${ }括号中只能是value。

我们需要进行变化传输sql语句,这个时候一般都会用到的是等mybatis里面的动态标签来动态拼接sql语句,但是有的时候根据一些业务场景是需要传输表名或者是特定的变量名的,这个时候就需要根据业务来动态的改变查询的表名等问题,这个时候 的 好 处 就 体 现 了 , 的好处就体现了, 的好处就体现了,我的感觉就是单纯的字符串替换,比如,select * from table_name where name = ${name}这个时候mybatis不需要编译而是直接进行字符串的替换工作,比如我要传入一个表名,select * from KaTeX parse error: Expected 'EOF', got '#' at position 26: …} where name = #̲{name},这个时候在前台就…{tableName}就是单纯的字符串替换,而#{name}则需要进行编译才可以赋值

  • 注意:
    一般还是使用#,因为#是比较安全的一种传输方式,在一些渗透和安全性校验的时候,$ 不是特别安全,容易引起sql的注入问题,导致毁灭性灾难,但是也不是说一点不能用,只能说不可以从前台传输有关于sql的语句来使用 $ 否则就会出现删除数据的问题。
<!--
mapper标签:试试数据库表映射最外层标签
namespace:指定接口的全路径名(包名+类名)
-->
<mapper namespace="com.dao7.StudentMapper"><!--resultMap标签:指定返回类型id属性:取名字type属性:指定映射的JAVA对象,对应类的全路径--><resultMap id="resultStudent" type="com.bean7.Student"><!--id标签:指定主键的映射关系result标签:非主键的映射关系column属性:指定数据库字段名jdbcType属性:指定数据库字段的类型property属性:指定java类的属性名javaType属性:指定JAVA属性的类型typeHandler属性:执行类型映射操作--><id column="SID" property="SID" javaType="java.lang.Integer" jdbcType="INTEGER"></id><result column="Sname" property="name"></result><result column="Ssex" property="Ssex"></result><result column="Sage" property="Sage"></result></resultMap><!--select查询操作标签id属性:对应接口中方法名,必填项、且在同一个namespace,ID不能重复#{XXX}:占位符 里面填写的是方法中的参数名parameterType属性:指定入参类型resultType属性:执行返回参数类型 指定全路径名resultMap属性:执行返回参数类型resultType和resultMap区别:使用resultType是需要数据库字段和java类属性名保持一致,如果不一致则该属性无法完成映射使用resultMap进行显性映射,可以解决数据库字段和JAVA类属性名不一致的问题--><select id="getStudentById" parameterType="java.lang.Integer" resultMap="resultStudent">select * from Student where SID = #{sid}</select><!--插入操作--><insert id ="addStudent" parameterType="com.bean7.Student">insert into Student (SID,Sname) values (#{SID},#{Sname})</insert><!--删除操作--><delete id=""/><!--修改操作--><update id=""/>  

mybatis接口绑定形式:配置和注解

配置:
  • mapper.xml和mapper.java 绑定
  • mapper.xml文件中的namespace属性和mapper.java接口的类全路径保持一致
  • mapper.xml文件sql的CRUD的id属性和mapper.java接口中对应的方法名保持一致,且一个xml文件中,id不能重复
  • mapper.xml文件中的操作的parameterType属性和mapper.java接口中对应的方法入参类型保持一致。
  • mapper.xml文件中的操作的resultType属性和mapper.java接口中对应方法返回类型保持一致。
注解形式:
  • 当方法参数只有一个时,不需要使用@param注解
  • 当方法参数有多个时,需要使用@param注解将形参和@param参数进行一一绑定。

public interface StudentMapper {/*** 通过对象新增* @param student* @return*/@Insert("insert into student(student_number, student_name, age) values (#{studentNumber, jdbcType=VARCHAR}, #{studentName, jdbcType=VARCHAR}, #{age, jdbcType=INTEGER})")int insertByObject(Student student);/*** 通过map新增* @param map* @return*/@Insert("insert into student(student_number, student_name, age) values (#{studentNumber, jdbcType=VARCHAR}, #{studentName, jdbcType=VARCHAR}, #{age, jdbcType=INTEGER})")int insertByMap(Map<String, Object> map);/*** 通过编号查询* @param studentNumber* @return*/@Select("select * from student where student_number = #{studentNumber}")@Results({@Result(column = "student_number", property = "studentNumber"),@Result(column = "student_name", property = "studentName"),@Result(column = "age", property = "age")})Student findByStudentNumber(String studentNumber);/*** 通过姓名查询* @param studentName* @return*/@Select("select * from student where student_name = #{studentName}")@Results({@Result(column = "student_number", property = "studentNumber"),@Result(column = "student_name", property = "studentName"),@Result(column = "age", property = "age")})List<Student> findByStudentName(String studentName);/*** 通过编码删除* @param studentNumber* @return*/@Delete("delete from student where student_number = #{studentNumber}")int deleteByStudentNumber(String studentNumber);/*** 通过对象修改* @param student* @return*/@Update("update student set student_name = #{studentName}, age = #{age} where student_number = #{studentNumber}")int updateByObject(Student student);/*** 通过编码修改名字* 传多个参数时必须使用@Param("")* @param studentName* @param StudentNumber* @return*/@Update("update student set student_name = #{studentName} where student_number = #{studentNumber}")int updateStudentNameByStudentNumber(@Param("studentName") String studentName, @Param("studentNumber") String StudentNumber);}

参考博主:

Mybatis全面详解
Mybatis教程

Mybatis-mybatis使用xml文件配置相关推荐

  1. spring +springmvc+mybatis组合springmvc.xml文件配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  2. spring +springmvc+mybatis组合web.xml文件配置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

  3. mybatis学习指南--xml文件方式篇

    mybatis学习指南---xml文件篇 以下内容是由我总结mybatis官方文档和实践中的一些经验,总共分为四篇:xml文件配置篇,java方式配置篇,缓存篇,其他配置篇,第一次这样正式的写一篇文章 ...

  4. SpringSecurity使用 配置文件 和wen.xml 文件配置

    目录 1.web.xml 文件配置 2.spring-security  普通 为使用自己创建的认证类 1.web.xml 文件配置 !-- 配置SpringSecurity的拦截器 -->&l ...

  5. eclipse mysql Xml配置_mysql8.0在eclipse中通过xml文件配置数据库连接池

    mysql8.0在eclipse中通过xml文件配置数据库连接池 1.关于Mysql8.0 2.数据库连接池(DBCP) 3.准备工作 4.配置context.xml 5.配置web.xml 6.调用 ...

  6. java spring bean配置文件_Spring基于xml文件配置Bean过程详解

    这篇文章主要介绍了spring基于xml文件配置Bean过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通过全类名来配置: class:be ...

  7. Logback.xml 文件    配置

    2019独角兽企业重金招聘Python工程师标准>>> Logback.xml 文件    配置 <?xml version="1.0" encoding= ...

  8. 从前后端分离到前后端整合的“退步”(二)pom.xml文件配置

    系列文章目录 从前后端分离到前后端整合的"退步"(一)项目结构 从前后端分离到前后端整合的"退步"(二)pom.xml文件配置 Spring Boot + Vu ...

  9. Java 中JAF、CORBA、JTA、JAXB、JAX-WS使用Maven的pom.xml文件配置

    本文主要介绍Java EE中已经弃用的模块,需要单独引用JAF(java.activation).CORBA(java.corba).JTA(java.transaction).JAXB(java.x ...

  10. AndroidManifest.xml文件配置教程及相关指令详解

    AndroidManifest.xml 是每个android程序中必须的文件,它位于整个项目的根目录.我们每天都在使用这个文件,往里面配置程序运行所必要的组件,权限,以及一些相关信息.但是对于这个文件 ...

最新文章

  1. python.freelycode.com-Python日期时间处理: datestuff
  2. idea验证失败_SVN提示https证书验证失败解决办法
  3. Codeforces Round #277(Div 2) A、B、C、D、E题解
  4. 【Spark Summit East 2017】管道泄漏问题:像女士一样在大数据中做个的标记
  5. 销售流程图_34页财务管理制度和流程图!让你明白会计工作要点,总结全面清晰...
  6. html如何隐藏二进制字符串,如何用二进制代码隐藏字符串?
  7. Linux Service管理
  8. c语言程序设计学校运动会管理系统,【纯小白求助】 课程设计里面《校际运动会管理系统》源代码运行...
  9. jQueryWEUI使用picker实现二级联动
  10. 【手把手】教你MySQL调优
  11. 原生M1 Sketch for mac(专业矢量绘图设计) v86中文激活版功能介绍,支持最新的monterey系统
  12. 编译MTK系统源码时checking Env失败的解决方法
  13. python回测代码_python实现马丁策略回测3000只股票的实例代码
  14. Informatica bulk和normal模式
  15. Linux下编译pjproject-2.6并运行例程simple_pjsua
  16. python:os.chdir()
  17. MATLAB编程-弹簧振动动画
  18. Python中%的作用
  19. 自动驾驶Apollo安装步骤
  20. 6、使用Java Low Level REST Client操作elasticsearch.docx

热门文章

  1. C语言 基于文件的程序设计(PTA)
  2. 严谨的射频电路的测试步骤
  3. android添加或修改默认来电、短信、闹钟、提示音铃声
  4. 微信小程序AR引擎kivicube v2版正式上线啦
  5. 货运APP开发面临市场的考验
  6. SSM-框架整合(简介+源码)
  7. 坚果Pro真机已确认外观设计!
  8. python randint函数用法_使用random函数实现randint函数的功能
  9. koa2框架使用心得
  10. Sim_EKB_Install_2022_04_04