此详解还是没有整合spring等项目的应用。只是作为一个入门的程序。同hibernate

Mybatis是什么?

MyBatis 本是apache的一个开源项目iBatis,

Mybatis和hibernate一样,是一个基于JDBC的持久层框架。

Hibernate是一个完全的、标准的ORM框架。

Mybatis是一个不完全的ORM框架。Mybatis可以对输入参数和输出结果进行映射。Mybatis需要程序员去编写sql语句。

Mybatis将sql语句配置到xml配置文件中,然后将输入参数进行映射,由mybatis框架将映射后的sql片段拼接到配置到xml中的sql语句。然后由mybatis框架来执行映射后的sql语句。执行之后的结果将由mybatis框架映射成java对象。

分析原生态jdbc程序中存在的问题

2.1 原生态Jdbc程序代码

package net.gbicc.dao;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JdbcDeom {public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {//1、加载数据库驱动Class.forName("com.mysql.jdbc.Driver");//2、通过驱动管理类获取数据库链接connection =  DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");//3、定义sql语句 ?表示占位符String sql = "select * from user where username = ?";//4、获取预处理statementpreparedStatement = connection.prepareStatement(sql);//5、设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值preparedStatement.setString(1, "王五");//6、向数据库发出sql执行查询,查询出结果集resultSet =  preparedStatement.executeQuery();//7、遍历查询结果集while(resultSet.next()){System.out.println(resultSet.getString("id")+"  "+resultSet.getString("username"));}} catch (Exception e) {e.printStackTrace();}finally{//8、释放资源if(resultSet!=null){try {resultSet.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(preparedStatement!=null){try {preparedStatement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

2.2 Jdbc问题总结

1、 数据库连接频繁开启和关闭,会严重影响数据库的性能。

2、 代码中存在硬编码,分别是数据库部分的硬编码和SQL执行部分的硬编码。

Mybatis框架原理(核心)

3.1 框架图


两个原理图一样,哪个理解就看哪个

3.2 分析结论

1、 mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的 信息。

2、 mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。

3、 通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。

4、 SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)

5、 Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、HashMap集合对象、POJO对象类型。

Mybatis入门程序

Mybatis课程的所有代码程序将通过一个订单商品案例来进行讲解。

4.1 需求

对用户信息的增删改查操作。

1、 根据用户ID来查询用户信息;

2、 根据用户名称来模糊查询用户信息列表;

3、 添加用户

4、 删除用户(自己练习)

5、 修改用户(自己练习)

4.2 环境准备

Jdk环境:jdk1.7

Ide环境:eclipse indigo

数据库环境:MySQL 5.1

Mybatis:3.2.7

4.2.1 数据库初始化

4.2.1.1 数据库脚本

sql_data.sql和sql_table.sql

sql_data.sql
/*
SQLyog v10.2
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Data for the table `items` */insert  into `items`(`id`,`name`,`price`,`detail`,`pic`,`createtime`) values (1,'台式机',3000.0,'该电脑质量非常好!!!!',NULL,'2015-02-03 13:22:53'),(2,'笔记本',6000.0,'笔记本性能好,质量好!!!!!',NULL,'2015-02-09 13:22:57'),(3,'背包',200.0,'名牌背包,容量大质量好!!!!',NULL,'2015-02-06 13:23:02');/*Data for the table `orderdetail` */insert  into `orderdetail`(`id`,`orders_id`,`items_id`,`items_num`) values (1,3,1,1),(2,3,2,3),(3,4,3,4),(4,4,2,3);/*Data for the table `orders` */insert  into `orders`(`id`,`user_id`,`number`,`createtime`,`note`) values (3,1,'1000010','2015-02-04 13:22:35',NULL),(4,1,'1000011','2015-02-03 13:22:41',NULL),(5,10,'1000012','2015-02-12 16:13:23',NULL);/*Data for the table `user` */insert  into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'王五',NULL,'2',NULL),(10,'张三','2014-07-10','1','北京市'),(16,'张小明',NULL,'1','河南郑州'),(22,'陈小明',NULL,'1','河南郑州'),(24,'张三丰',NULL,'1','河南郑州'),(25,'陈小明',NULL,'1','河南郑州'),(26,'王五',NULL,NULL,NULL);/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

sql_table.sql

