MyBatis是目前java中使用最广泛的持久层框架,之前一直使用hibernate,但是它是全自动的,对于我们来说,有些sql语句还是要自己写的,所以MyBatis是半自动化的持久层框架。接下来,通过一篇文章来学会如何使用这个框架(还是那句话,学框架先不管什么原理,先把它跑起来再说,然后去学习,有代码的基础上去理解,这样会更加有效 个人建议,勿喷)
首先不管学习什么框架,要先准备好配置文件、jar包。可以去官网下载mybatis框架,里面就会一些必须的jar包,以及配置文件。下面先通过一个简单的案例使用MyBatis连接数据库。
配置文件如下:
SqlMappingConfig.xml(放在src下)
<?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>
<!--配置sql打印-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- spring整合后 environments配置将废除 使用spring中的连接池 -->
<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/jdbc?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!--加载映射文件 这里就是将和你实体类在一起的配置文件加载进来-->
<mappers>
<mapper resource="com/yxc/domain/student.xml"></mapper>
</mappers>
</configuration>
Student.java
package com.yxc.domain;
import lombok.Getter;
import lombok.Setter;
/**
* 有了这个注解以后就不需要手动添加getter和setter方法了
*/
@Setter@Getter
public class Student {
private int id;
private String name;
private int age;
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
student.xml(文件放在和student实例类同一目录下)
<?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="myTest1">
<!--查询所有
id:去一个标识符,后面会使用
resultTYpe:返回的是什么类型的数据
-->
<select id="queryAll" resultType="com.yxc.domain.Student">
select * from stu
</select>
</mapper>
测试代码
package com.yxc.test;
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;
/**
* 测试类
*/
public class MyTest1 {
public static void main(String[] args) throws IOException {
//获取一个SqlSessionFactoryBuilder对象,用来获取SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//加载配置文件
InputStream in = Resources.getResourceAsStream("SqlMappingConfig.xml");
//获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory= sqlSessionFactoryBuilder.build(in);
//最终目的获取一个数据库操作对象sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
System.out.println(sqlSession);
List<Object> students = sqlSession.selectList("queryByName1");//这里的名字就是刚刚配置文件中id
System.out.println(students);
//关闭资源
sqlSession.close();
}
}
执行结果就是将表中的所有学生信息打印出来。
我们可以发现其实基本原理还是和hibernate差不多的额,只是在少数地方变换了一下,hibernate是Session,而这边是sqlSession。关于两个框架的不同之处我们后面再说。学完以后再来总结一下所有的不同之处
在实体类中我们使用了@Setter@Getter,这样我们就不需要自己写get和set方法了,只要我们添加属性,它就会帮我们自动生成方法,使用这个主机首先要导入jar包(lombok.jar),在Idea中开发注意一定要将工程开启注解,否则工程是不会支持注解的,那么这个方法也就不会起到任何作用了,在Eclipse中开发,要安装一个插件以后导入jar包才可以使用。如果学过hibernate那么上面的代码肯定一看就可以理解,当然如果没有那么先不急着往后看,先理清一下代码,看看程序是怎么个执行流程。
下面通过我们老套路,使用MyBatis实现一个用户的增删查改的功能。
提示一下,所有数据库的操作第一步请把数据库的表建立好。
实体类
package com.yxc.domain;
import lombok.Getter;
import lombok.Setter;
/**
* 一个用户类
*/
@Setter@Getter
public class User {
private int id;
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
实体类对应的配置文件
<?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="CRUDByMyDatis">
<!--在这里面配置各种sql语句-->
<!--添加用户-->
<select id="addUser" parameterType="com.yxc.domain.User">
insert into user values(#{id},#{username},#{password})
</select>
<!--根据id删除一个用户-->
<select id="deleteUser" parameterType="int" >
delete from user where id=#{id}
</select>
<!--更新数据-->
<select id="updateUser" parameterType="com.yxc.domain.User">
update user set username=#{username} where id=#{id}
</select>
<!--根据id查询一条用户信息-->
<select id="selectUser" parameterType="int" resultType="com.yxc.domain.User">
select * from user where id=#{id}
</select>
<!--查询所有用户信息-->
<select id="selectAll" resultType="com.yxc.domain.User">
select * from user
</select>
<!--模糊查询-->
<select id="selectByName" parameterType="String" resultType="com.yxc.domain.User">
select * from user where username like '%${value}%'
</select>
</mapper>
套路,对于数据库操作我们都喜欢写一个工具类 原因就是对于有些东西整个工程是共享的,所以我们只要在类加载的时候加载一次就可以了。提高效率
package com.yxc.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;
/**
* 获取SqlSession的工具类
*/
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory=null;
static{
//创建一个SqlSessionFactoryBuilder对象,用来获取SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
//加载配置文件
InputStream in = null;
try {
in = Resources.getResourceAsStream("SqlMappingConfig.xml");
sqlSessionFactory = sqlSessionFactoryBuilder.build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 这个静态方法直接获取一个sqlsession对象
* @return
*/
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
核心配置文件(我们可以发现其实核心配置文件每一次基本不需要修改什么,如果数据库的信息改了,那么我们修改一下,然后实体类资源的引入修改一下)
<?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>
<!--配置sql打印-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- spring整合后 environments配置将废除 使用spring中的连接池 -->
<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/jdbc?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="Y13627037792" />
</dataSource>
</environment>
</environments>
<!--加载映射文件-->
<mappers>
<mapper resource="com/yxc/domain/student.xml"></mapper>
<mapper resource="com/yxc/domain/user.xml"></mapper>
</mappers>
</configuration>
测试类
测试类中main方法都没有怎么测试,这里我们使用之前就是用过的单元测试,当然还是需要导入jar包,之后直接在方法上面贴上@Test标签,而且在IDEA中要开启支持注解。要执行哪一个方法,就双击它,右击然后执行就可以执行本方法了。
package com.yxc.test;
import com.yxc.domain.User;
import com.yxc.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
/**
* 通过Mybatis来完成数据中的增删查改
*/
public class CRUDByMyDatis {
//我们这里都是用测试方法
@Test
/**新增一个用户*/
public void testAddUser(){
//获取一个sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//给定一个要添加的用户对象
User user=new User();
user.setId(5);
user.setUsername("yyy");
user.setPassword("555");
sqlSession.insert("addUser",user);
//提交事务
sqlSession.commit();
//关闭资源
sqlSession.close();
}
@Test
/**根据id删除一个用户*/
public void deleteUser(){
//获取sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
int result = sqlSession.delete("deleteUser", 5);
//同样的如果操作成功,返回1
System.out.println(result);
//提交事务然后关闭资源
sqlSession.commit();
sqlSession.close();
}
@Test
/**跟新一个用户信息*/
public void updateUser(){
//获取sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
User user=new User();
user.setId(1);
user.setUsername("yxc");
int result = sqlSession.update("updateUser", user);
System.out.println(result);
//提交事务然后关闭资源
sqlSession.commit();
sqlSession.close();
}
@Test
/**根据id查询一个用户信息*/
public void selectOneUser(){
//获取sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//查询
User user = sqlSession.selectOne("selectUser", 1);
System.out.println(user);
//对于查询语句来说不需要提交事务
sqlSession.close();
}
/**查询所有用户信息*/
@Test
public void selectAll(){
//获取sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//查询所有
List<User> allUser = sqlSession.selectList("selectAll");
System.out.println(allUser);
//对于查询语句来说不需要提交事务
sqlSession.close();
}
/**模糊查询 查询用户名中有字母x的用户
* 使用这个方法只是想让我们了解一下#{}和${}的区别
* #{}是一个占位符,${}是字符串拼接
* #{}里面填的可以是value值,也可以是实体类中属性 ${}里面只能写value
* */
@Test
public void selectByName(){
//获取sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
//模糊查询所有
List<User> allUser = sqlSession.selectList("selectByName","x");
System.out.println(allUser);
//对于查询语句来说不需要提交事务
sqlSession.close();
}
}
上面就是简单的MyBatis入门,学会如果搭建好工程环境。这样我们在学习后面的知识的时候才可以很好的学习,多动手实现,是最好的检验学习的方法。