MyBatis增删改查&优化
一、概述
0、框架介绍
框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求!
前提:ORM介绍
- ORM(Object Relational Mapping): 对象关系映射
- 指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术。
- 如图:
- 具体映射关系如下图:
1.现在JDBC代码的问题
1.存在大量的冗余代码,不同表的DAO操作,操作步骤只是Sql语句不同
2.给?占位符设置麻烦,需要手动完成
3.针对查询结果的处理比较麻烦,需要手动将结果集中的数据封装到实体对象中【手工进行ORM映射】
4.sql 语句在代码中硬编码,如果要修改 sql 语句,就需要修改 java 代码,造成代码不易维护。
5.没有数据查询时的优化策略,查询优化【mybatis开了一个内存空间-->缓存区,减少数据库的链接次数,提高程序效率】
DB 磁盘 硬盘 慢
内存:快
6.频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能
- 原始 JDBC 的操作问题解决方案
1.使用数据库连接池初始化连接资源。
2. 将 sql 语句抽取到配置文件中。
3. 使用反射、内省等底层技术,将实体与表进行属性与字段的自动映射
2.概念
- mybatis内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。
- mybatis通过xml或注解的方式将要执行的各种 statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句。
- 最后mybatis框架执行sql并将结果映射为java对象并返回。采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作。
MyBatis框架是一个基于java的 持久层框架,主要用于 对数据库进行增删改查 等操作。
是对现有JDBC-DAO层代码的合理封装,可以自动完成对象关系映射 (ORM),极大的简化开发,提高开发效率。
MyBatis官网地址:http://www.mybatis.org/mybatis-3/
3.与JDBC的对比
JDBC
1.加载驱动 Class.forName()
2.获取链接 conn=DriverManager.getConnection()
3.准备sql语句 String sql=""
4.装载Sql语句执行
pstm=conn.prepareStatement()
patm.executeUpdate();
5.处理结果(单个 if() )
while(sc.next(){
//封装实体类
手工封装实体
}
6.关闭资源
- 原始的查询数据
- 原始的插入数据
MyBatis
Jdbc实现时的问题
1、代码冗余
2、手工处理ORM映射
3、数据查询没有优化机制
Mybatis实现Dao接口
1.mybatis不写代码替换 配置文件(mapper.xml配置文件)
2.自动封装结果集
3、Mybatis支持查询数据缓存
<mapper namespace="Dao接口的全限定名 com.tjcu.dao.UserDao">
//插入
<insert id="方法名">
inset into t_user values(....)【不能加;】
</insert>
//删除
<delete id="方法名">
delete from t_user where......
</delete>
//更新
<update id="方法名">
update t_user set...
</update>
//查询
<select id="selectById">
select * from t_user;
</select>
</mapper>
4、MyBatis整体架构
MyBatis的整体架构分为三层
1:基础支持层,2:核心处理层,3:接口层
二、环境搭建
①添加MyBatis的jar包
数据库驱动jar包 mysql mysql-connector-java-8.0.16.jar
Mybatis前身 叫 Ibatis apache组织负责管理
后续交由Google Code 维护管理 ibatis3.0改名为Mybatis 3.0
GitHub 开源社区网站【微软收购】
②引入框架相关配置文件
1.log4j.properties 日志配置文件 查询框架的运行流程
名字固定 位置固定:src下
2.mybatis-config.xml Mybatis框架核心配置文件
名字:随意 位置:随意 需要手工加载 建议路径不要太深,直接放在src下
3.mapper.xml文件 相当于Dao接口的实现类
名字:随意 位置:随意 需要手工加载 建议路径不要太深,直接放在src下
- log4j.properties 日志配置文件作用
③初始化配置 让框架生效 数据库的链接配置
1、transactionManager 事务控制
DDL:数据定义语言 表的增删改查
DML:数据操作语言 insert update delete
DQL:date query Language数据查询语言
TCL:transaction 事务控制语言 commit rollback
- 事务具有ACID特性
原子性(Atomicity):整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。
一致性(Consistency):事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
隔离性(Isolation):隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。
持久性(Durability):在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
- 事务控制技巧
如果配置的是JDBC,则会使用Connection 对象的commit()、rollback()、close()管理事务。
如果配置成MANAGED,会把事务交给容器来管理,比如JBOSS,Weblogic。因为我们跑的是本地程序,如果配置成MANAGE 不会有任何事务。
如果是Spring + MyBatis , 则没有必要配置, 因为我们会直接在applicationContext.xml 里面配置数据源,覆盖MyBatis 的配置。
2、datasuorce连接池
- 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。如下图所示:
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。如下图所示:
框架连接池:访问操作数据库的框架具备的连接池
容器连接池:服务器上配置的连接池 归服务器连接池 tomcat配置连接池
三方连接池:专业的一些连接池产品,用于做连接的管理【专业】 DBCP,c3po,druid(阿里旗下)
**mybatis-config.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" >
<configuration>
<!-- 环境设置 mysql oracle db2 sqlserver2008 default:框架当前默认使用那个环境设置 书写的是环境的id属性值-->
<environments default="mysql">
<!-- 单个数据库链接配置 id:随意 唯一-->
<environment id="mysql">
<!--transactionManager 事务控制 jdbc:原生JDBC事务控制方式 JPA:分布式事务控制-->
<transactionManager type="JDBC"></transactionManager>
<!--数据库连接池设置 type:指定使用连接池的类型 POOLED:OOMybatis框架默认连接池
框架连接池:访问操作数据库的框架具备的连接池 POOLED
容器连接池:服务器上配置的连接池 归服务器连接池 tomcat配置连接池
三方连接池:专业的一些连接池产品,用于做连接的管理【专业】 DBCP,c3po,druid(阿里旗下)
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8& useSSL=false &serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
④Mybatis核心API
1.Resource 加载Mybatis核心配置文件
org.apache.ibatis.io.Resources:加载资源的工具类。
2.构建器SqlSessionFactoryBuilder
org.apache.ibatis.session.SqlSessionFactoryBuilder:获取 SqlSessionFactory 工厂对象的功能类通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
*功能:通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);
其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。
Resources 类帮助你从类路径下、文件系统或一个 web URL 中加载资源文件。
3.sqlSessionFactory sqlSession的工厂对象
org.apache.ibatis.session.SqlSessionFactory:获取 SqlSession 构建者对象的工厂接口。
工厂:重量级的资源,占用内存较多 功能强大 线程安全
用于创建sqlsession对象
4.sqlSession 会话对象
org.apache.ibatis.session.SqlSession:构建者对象接口。用于执行 SQL、管理事务、接口代理。
(1)将dao接口对应的mapper文件翻译为代码
(2)代替JDBC Connection连接对象充当链接对象 内部封装的就是Connection对象
sqlSession底层封装的就是Connection
(3)控制事务
JDBC:JDBC自动控制事务
Connection.setAutoCommit(false);
Connection.commit() 提交事务
Connection.rollback();回滚事务
据库的增删改操作
Mybatis手工控制事务,不自动控制事务,没有自动控制事务,程序不出现在数据库中
查询操作Mybatis中不能控制事务
SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。
- Resource核心api
- sqlSessionFactory核心api
- sqlSession核心api
三、第一个程序(查一个)
前提:Mybatis.config.xml
核心配置文件包含了 MyBatis 最核心的设置和属性信息。如数据库的连接、事务、连接池信息等。
<?xml version="1.0" encoding="UTF-8"?>
<!--MyBatis的DTD约束-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!-- 环境设置 mysql oracle db2 sqlserver2008 default:框架当前默认使用那个环境设置 书写的是环境的id属性值-->
<environments default="mysql">
<!-- 单个数据库链接配置 id:随意 唯一-->
<environment id="mysql">
<!--transactionManager 事务控制 jdbc:原生JDBC事务控制方式 JPA:分布式事务控制-->
<transactionManager type="JDBC"></transactionManager>
<!--数据库连接池设置 type:指定使用连接池的类型 POOLED:OOMybatis框架默认连接池
框架连接池:访问操作数据库的框架具备的连接池 POOLED
容器连接池:服务器上配置的连接池 归服务器连接池 tomcat配置连接池
三方连接池:专业的一些连接池产品,用于做连接的管理【专业】 DBCP,c3po,druid(阿里旗下)
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8& useSSL=false &serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 将mapper文件路径注册到Mybatis中-->
<mappers>
<!-- mapper 引入指定的映射配置文件 resource属性指定映射配置文件的名称 -->
<mapper resource="com/tjcu/dao/StudentDaoImpl.xml"></mapper>
</mappers>
</configuration>
- 开发步骤(查1个)
开发步骤(查1个) :
1. 根据表结构,定义实体类(同JDBC)
2. 创建DAO接口(同JDBC)
3. 使用mapper映射文件,实现接口【重点】
4. 注册mapper文件(在mybatis-config.xml核心配置文件)【重点】
5. 测试
0、命令窗口创建mysql
mysql -h localhost -uroot -proot -u后面的为用户名名称 -p后面输入密码
显示出这个时证明连接数据库成功
show databases; //显示存在的数据库
use test; //test为相对应的数据库名称,表示使用某个数据库
show tables; //显示此数据库的所有表
desc book; //book为对应的表名称,此命令为展示表的字段详情
create database test; //建数据库。名字为test
CREATE DATABASE db1;
USE db1;
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT
);
INSERT INTO student VALUES (NULL,'张三',23);
INSERT INTO student VALUES (NULL,'李四',24);
INSERT INTO student VALUES (NULL,'王五',25);
SELECT * FROM student;
1.创建实体类
同JDBC。 注意:必须有 默认的公共无参构造方法!
package com.tjcu.entity;
public class Student {
private int id;
private String name;
private int age;
2.创建DAO接口
public interface StudentDao {
/**
* 根据id查询用户
* @param id
* @return Student
*/
public Student selectById(int id);
}
3.创建mapper文件
- id:唯一标识, 配合名称空间使用。
parameterType:指定参数映射的对象类型。
resultType:指定结果映射的对象类型。
- SQL 获取参数: #{属性名}
<?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" >
<mapper namespace="com.tjcu.dao.StudentDao">
<!--
id:当前实现的功能 方法名
parameterType:参数类型。可写可不写
resultType:返回值类型
#{id}:表示接收Dao参数中id的值
-->
<select id="selectById" resultType="com.tjcu.entity.Student">
select * from student where id=#{id};
</select>
</mapper>
- 多个传参
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JrvLP5yo-1634006849270)(image/1590917925968.png)]
4.在mybatis-config.xml中注册mapper文件
<!-- 将mapper文件路径注册到Mybatis中-->
<mappers>
<mapper resource="com/tjcu/dao/StudentDaoImpl.xml"></mapper>
</mappers>
5.测试
package com.tjcu.test;
import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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;
import java.io.IOException;
import java.io.InputStream;
/**
* @author 王恒杰
* @version 1.0
* @date 2021/10/11 15:05
* @email 1078993387@qq.com
* @Address 天津
* @Description:
*/
public class TestMybatis {
public static void main(String[] args) throws IOException {
// 1.加载Mybatis配置参数 核心配置文件 参数Lmybatis-config.xml的参数路径
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建sqlSessionFactory对象 构建者模式
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
// 3.获取sqlSession对象
SqlSession sqlSession = ssf.openSession();
// 4.翻译(映射)Dao接口的实现类 参数是dao接口的类对象 动态代理 多态:StudentDao接口直接引用
// 类对象获取:class.forName xxx.getClass() xxx.class
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
// 5.调用功能方法
Student student = mapper.selectById(1);
System.out.println(student);
// 6.关闭资源
if(sqlSession!=null){
sqlSession.close();
}
}
}
- 结构图
三、Mybatsi优化
1、 数据库连接配置文件引入优化
- properties标签引入外部文件
<!--引入数据库连接的配置文件-->
<properties resource="jdbc.properties"/>
- 具体使用,如下配置
<!-- property获取数据库连接的配置信息 -->
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
2、起别名优化
- typeAliases:类型别名
- typeAlias>:为全类名起别名的子标签。
- 属性
type:指定全类名
alias:指定别名
- :为指定包下所有类起别名的子标签。(别名就是类名)
- 如下图:
mybatis-config.xml具体如下配置:
<!--起别名-->
<typeAliases>
<typeAlias type="com.tjcu.entity.Student" alias="student"></typeAlias>
<!--package com.tjcu.entity;-->
</typeAliases>
StudentDaoImpl.xml具体修改配置如下:
修改前:
<select id="selectStudentByNameAndAge" resultType="com.tjcu.entity.Student">
select * from student where name=#{name} and age=#{age} ;
</select>
修改后:
<select id="selectStudentByNameAndAge" resultType="student">
select * from student where name=#{name} and age=#{age} ;
</select>
3、DAO接口中方法的参数接收
1.参数是一个
在mapper文件中接收时可以书写任意值
<select id="selectById" resultType="com.tjcu.entity.Student">
select * from student where id=#{id};
</select>
2.参数是多个(2-多)
在mapper文件中接收时需要书写参数的下标
<select id="selectUserByNameAndAge" resultType="com.tjcu.entity.Student">
select * from student where name=#{0} and age=#{1} ;
</select>
3. 参数绑定
在mapper文件中接收指定参数值时 使用的特定的名字
通过注解实现: @Param
添加位置:参数前
使用方式:@Param(“在mapper文件中接收时使用的名字”)
- StduentDao.java
public Student selectStudentByNameAndAge
(@Param(value = "name") String name, @Param(value = "age") int age);
- Studentmapper.xml
<select id="selectStudentByNameAndAge" resultType="com.tjcu.entity.Student">
select * from student where name=#{name} and age=#{age} ;
</select>
- 优化版本:@param(“name”) String name
4、mybatis的增删改&查所有
1、修改 StudnetMapper.xml配置
<update id="updateById">
update student set name=#{name},age=#{age} where id=#{id};
</update>
- 测试代码
package com.tjcu.test;
import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;
/**
* @author 王恒杰
* @version 1.0
* @date 2021/10/11 15:05
* @email 1078993387@qq.com
* @Address 天津
* @Description:
*/
public class TestMybatisUpdate {
public static void main(String[] args) throws IOException {
// 1.加载Mybatis配置参数 核心配置文件 参数Lmybatis-config.xml的参数路径
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建sqlSessionFactory对象 构建者模式
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
// 3.获取sqlSession对象
SqlSession sqlSession = ssf.openSession();
// 4.翻译(映射)Dao接口的实现类 参数是dao接口的类对象 动态代理 多态:StudentDao接口直接引用
// 类对象获取:class.forName xxx.getClass() xxx.class
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
// 5.调用功能方法
Student student = new Student(1, "王恒杰", 23);
mapper.updateById(student);
System.out.println(student);
// 增删改操作必须手动提交事务
sqlSession.commit();
// 6.关闭资源
if(sqlSession!=null){
sqlSession.close();
}
}
}
2、删除StudnetMapper.xml配置
<delete id="deleteById">
delete from student where id=#{id}
</delete>
- 测试代码
package com.tjcu.test;
import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;
/**
* @author 王恒杰
* @version 1.0
* @date 2021/10/11 15:05
* @email 1078993387@qq.com
* @Address 天津
* @Description:
*/
public class TestMybatisDelete {
public static void main(String[] args) throws IOException {
// 1.加载Mybatis配置参数 核心配置文件 参数Lmybatis-config.xml的参数路径
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建sqlSessionFactory对象 构建者模式
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
// 3.获取sqlSession对象
SqlSession sqlSession = ssf.openSession();
// 4.翻译(映射)Dao接口的实现类 参数是dao接口的类对象 动态代理 多态:StudentDao接口直接引用
// 类对象获取:class.forName xxx.getClass() xxx.class
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
// 5.调用功能方法
mapper.deleteById(1);
// 增删改操作必须手动提交事务
sqlSession.commit();
// 6.关闭资源
if(sqlSession!=null){
sqlSession.close();
}
}
}
3、增加StudnetMapper.xml配置
<insert id="insertStudent">
insert into student values(#{id},#{name},#{age})
</insert>
- 测试代码
package com.tjcu.test;
import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;
/**
* @author 王恒杰
* @version 1.0
* @date 2021/10/11 15:05
* @email 1078993387@qq.com
* @Address 天津
* @Description:
*/
public class TestMybatisInsert {
public static void main(String[] args) throws IOException {
// 1.加载Mybatis配置参数 核心配置文件 参数mybatis-config.xml的参数路径
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建sqlSessionFactory对象 构建者模式
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
// 3.获取sqlSession对象
SqlSession sqlSession = ssf.openSession();
// 4.翻译(映射)Dao接口的实现类 参数是dao接口的类对象 动态代理 多态:StudentDao接口直接引用
// 类对象获取:class.forName xxx.getClass() xxx.class
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
// 5.调用功能方法
Student student = new Student(null, "王恒杰", 23);
studentDao.insertStudent(student);
sqlSession.commit();
// 6.关闭资源
if(sqlSession!=null){
sqlSession.close();
}
}
}
4、查所有StudnetMapper.xml配置
<!--查所有-->
<select id="selectAll" resultType="student">
select * from student;
</select>
- 测试代码
package com.tjcu.test;
import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @author 王恒杰
* @version 1.0
* @date 2021/10/11 15:05
* @email 1078993387@qq.com
* @Address 天津
* @Description:
*/
public class TestMybatisSelectAll {
public static void main(String[] args) throws IOException {
// 1.加载Mybatis配置参数 核心配置文件 参数Lmybatis-config.xml的参数路径
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建sqlSessionFactory对象 构建者模式
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
// 3.获取sqlSession对象
SqlSession sqlSession = ssf.openSession();
// 4.翻译(映射)Dao接口的实现类 参数是dao接口的类对象 动态代理 多态:StudentDao接口直接引用
// 类对象获取:class.forName xxx.getClass() xxx.class
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
// 5.调用功能方法
List<Student> students = mapper.selectAll();
for (Student student : students) {
System.out.println(student);
}
// 6.关闭资源
if(sqlSession!=null){
sqlSession.close();
}
}
}
5、插入主键回填 StudnetMapper.xml配置
- Mybatis插入用户数据 同时将主键回填到指定属性中 id 主键回填【主键能自增】
<insert id="insertStudent" useGeneratedKeys="true" keyProperty="id">
insert into student values(#{id},#{name},#{age})
</insert>
- 测试代码
package com.tjcu.test;
import com.tjcu.dao.StudentDao;
import com.tjcu.entity.Student;
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 java.io.IOException;
import java.io.InputStream;
/**
* @author 王恒杰
* @version 1.0
* @date 2021/10/11 15:05
* @email 1078993387@qq.com
* @Address 天津
* @Description:
*/
public class TestMybatisInsert {
public static void main(String[] args) throws IOException {
// 1.加载Mybatis配置参数 核心配置文件 参数mybatis-config.xml的参数路径
InputStream is= Resources.getResourceAsStream("mybatis-config.xml");
// 2.创建sqlSessionFactory对象 构建者模式
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
// 3.获取sqlSession对象
SqlSession sqlSession = ssf.openSession();
// 4.翻译(映射)Dao接口的实现类 参数是dao接口的类对象 动态代理 多态:StudentDao接口直接引用
// 类对象获取:class.forName xxx.getClass() xxx.class
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
// 5.调用功能方法
Student student = new Student(null, "王恒杰", 23);
System.out.println(student.getId());//null
studentDao.insertStudent(student);
System.out.println(student.getId());//6
sqlSession.commit();
// 6.关闭资源
if(sqlSession!=null){
sqlSession.close();
}
}
}
6、模糊查询 StudnetMapper.xml配置
<!--模糊查询 -->
<select id="selectUserLikeUsername" resultType="user" >
select * from t_user where username like #{username}
</select>
- 测试代码
public void selectUserLikeUsername() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = build.openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
String str="恒";
List<User> users = mapper.selectUserLikeUsername("%"+str + "%");
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
四、核心配置文件总结
核心配置文件包含了Mybatis最核心的设置和属性信息。如数据库的链接,事务,连接池信息等。
1.<configuration>:核心根标签
2.<properties>:引入数据库链接信息配置文件标签。
3.<typeAliases>:起别名标签
4.<environments>:配置数据库环境标签
5.<environment>:配置数据库信息标签
6.<transactionManager>:事务管理标签
7.<dataSources>:数据源标签
8.<property>:数据库链接信息标签
9.<mappers>:引入映射文件配置标签
五.Mybatis传统方式开发
1、Dao层传统实现方式
- 分成思想:控制层(Controller),业务层(service),持久层(dao)
- 调用流程
2、LOG4J的配置和使用
- 在日常开发过程中,排查问题时难免需要输出 MyBatis 真正执行的 SQL 语句、参数、结果等信息,我们就可以借助 LOG4J 的功能来实现执行信息的输出。
- 使用步骤:
- 导入jar包
log4j-1.2.16.jar
log4j.rootLogger=DEBUG, stdout
# SqlMap logging configuration...
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
log4j.logger.com.ibatis.common.util.StopWatch=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
# 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