/*
SQLyog v10.2
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE=''*/;/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Table structure for table `items` */CREATE TABLE `items` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(32) NOT NULL COMMENT '商品名称',`price` float(10,1) NOT NULL COMMENT '商品定价',`detail` text COMMENT '商品描述',`pic` varchar(64) DEFAULT NULL COMMENT '商品图片',`createtime` datetime NOT NULL COMMENT '生产日期',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;/*Table structure for table `orderdetail` */CREATE TABLE `orderdetail` (`id` int(11) NOT NULL AUTO_INCREMENT,`orders_id` int(11) NOT NULL COMMENT '订单id',`items_id` int(11) NOT NULL COMMENT '商品id',`items_num` int(11) DEFAULT NULL COMMENT '商品购买数量',PRIMARY KEY (`id`),KEY `FK_orderdetail_1` (`orders_id`),KEY `FK_orderdetail_2` (`items_id`),CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;/*Table structure for table `orders` */CREATE TABLE `orders` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` int(11) NOT NULL COMMENT '下单用户id',`number` varchar(32) NOT NULL COMMENT '订单号',`createtime` datetime NOT NULL COMMENT '创建订单时间',`note` varchar(100) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`),KEY `FK_orders_1` (`user_id`),CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;/*Table structure for table `user` */CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(32) NOT NULL COMMENT '用户名称',`birthday` date DEFAULT NULL COMMENT '生日',`sex` char(1) DEFAULT NULL COMMENT '性别',`address` varchar(256) DEFAULT NULL COMMENT '地址',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

1、 执行sql_table.sql脚本,创建数据库表;

2、 执行sql_data.sql初始化测试数据。

如何执行,可以新建一个数据库,mybatis01然后用客户端执行上边的sql即可。

4.2.1.2 数据库表

订单商品案例的数据库脚本中,总共包含四张表,其中入门程序只使用user表


用户表的表结构如下:

4.2.2 下载mybatis

mybaits的代码由github.com管理,下载地址:https://github.com/mybatis/mybatis-3/releases

解压之后的目录结构



Lib:mybatis的依赖包

Mybatis-3.2.7.jar:mybatis的核心包

Mybatis-3.2.7.pdf:mybatis的使用指南

4.3 工程搭建(三步)

4.3.1 第一步:创建java工程

用eclipse创建一个java工程,jdk使用1.7

4.3.2 第二步:加入jar包

加入以下四部分jar包,其中junit的jar包,是非必须的。

1、 Mybatis核心包

2、 Mybatis依赖包(lib目录下的所有包)

3、MySQL驱动包

4、Junit单元测试包(单元测试需要的包)

一共12个包,除去测试包,一共11个jar包
添加jar包的方法无须赘述,可以建一个lib目录添加

4.3.3 第三步:添加log4j.properties文件

Mybatis使用的日志包是log4j的,所以需要添加log4j.properties。

在classpath下创建log4j.properties如下:

文件内容可以从mybatis-3.2.7.pdf中拷贝

# 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

日志级别在开发阶段设置成DEBUG,在生产阶段设置成INFO或者ERROR。

4.4 编程步骤(思路很重要,技术不会可以练,但是思路没有却是什么都不会了)

1、 创建PO类,根据需求创建;

2、 创建全局配置文件SqlMapConfig.xml;

3、 编写映射文件;

4、 加载映射文件,在SqlMapConfig.xml中进行加载;

5、 编写测试程序,即编写Java代码,连接并操作数据库。

思路:

a) 读取配置文件;

b) 通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂。

c) 通过SqlSessionFactory创建SqlSession。

d) 调用SqlSession的操作数据库方法。

e) 关闭SqlSession。

要理解orm映射。详见hibernate的orm映射关系图

4.5 代码开发

4.5.1 创建PO类

创建的po类的属性要和数据库中表的列名一致(如果表中的列名是带有下划线,那么po类中对应的的属性名要采用驼峰式命名)

User.java类如下:(与数据表结构一一对应,可以对照着写po类)

