mybatis入门--基础CRUD操作
1 mybatis介绍
1.1 什么是mybatis
Mybatis是一个实现了java数据持久化的开源框架,简单的来说,他就是一个jdbc的封装组件Mybatis的前身是ibatis,ibatis创建于2002年,最初是apache下面的一个开源项目 2010迁移到gogole code ,并且更名为Mybatis;MyBatis是一个支持普通SQL查询(SQL语句),存储过程和高级映射的优秀持久层框架,是一个半ORM框架!
1.2 优秀的持久层框架对比
- MyBatis:半自动、支持普通sql、存储过程、高级映射
- Hibernate:全自动、支持普通sql、hql、高级映射、存储过程、非语句查询方式qbc、qbe等
- MyBatis和Hibernate对比:Hibernate易学难精,因为它是一个全自动框架,基本上所有的解析运行流程交由框架决定,程序员优化的可能性不大。而Mybatis是一个半自动框架,程序员有权力决定其中关键部分内容的sql优化。它们都是ORM框架。
1.3 mybatis的执行流程
2 .mybatis CRUD小案例
光说不练假把式(下面我们来理论联系实际写一个CRUD的小案例)
下面我们以java的maven项目为例用一个小demo形式体验一下mybatis
2.1 创建数据库
2.2 创建操作用的表
运行下面语句即可
CREATE TABLE `User` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `User` VALUES (1, 'test', 18);
INSERT INTO `User` VALUES (2, '张三', 25);
2.3 创建项目(本次采用maven项目构建)
填写完项目信息后,然后最后finish即可
2.4 在pom.xml文件导入mybatis相关依赖
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- junit测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 日志文件管理包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
注意: 导入依赖后需要对项目进行检查,是否已经成功导入maven的依赖
2.5 创建表对应的实体类User
/**
* User 表实体类
*/
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.6 创建数据源属性配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/testmybatis?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=admin
2.7 创建mybatis的mybatis-config.xml文件
注意: 文件放在resources资源文件目录下,(没有自行创建)
<?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>
<!-- 引入数据源属性配置文件 -->
<properties resource="jdbc.properties"/>
<!--对事务的管理和连接池的配置-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED"><!--POOLED:使用Mybatis自带的数据库连接池来管理数据库连接-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 此处预留下一步骤之后添加mapper映射文件 -->
</configuration>
简单解释:
- properties标签
主要用于配置数据库的连接数据 - settings 全局的配置参数
mybatis中的运行时行为设置 ,比如缓存的开启,驼峰命名的映射,延迟加载的设置等等 - plugins
mybatis需要引入的一些插件 :分页插件pageHelper - enviroments
环境配置,可以配置多种数据库连接
2.8 创建mapper映射文件
在resources文件夹下创建mapper文件夹,个mapper文件夹下创建一个UserMapper.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的详细解释 -->
<mapper namespace="user">
<!-- 查询所有用户列表 -->
<select id="getUsers" resultType="com.js.pojo.User">
SELECT ID,NAME,AGE FROM USER
</select>
<!-- 根据用户id 查询用户信息(基本数据类型传值) -->
<select id="getUserById" resultType="com.js.pojo.User" parameterType="int">
SELECT ID,NAME,AGE FROM USER WHERE ID = #{id}
</select>
<!-- 根据用户名和年龄查询用户信息(参数用user对象传入) -->
<select id="getUserByNameAndAge" parameterType="com.js.pojo.User" resultType="com.js.pojo.User">
SELECT ID,NAME,AGE FROM USER
<where>
<if test="name!=null">
AND NAME = #{name}
</if>
<if test="age!=null">
AND AGE = #{age}
</if>
</where>
</select>
<!-- 添加一个用户信息 -->
<insert id="addUser" parameterType="com.js.pojo.User" >
INSERT INTO USER (NAME,AGE) VALUES(#{name},#{age})
</insert>
<!-- 根据用户id 修改用户信息 -->
<update id="updateUser" parameterType="com.js.pojo.User">
UPDATE USER
<set>
<if test="name!=null">
NAME = #{name},
</if>
<if test="age!=null">
AGE = #{age},
</if>
</set>
WHERE ID = #{id}
</update>
<!-- 删除用户 -->
<delete id="delUser" parameterType="int">
DELETE FROM USER WHERE ID = #{id}
</delete>
</mapper>
解析:
- 命名空间(Namespaces)在之前版本的 MyBatis 中是可选的,容易引起混淆因此是没有益处的。现在的命名空间则是必须的,目的是希望能比只是简单的使用更长的完全限定名来区分语句更进一步。
- 命名空间使得你所见到的接口绑定成为可能,尽管你觉得这些东西未必用得上,你还是应该遵循这里的规定以防哪天你改变了主意。出于长远考虑,使用命名空间,并将它置于合适的 Java 包命名空间之下 ,你将拥有一份更加整洁的代码并提高了 MyBatis 的可用性。
- 命名解析:为了减少输入量,MyBatis 对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
- 1.完全限定名(比如“com.mypackage.MyMapper.se lectAllThings”)将被直接查找并且找到即用。
- 2.短名称(比如“selectAllThings”)如果全局唯一也可以作为一个单独的引用。如果不唯一,有两个或两个以上的相同名称(比如“com.foo.selectAllThings ”和“com.bar.selectAllThings”)
至此: 上面的namespace的作用暂时是标识
<select></select>:select查询语句句柄
<insert></insert>:insert插入语句句柄
<update></update>:update修改语句句柄
<delete></delete>:delete删除语句句柄
节点属性解释
1: id:表示一个sql句柄的唯一标示(相当于在jdbc的statement对象)
2: paremeterType :输入参数的类型 ,在sql语句中,通过占位符#{}来接收此参数
3:resultType: sql操作返回的结果类型
2.9 mybatis-config.xml添加mapper映射文件地址
<?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>
<!-- 引入属性文件 -->
<properties resource="jdbc.properties"/>
<!--对事务的管理和连接池的配置-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED"><!--POOLED:使用Mybatis自带的数据库连接池来管理数据库连接-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--mapping文件路径配置-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
2.10 创建BaseDao.java
/**
* baseDao 用于 创建sqlSession
*/
public class BaseDao {
/**
* 返回sqlSession
*/
protected SqlSession getSqlSession(){
String configFile = "mybatis-config.xml";
Reader reader = null;
try {
reader = Resources.getResourceAsReader(configFile);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
} catch (IOException e) {
e.printStackTrace();
}finally {
if (reader!=null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
2.11 创建UserDao.java
/**
* User 用戶dao
*/
public class UserDao extends BaseDao {
/**
* 查询打印所有用户列表
* @return
*/
public void getUsers(){
SqlSession sqlSession = getSqlSession();
List<User> users = sqlSession.selectList("user.getUsers");
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
/**
* 根据用户id 查询打印用户信息
*/
public void getUserById(int id){
SqlSession sqlSession = getSqlSession();
List<User> users = sqlSession.selectList("user.getUserById",id);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
/**
* 根据用户名和年龄查询用户信息
* @param user
*/
public void getUserByNameAndAge(User user){
SqlSession sqlSession = getSqlSession();
List<User> users = sqlSession.selectList("user.getUserByNameAndAge", user);
for (User user1 : users) {
System.out.println(user1);
}
sqlSession.close();
}
/**
* 添加用户
* @param user 添加的用户
*/
public void addUser(User user){
SqlSession sqlSession = getSqlSession();
int i = sqlSession.insert("user.addUser", user);
if (i!=0){
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
//提交事务
sqlSession.commit();
sqlSession.close();
}
/**
*根据用户id 修改用户信息
* @param user 修改的用户
*/
public void updateUser(User user){
SqlSession sqlSession = getSqlSession();
int i = sqlSession.update("user.updateUser", user);
if (i!=0){
System.out.println("修改成功!");
}else{
System.out.println("修改失败!");
}
sqlSession.commit();
sqlSession.close();
}
/**
* 根据用户id 删除用户记录
* @param id
*/
public void delUser(int id){
SqlSession sqlSession = getSqlSession();
int i = sqlSession.delete("user.delUser", id);
if (i!=0){
System.out.println("删除成功!");
}else{
System.out.println("删除失败!");
}
sqlSession.commit();
sqlSession.close();
}
}
注意: mybatis 进行增删改操作需要手动提交事务,进行commit操作!
2.12 创建Junit测试类
在test目录创建UserDaoTest.java测试类
/**
* 测试UserDao
*/
public class UserDaoTest {
/**
* 测试查询所有用户列表
*/
@Test
public void testGetUsers(){
UserDao userDao = new UserDao();
userDao.getUsers();
}
/**
* 根据id 查询用户信息
*/
@Test
public void testGetUserById(){
UserDao userDao = new UserDao();
userDao.getUserById(1);
}
/**
* 根据id 查询用户信息
*/
@Test
public void testGetUserByNameAndAge(){
UserDao userDao = new UserDao();
User user = new User();
user.setAge(18);
user.setName("test");
userDao.getUserByNameAndAge(user);
}
/**
* 添加用户
*/
@Test
public void testAddUser(){
UserDao userDao = new UserDao();
User user = new User();
user.setAge(19);
user.setName("教胜哥哥");
userDao.addUser(user);
}
/**
* 修改用户
*/
@Test
public void testUpdateUser(){
UserDao userDao = new UserDao();
User user1 = new User();
user1.setId(3);
user1.setAge(20);
user1.setName("教胜哥哥11");
userDao.updateUser(user1);
}
/**
* 删除一个用户
*/
@Test
public void testDelUser(){
UserDao userDao = new UserDao();
userDao.delUser(4);
}
}