文章目录
Mybatis学习
Mybatis介绍:
1 MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis
2 MyBatis 是一款优秀的持久层框架
3 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程
4 Mybatis官方文档 : http://www.mybatis.org/mybatis-3/zh/index.html
5 GitHub : https://github.com/mybatis/mybatis-3
1数据库前期工作
本次练习使用MySQL 8作为数据库:
CREATE DATABASE `mybatisdemo`;
USE `mybatisdemo`;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(20) PRIMARY KEY,
`name` varchar(30) DEFAULT NULL,
`pwd` varchar(30) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT into user(id,name,pwd) values(1,'狂神',123456),(2,'老邓','asdfgh'),(3,'Jack','qwerty');
ps:MySQL Administrator建数据库的时候,表缺省是InnoDB类型。(InnoDB是一种数据库存储引擎)
InnoDB,MyISAM 两种类型的区别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。 MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持,外键等高级数据库功能。
2Mybatis使用示例1
1、导入依赖,设置导出所有描述文件
先在父pom.xml中导入依赖(主要是:mybatis 和 mysql-connector-java )
然后导出所有描述文件(主要是com.kuang.dao下的XxMapper.xml )
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</dependencies>
ps: 在标签内若不导入此内容,则一般默认只导出scr/main/resources下的描述文件,其他的xml文件无法被输出,从而报错
2、mybatis-config.xml 配置
配置在src/main/resources 下(一般都叫这个名字,不要乱改最好):
作用是
1)连接数据库 以及
2) 在<mappers> </mappers>标签内声明所有用到的XxxMapper.xml 文件
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>
<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/mybatisdemo?serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射器,使用了哪个XxxMapper.xml都要在这里配置-->
<mappers>
<mapper resource="com/kuang/dao/UserMapper.xml"/>
</mappers>
</configuration>
注意:
1)关于<mappers> </mappers>
映射器的resource ,不是com.kuang.dao.UserMapper.xml
而是路径:com/kuang/dao/UserMapper.xml
2)关于
<property name="url" value="jdbc:mysql://localhost:3306/mybatisdemo?serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8"/>
1、MySQL 8之后都要设置serverTimezone 否则报错
2、MySQL 8之后默认useSSL=false,这是连接数据库验证的
3、& 其实就是&的转义, 在idea高版本中需要这样转义
4、useUnicode=true&characterEncoding=utf-8 设置数据库默认编码为utf-8中文字符
5、allowMultiQueries=true 允许批量操作(可以不设置)
所以以后连接MySQL配置基本可以直接复制,但注意修改url中的mybatisdemo,这是database名
3、建好基本类
1)创建实体类,
package com.kuang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
//属性名需要与数据库表中字段名相同 ! 返回result是根据类的属性名去接收数据库表中同名字段的数据记录的
private int id; //id
private String name; //姓名
private String pwd; //密码
}
注意:类的属性名需要与数据库表中字段名相同! 返回的result是根据类的属性名去接收数据库表中同名字段的数据记录的。
若不同名的话需要在mybatis-config.xml 中利用<resultMap/>来修改,可参考后面
mybatis的返回值的封装方式是先构造一个无参的对象,然后通过set方法一个一个的往里面set值,当实体类中未定义无参构造函数时虚拟机会提供一个无参构造函数。但实体类中无toString()方法时,该实体类无法被正常输出。
2)mybatis工具类 (调用mybatis-config.xml)
package com.kuang.utils;
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;
//MyBatis工具类
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession连接
public static SqlSession getSession(){
return sqlSessionFactory.openSession(true); //autoCommit:true表示自动提交事务,若无设置默认为false,增删改需要在测试类中session.commit(); 手动提交事务
}
}
创建SqlSession时可以设置是否autoCommit
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
之后需要SqlSession可以通过sqlSessionFactory.openSession()来获得,
SqlSessionFactory类似于一个POOL池,取出来的SqlSession用完后要close(),避免资源被占用
3)Mapper映射接口类
package com.kuang.dao;
import com.kuang.pojo.User;
import java.util.List;
public interface UserMapper {
// 其实就是Dao
//查询所有用户
List<User> selectUser();
//根据id搜索用户
User getUserByID(int num);
//增加用户 增删改类型都是int 这样可以返回结果集
int insertUser(User user);
//更新用户
int updateUser(Map map);
//删除
int deleteUser(int id);
//模糊查询
List<User> getUserLike(String name);
}
4)Mapper实现(xml文件形式) 以前一般用实现类方式实现接口,在mybatis中用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">
<!--namespace绑定一个对应的Dao/Mapper接口-->