Public class User {private int id;private String username;// 用户姓名private String sex;// 性别private Date birthday;// 生日private String address;// 地址
get/set……

4.5.2 创建SqlMapConfig.xml配置文件

在classpath下,创建SqlMapConfig.xml文件

SqlMapConfig.xml(文件头可以从mybatis-3.2.7.pdf文档的2.1.2小节中拷贝):

<?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>
<!-- 配置mybatis的环境信息 -->
<environments default="development"><environment id="development"><!-- 配置JDBC事务控制,由mybatis进行管理 --><transactionManager type="JDBC"></transactionManager><!-- 配置数据源,采用dbcp连接池 --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis01?useUnicode=true&characterEncoding=utf8"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment>
</environments>
</configuration>

4.5.3 需求开发

在classpath下,创建sqlmap文件夹。在sqlmap目录下,创建User.xml映射文件。

Mybatis的映射文件头(可以从mybatis-3.2.7.pdf文件中拷贝):

<?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">

注意:这点与hibernate不同,hibernate是一般直接在user.java的同级目录下创建User.xml而mybatis是在classpath下创建一个sqlmap文件夹,然后在创建一个User.xml文件。这点要注意一下

4.5.3.1 根据用户ID来查询用户信息

4.5.3.1.1 编写映射文件

在User.xml中添加以下代码:

<!-- namespace:命名空间,它的作用就是对SQL进行分类化管理,可以理解为SQL隔离注意:使用mapper代理开发时,namespace有特殊且重要的作用-->
<mapper namespace="test"><!-- 根据用户ID,查询用户信息 --><!-- [id]:statement的id,要求在命名空间内唯一  [parameterType]:入参的java类型[resultType]:查询出的单条结果集对应的java类型[#{}]: 表示一个占位符?[#{id}]:表示该占位符待接收参数的名称为id。注意:如果参数为简单类型时,#{}里面的参数名称可以是任意定义--><select id="findUserById" parameterType="int" resultType="net.gbicc.dao.User">SELECT * FROM USER WHERE id = #{id}</select>
</mapper>
注意:resultType对应的是映射的类,但是不要.java后缀名
4.5.3.1.2 加载映射文件(与主配置文件建立关系)

在SqlMapConfig.xml中,添加以下代码:

<!-- 加载mapper -->
<mappers><mapper resource="sqlmap/User.xml"/>
</mappers>

加在<configuration>下就可与<environments>同一级

4.5.3.1.3 编写测试程序
package net.gbicc.demo;import java.io.InputStream;import net.gbicc.dao.User;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;public class MybatisFirst {@Testpublic void findUserByIdTest() throws Exception{//1、读取配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);//2、根据配置文件创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//3、SqlSessionFactory创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//4、SqlSession执行statement,并返回映射结果//第一个参数:statement的id,建议:namespace.statementId(确保唯一)//第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致User user = sqlSession.selectOne("findUserById", 1);//打印输出结果集System.out.println(user);//5、关闭SqlSessionsqlSession.close();}
}

这里读取配置文件有多种方式,这只是利用io流操作

4.5.3.2 根据用户名称来模糊查询用户信息列表

4.5.3.2.1 编写映射文件

在User.xml中,添加以下内容:

<!-- 根据用户名称模糊查询用户信息列表 -->
<!-- [${}]:表示拼接SQL字符串[${value}]:表示要拼接的是简单类型参数。注意:1、如果参数为简单类型时,${}里面的参数名称必须为value 2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}
-->
<select id="findUsersByName" parameterType="String" resultType="net.gbicc.dao.User">SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
4.5.3.2.2 加载映射文件

已配置,此处无需再次配置。

4.5.3.2.3 编写测试程序
@Testpublic void findUsersByNameTest() throws Exception {// 1、读取配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 2、根据配置文件创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 3、SqlSessionFactory创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 4、SqlSession执行statement,并返回映射结果// 第一个参数:statement的id,建议:namespace.statementId(确保唯一)// 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致List<User> users = sqlSession.selectList("test.findUsersByName", "小明");// 打印输出结果集System.out.println(users);// 5、关闭SqlSessionsqlSession.close();}

4.5.3.3 添加用户

4.5.3.3.1 编写映射文件
<!-- 添加用户 -->
<!-- 如果主键的值是通过MySQL自增机制生成的,那么我们此处不需要再显示的给ID赋值 -->
<insert id="insertUser" parameterType="net.gbicc.dao.User">INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
</insert>
4.5.3.3.2 加载映射文件

已配置,此处无需再次配置。

4.5.3.3.3 编写测试程序

注意:增删改操作要对SqlSession执行commit操作。

@Testpublic void insertUserTest() throws Exception {// 1、读取配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 2、根据配置文件创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 3、SqlSessionFactory创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 4、SqlSession执行statement,并返回映射结果//构建user参数,没有赋值的属性采取默认值User user = new User();user.setUsername("东哥1");user.setAddress("清河宝盛西里");// 第一个参数:statement的id,建议:namespace.statementId(确保唯一)// 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致sqlSession.insert("insertUser", user);//切记:增删改操作时,要执行commit操作sqlSession.commit();// 5、关闭SqlSessionsqlSession.close();}
4.5.3.3.4 主键返回之MySQL自增主键

思路:

1、MySQL自增主键,是指在insert之前MySQL会自动生成一个自增的主键。

2、我们可以通过MySQL的函数获取到刚插入的自增主键:

LAST_INSERT_ID()

3、 这个函数是在insert语句之后去调用。

修改映射文件:

<!-- 添加用户之自增主键返回(selectKey方式) -->
<!-- [selectKey标签]:通过select查询来生成主键[keyProperty]:指定存放生成主键的属性[resultType]:生成主键所对应的Java类型[order]:指定该查询主键SQL语句的执行顺序,相对于insert语句[last_insert_id]:MySQL的函数,要配合insert语句一起使用
-->
<insert id="insertUser" parameterType="net.gbicc.dao.User">
<selectKey keyProperty="id" resultType="int" order="AFTER">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO USER(username,sex,birthday,address) VALUES (#{username},#{sex},#{birthday},#{address})
</insert>
4.5.3.3.5主键返回之MySQL函数UUID(自己练习)

注意:使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。

<!-- 添加用户之UUID主键返回 -->
<!-- [uuid]:MySQL的函数,生成的主键是35位的字符串,所以使用它时要修改id的类型为字符类型注意:1、此时order采用BEFORE,因为需要先生成出主键,再执行insert语句2、显式的给ID赋值
-->
<insert id="insertUser" parameterType="net.gbicc.dao.User">
<selectKey keyProperty="id" resultType="string" order="BEFORE">SELECT UUID()</selectKey>INSERT INTO USER(id,username,sex,birthday,address) VALUES (#{id},#{username},#{sex},#{birthday},#{address})
</insert>
4.5.3.3.6 主键返回之Oracle序列返回(自己练习)
<!-- 添加用户之sequence返回 -->
<!-- 通过Oracle的sequence获取主键方式与MySQL的uuid方式基本一致
-->
<insert id="insertUser" parameterType="net.gbicc.dao.User">
<selectKey keyProperty="id" resultType="int" order="BEFORE">SELECT user_seq.nextval() FROM dual</selectKey>INSERT INTO USER(id,username,sex,birthday,address) VALUES (#{id},#{username},#{sex},#{birthday},#{address})
</insert>

4.5.3.4 删除用户

4.5.3.4.1 编写映射文件
<!-- 根据ID删除用户 -->
<delete id="deleteUser" parameterType="int">DELETE FROM USER WHERE id= #{id}
</delete>
4.5.3.4.2 加载映射文件

已配置,此处无需再次配置。

4.5.3.4.3 编写测试程序
@Test
public void deleteUserTest() throws Exception{// 1、读取配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 2、根据配置文件创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 3、SqlSessionFactory创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 4、SqlSession执行statement,并返回映射结果// 第一个参数:statement的id,建议:namespace.statementId(确保唯一)// 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致sqlSession.delete("test.deleteUser", 30);//切记:增删改操作时,要执行commit操作sqlSession.commit();// 5、关闭SqlSessionsqlSession.close();
}

4.5.3.5 修改用户

4.5.3.5.1 编写映射文件
<!-- 根据传入的用户信息修改用户 -->
<update id="updateUser" parameterType="net.gbicc.dao.User">
UPDATE USER SET username = #{username},sex=#{sex} WHERE id=#{id}
</update>
4.5.3.5.2 加载映射文件

已配置,此处无需再次配置。

4.5.3.5.3 编写测试程序
@Test
public void updateUserTest() throws Exception{// 1、读取配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 2、根据配置文件创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 3、SqlSessionFactory创建SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 4、SqlSession执行statement,并返回映射结果//构建user参数,没有赋值的属性采取默认值User user = new User();user.setId(28);user.setUsername("超哥11");user.setAddress("清河宝盛西里");// 第一个参数:statement的id,建议:namespace.statementId(确保唯一)// 第二个参数:入参的值,它的类型要和映射文件中对应的statement的入参类型一致sqlSession.update("test.updateUser", user);//切记:增删改操作时,要执行commit操作sqlSession.commit();// 5、关闭SqlSessionsqlSession.close();
}

4.6小结

4.6.1 parameterType和resultType

parameterType指定输入参数的java类型,可以填写别名或Java类的全限定名。

resultType指定输出结果的java类型,可以填写别名或Java类的全限定名。

4.6.2 #{}和${}

#{}:相当于预处理中的占位符?。

#{}里面的参数表示接收java输入参数的名称。

#{}可以接受HashMap、简单类型、POJO类型的参数。

当接受简单类型的参数时,#{}里面可以是value,也可以是其他。

#{}可以防止SQL注入。

${}:相当于拼接SQL串,对传入的值不做任何解释的原样输出。

${}会引起SQL注入,所以要谨慎使用。

${}可以接受HashMap、简单类型、POJO类型的参数。

当接受简单类型的参数时,${}里面只能是value。

4.6.3  selectOne和selectList

selectOne:只能查询0或1条记录,大于1条记录的话,会报错:

Mybatis详解一相关推荐

  1. mybatis 详解(三)------入门实例(基于注解)

    1.创建MySQL数据库:mybatisDemo和表:user 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 2.建立一个Java工程,并导入相应的jar包,具体目录如 ...

  2. 【重温版】MyBatis详解

    文章目录 1.Mybatis简介 1.MyBatis历史 2.MyBatis特性 3.MyBatis下载 4.和其它持久化层技术对比 2.搭建MyBatis 1.开发环境 2.创建maven工程 3. ...

  3. 最新Spring整合MyBatis详解教程

    目录 1.导入相关jar包 1. junit 2. mybatis 3. mysql 4. spring相关 5. aop织入 6. mybatis-spring 7. lombok(选用) 2.回顾 ...

  4. springboot 引入jdbc驱动_SpringBoot整合jdbc、durid、mybatis详解,数据库的连接就是这么简单...

    SpringBoot底层统一采用SpringData处理数据库,这一章主要来讲一下SpringBoot整合jdbc.durid.mybatis的方式. (一)整合jdbc 整合jdbc主要有三步: 1 ...

  5. Spring-Spring整合MyBatis详解

    文章目录 概述 项目结构 配置SQLMapClient 在Spring中配置MyBatis 编写Mybatis的DAO 使用SqlSessionTemplate 使用映射接口 Code 概述 使用My ...

  6. Mybatis 详解--- 一级缓存、二级缓存

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...

  7. mybatis 详解------ 一级缓存、二级缓存(九)

    mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMa ...

  8. SpringBoot集成MyBatis详解

    本文将使用mybatis官方starter来配置Mybatis 首先加入mybatis-spring-boot-stater的Maven依赖 <dependency><groupId ...

  9. Mybatis详解—@SelectKey注解

    SelectKey 元素的属性 SelectKey在Mybatis中是为了解决Insert数据时不支持主键自动生成的问题. 数据库主键包括自增和非自增,有时候新增一条数据不仅仅知道成功就行了,后边的逻 ...

最新文章

  1. OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)
  2. 十进制 转换为 二进制
  3. 重建控制文件的案例(RESETLOGS模式和NORESETLOGS模式)
  4. 解析JVM线程同步机制
  5. html文件怎么导出stl文件,3D建模软件导出STL文件的小技巧(一)
  6. linux安装opencv让输入密码,linux下安装opencv的全过程(对初学者或者linux不熟悉的童鞋,非常适合)...
  7. 微信网页开发 thinkphp5.0的try-catch和重定向
  8. 滑动到底部或顶部响应的ScrollView实现
  9. 如何成为高级测试人?
  10. [转载] 在java中,如何将方法作为参数传递
  11. 一个不错的linux学习资料下载的网址
  12. Java实用教程-Java基本语法-Java程序的构成
  13. 【嵌入式】NBIoT(BC26)低功耗模式与控制
  14. 手机怎么录游戏视频 手机屏幕录制的方法
  15. ps中怎么导出tif_TIF图片太大难以上传?
  16. maven clean Process terminated
  17. Class6 基于ECS和NAS搭建个人网盘
  18. 【CTF WriteUp】UTCTF 2020部分题解
  19. JavaScript使用url字符串拼接传递参数,截取参数
  20. java——博弈算法实现井字棋游戏

热门文章

  1. Linux环境下安装ssh2模块
  2. 如果面试遇到水货面试官,怎么办?
  3. 记一次u盘 无法格式化、0字节、写保护的解决过程
  4. 做一个有想法的AI | 用LaserTagger做NLP的文本复述任务
  5. 计网MAC层和网络层通信流程梳理
  6. HTTPS 请求过程
  7. 浏览器被篡改修复方法
  8. 一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(五)圣赞之HLSL渲染动画...
  9. linux mii框架,mii-tool命令
  10. 查到的比较全的生宝宝要准备东西的清单