Mybatis的入门详解
- mybatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。 - mybatis解决jdbc的问题
1、数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。 - mybatis的入门详解
-|导包
mybatis的核心包:
核心包mybatis-3.2.7.jarmysql-connector-java-5.1.7-bin.jar
依赖包:主要第打印log及其他asm-3.3.1.jarcglib-2.2.2.jarcommons-logging-1.1.1.jar/javassist-3.17.1-GA.jarlog4j-1.2.17.jarlog4j-api-2.0-rc1.jarlog4j-core-2.0-rc1.jarslf4j-api-1.7.5.jarslf4j-log4j12-1.7.5.jar
导包完成
- 准备数据库:测试用的bos_puya32数据库,操作的表为t_customer
-|t_customer分别有
id,name,station,telephone,address,decidedzone_id 这几个字段,
5.准备接入数据,创建t_t_customer对应的实体类,包名为com.puya.mybatis.pojo
package com.puya.mybatis.pojo;import java.io.Serializable;public class User implements Serializable {private Integer id;private String name;private String station;private String telephone;private String address;private String decidedzone_id;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getStation() {return station;}public void setStation(String station) {this.station = station;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getDecidedzone_id() {return decidedzone_id;}public void setDecidedzone_id(String decidedzone_id) {this.decidedzone_id = decidedzone_id;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", station=" + station + ", telephone=" + telephone + ", address="+ address + ", decidedzone_id=" + decidedzone_id + "]";}}
- 配置log4j,创建一个log4j.properties,内容如下,主要是打印log的作用
# 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
- 配置mybatis,创建一个sqlMapConfig.xml文件,名字固定
文件的头固定为
<?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">
- 填写mybatis的configuration内容,注意数据库的名字和登录的账号和密码,否则jdbc连接不上
<?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/bos_puya32?characterEncoding=utf-8" /><property name="username" value="root" /><property name="password" value="123456" /></dataSource></environment></environments><!-- Mapper的位置 Mapper.xml 写Sql语句的文件的位置 --><mappers><mapper resource="com/puya/mybatis/sqlmap/User.xml"/></mappers>
</configuration>
- 书写测试的代码,通过id查找一个对象
@Testpublic void testMybatis() throws Exception {//加载核心的配置文件String path ="sqlMapConfig.xml";//读取配置文件获取流InputStream in = Resources.getResourceAsStream(path);//创建sqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);//创建sessionSqlSession session = sessionFactory.openSession();//执行sql语句User user = session.selectOne("user.findUserById", 1);System.out.println(user); }
- 在这里就疑问sql语句写在哪里? 每一个实体类都需要对应一个实体类的xml文件,然后配置在mybatis的文件中去
User类对应的实体xml文件,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"><!-- 写sql语句的地方 -->
<mapper namespace="user"><!--mapper参数详解:namespace:命名空间,区分不同的sql,调用的时候使用 user.findUserByIdselect 参数详解parameterType : 传入参数的类型,mybatis封装了基本类,只需要写resultType : 返回的数据类型,一般是全类名--><select id="findUserById" parameterType="Integer" resultType="com.puya.mybatis.pojo.User">select * from t_customer where id = #{v}</select><!-- #{v} 表示占位符v可以是任何字符 select * from t_customer where id = ?${value} 表示字符拼接,只能是value select * from t_customer where name like '%张三%' ,有单引号的为了防止sql注入 ${value} 可以这样写 select * from t_customer where name like "%"#{value}"%"--><select id="findUserByUserName" parameterType="String" resultType="com.puya.mybatis.pojo.User"><!-- select * from t_customer where username like '%${value}%' -->select * from t_customer where name like "%"#{value}"%" <!-- 这个可以防止sql注入 --></select><insert id="insertUser" parameterType="com.puya.mybatis.pojo.User"><!--private Integer id;private String name;private String station;private String telephone;private String address;private String decidedzone_id; --><selectKey keyProperty="id" resultType="Integer" order="AFTER">select LAST_INSERT_ID() <!-- 这个表示执行最新的id 服装到User的id中去--></selectKey>insert into t_customer (name,station,telephone,address,decidedzone_id) value(#{name},#{station},#{telephone},#{address},#{decidedzone_id})</insert><update id="updateUserById" parameterType="com.puya.mybatis.pojo.User">update t_customer set name=#{name},station=#{station},telephone=#{telephone},address=#{address},decidedzone_id=#{decidedzone_id}where id=#{id}</update><delete id="deleteUserById" parameterType="Integer">delete from t_customer where id =#{value}</delete></mapper>
一定要记得配置到sqlMapConfig.xml 文件中去,路径配置正确即可
<!-- Mapper的位置 Mapper.xml 写Sql语句的文件的位置 --><mappers><mapper resource="com/puya/mybatis/sqlmap/User.xml"/></mappers>
//执行sql语句User user = session.selectOne("user.findUserById", 1);这句代码执行的时候就会执行User.xml文件中的<select id="findUserById" parameterType="Integer" resultType="com.puya.mybatis.pojo.User">select * from t_customer where id = #{v}</select>
语句,就查询到了响应的User对象
- 根据用户名字模糊查询
@Testpublic void findUserByUserName() throws Exception {//加载核心的配置文件String path ="sqlMapConfig.xml";//读取配置文件获取流InputStream in = Resources.getResourceAsStream(path);//创建sqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);//创建sessionSqlSession session = sessionFactory.openSession();//执行sql语句List<User> data = session.selectList("user.findUserByUserName", "张三");for (User user2 : data) {System.out.println(user2);}}
对应的User.xml文件中的sql语句
<!-- #{v} 表示占位符v可以是任何字符 select * from t_customer where id = ?${value} 表示字符拼接,只能是value select * from t_customer where name like '%张三%' ,有单引号的为了防止sql注入 ${value} 可以这样写 select * from t_customer where name like "%"#{value}"%"--><select id="findUserByUserName" parameterType="String" resultType="com.puya.mybatis.pojo.User"><!-- select * from t_customer where username like '%${value}%' -->select * from t_customer where name like "%"#{value}"%" <!-- 这个可以防止sql注入 --></select>
<!-- 注意这些占位符和字符串拼接的书写
#{v} 表示占位符v可以是任何字符 select * from t_customer where id = ?
${value} 表示字符拼接,只能是value select * from t_customer where name like '%张三%' ,有单引号的为了防止sql注入 ${value} 可以这样写 select * from t_customer where name like "%"#{value}"%"
- 插入一个用户
@Testpublic void insertUser() throws Exception {//加载核心的配置文件String path ="sqlMapConfig.xml";//读取配置文件获取流InputStream in = Resources.getResourceAsStream(path);//创建sqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);//创建sessionSqlSession session = sessionFactory.openSession();User user = new User();user.setAddress("湖北省咸宁市通城县");user.setName("纱布都");user.setStation("文员");user.setTelephone("15526896541");session.insert("user.insertUser", user);//插入数据,一定要交事务session.commit();System.out.println(user.getId());}
- 更新一个用户
@Testpublic void updateUser() throws Exception {//加载核心的配置文件String path ="sqlMapConfig.xml";//读取配置文件获取流InputStream in = Resources.getResourceAsStream(path);//创建sqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);//创建sessionSqlSession session = sessionFactory.openSession();User user = new User();user.setAddress("湖北省咸宁市通城县22222222");user.setId(10);user.setName("纱布都");user.setStation("文员2222222");user.setTelephone("15526896541");session.update("user.updateUserById", user);//插入数据,一定要交事务session.commit();}
- 删除一个用户
@Testpublic void deleteUserByid() throws Exception {//加载核心的配置文件String path ="sqlMapConfig.xml";//读取配置文件获取流InputStream in = Resources.getResourceAsStream(path);//创建sqlSessionFactorySqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);//创建sessionSqlSession session = sessionFactory.openSession();session.update("user.deleteUserById", 10);//插入数据,一定要交事务session.commit();}
增删改的响应的sql语句都在上面的User.xml文件中相对应,可以嘻嘻查看
这就是mybatis的基本使用了,希望对您有帮助
Mybatis的入门详解相关推荐
- 第6章 MyBatis框架入门详解(1)
数据持久化 在这章开始之前首先简单介绍一下什么是数据持久化.其实"持久化"是相对"临时"来说的,在计算机中存放数据的地方主要有两个,一个是内存,一个是硬盘,在内 ...
- Mybatis案例超详解
Mybatis案例超详解 前言: 本来是想像之前一样继续跟新Mybatis,但由于种种原因,迟迟没有更新,快开学了,学了一个暑假,博客也更新了不少,我觉得我得缓缓,先整合一些案例练练,等我再成熟点理解 ...
- Spring入门详解
typora-copy-images-to: upload Spring入门详解 Spring框架是Java开发中最常用的框架,功能非常强大 源码下载:Spring Framework jar包.文档 ...
- Spring 快速入门详解
Spring 入门详解 简介 Spring就是指Spring framework是分层的 Java SE/EE 一站式轻量级开源框架,Spring 框架是全家桶(spring mvc.spring b ...
- linux 日志按大小切割_nginx入门详解(六)- 日志切割
上一章讲解了nginx的目录加密功能,本章重点介绍nginx的日志切割. 笨办法学linux:nginx入门详解(五)- 目录加密zhuanlan.zhihu.com 在第二章,我们探讨了nginx ...
- python怎么安装myqr模块-python二维码操作:对QRCode和MyQR入门详解
python是所有编程语言中模块最丰富的 生活中常见的二维码功能在使用python第三方库来生成十分容易 三个大矩形是定位图案,用于标记二维码的大小.这三个定位图案有白边,通过这三个矩形就可以标识一个 ...
- python语言编程基础-Python语言入门详解!快速学成Python!
原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...
- python语言入门m-Python语言入门详解!快速学成Python!
今日主题 "Python语言入门详解" 近两年来,Python语言借着数据科学和人工智能的"东风"成为了最流行的编程语言--街头巷尾人们口口相传.同时,Pyth ...
- python语言入门详解-python初级教程:入门详解
python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...
最新文章
- [推荐]Silverlight 2 开发者海报
- Vim 快捷键整理【转】
- C语言指出下列程序的错误,2012年计算机二级C语言精编教程第二章(8)
- ASP.NET Web API 基本操作(CRUD)
- hadoop 之DefaultStringifier
- Python3 多线程的两种实现方式
- 垃圾软件!动不动就扣费!| 今日最佳
- 2021高考成绩已出城市查询,2021年青海高考成绩什么时候出来 公布时间
- 判断字符串是否对称 C语言,c语言 判断字符串是否中心对称
- 51单片机之串行通信
- 票务网 php,电影票务网站的设计与制作
- 输出数字矩阵并把最后变为PUM
- 七大云架构设计在线绘图工具
- 大数据的产业链分析,大数据完整的产业链构成
- repo拉代码The remote end hung up unexpectedly解决方法
- jsd 多线程与socket网络通信
- 电镀废水除镍、电镀废水除总铬的工艺技术汇总分享
- VUE DIFF算法之双端DIFF
- 微信机器人接口,ipad协议
- AutoCAD软件使用:快捷键
热门文章
- maven打包报错:Please refer to XXXtargetsurefire-reports for the individual test results. 以及跳过test打包
- c语言课程设计计算器程序分析,c语言课程设计简单计算器程序..docx
- dynamixel舵机在ros下的workbnech使用
- NDK RTMP直播客户端三
- java 解析cron_Java 解析Cron表达式,获取最近运行时间
- 14. Mybatis 删除操作-delete
- 一文读懂处理器流水线
- 日常记录1_电池_接收机_BEC_飞控
- verilog的testBench、在vivado中创建testbench
- Seay代码审计工具