初识Mybatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
下面给出Mybatis的下载地址 github.com/mybatis/myb…
Mybatis被称为半自动框架,只需要我们编写sql语句即可,该框架可以自动完成ORM(objcet relation mapping)映射关系。相较于被称为全自动框架的Hibernate,我们可以写一些逻辑比较复杂的sql语句,也可以对sql语句进行优化。总的来说,对于从刚刚从JDBC阶段走出的我来说,甚是便利。
使用Mybatis对数据库进行操作还需要数据库驱动包,下面给出数据库驱动包的下载地址dev.mysql.com/downloads/
在选择驱动包的时候要选择与数据库版本对应的驱动包,切不可有着用新不用旧的思想,毕竟,适合自己的才是最好的。
搭建第一个Mybatis工程
一、导入驱动包
在建立一个与src同级的目录lib用来存放我们刚刚下载好的两个jar包
选中这两个jar包,右击,然后add ad library
二、配置全局的文件
在src目录下新建一个xml文件
我们一般把这个全局文件命名为SqlMapConfig.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">
<!-- 事务管理 原生的jdbc事务管理-->
<transactionManager type="JDBC"/>
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 映射器-->
<mappers>
<mapper resource="com/oracle/dao/UserDao.xml"/>
</mappers>
</configuration>
其中该部分的代码需要根据自己的数据库,更改对应的参数,大家应该已经学过JDBC连接数据库了吧
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
三、设计数据库表
数据库建立一个user表,字段信息如下图所示
在src目录下创建实体类包pojo,在实体类包中新建一个User类,user类中的属性要与数据库表中的字段对应
package com.oracle.pojo;
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
public User(Integer id,String username, String password, Integer age) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
}
public User(String username, String password, Integer age) {
this.username = username;
this.password = password;
this.age = age;
}
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
四、编写工具类
执行sql语句需要获取sqlSession对象,获取sqlSession的代码都是相同的,为了减少代码冗余,我们编写一个工具类,新建一个工具类包,在该包下新建MybatisUtil工具类,下面给出其对应的代码
package com.oracle.util;
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;
public class MybatisUtil {
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
try {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//通过mybatis的slqSession会话工厂构建者得到sqlSession会话工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//通过sqlSession会话工厂得到sqlSession
//得到的sqlSession默认是手动提交事务的,添加参数true则改为自动
sqlSession = sqlSessionFactory.openSession(true);
} catch (IOException e) {
e.printStackTrace();
}
return sqlSession;
}
}
五、设计dao层接口
在src目录下新建一个dao包,在该包中新建一个UserDao接口,下面给出UserDao接口的代码
package com.oracle.dao;
import com.oracle.pojo.User;
public interface UserDao {
public User login(String username,String password) throws Exception;
public void addUser(User user) throws Exception;
public void deleteUser(Integer id) throws Exception;
public void updateUser(User user) throws Exception;
}
六、实现dao接口
在src目录下新建一个daoImpl包,在该包中新建一个UserDaoImpl类,该类实现UserDao接口,然后实现UserDao接口中的方法。
package com.oracle.daoImpl;
import com.oracle.dao.UserDao;
import com.oracle.pojo.User;
import com.oracle.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
public class UserDaoImpl implements UserDao {
@Override
public User login(String username, String password) throws Exception {
SqlSession sqlSession = MybatisUtil.getSqlSession();
User user = new User();
user.setUsername(username);
user.setPassword(password);
User u = sqlSession.selectOne("crud.login",user);
return u;
}
@Override
public int addUser(User user) throws Exception {
SqlSession sqlSession = MybatisUtil.getSqlSession();
int a = sqlSession.insert("crud.addUser", user);
return a;
}
@Override
public int deleteUser(Integer id) throws Exception {
SqlSession sqlSession = MybatisUtil.getSqlSession();
int a = sqlSession.delete("crud.deleteUser", id);
return a;
}
@Override
public int updateUser(User user) throws Exception {
SqlSession sqlSession = MybatisUtil.getSqlSession();
int a = sqlSession.update("crud.updateUser", user);
return a;
}
}
在dao包下新建一个UserDao.xml文件,用来编写我们的sql语句
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="crud">
<select resultType="com.oracle.pojo.User" id="login">
<!--在这里写自己的sql语句,我们用#{}来代替JDBC中的?充当占位符,这里Mybatis框架会自动完成ORM映射,我们就不需要一个个的设置参数了,好方便的呢 -->
select * from `user`where username = #{username} and password = #{password}
</select>
<update id="updateUser" parameterType="com.oracle.pojo.User">
<!--入参如果是基本数据类型,可以不要写parameterType参数,但如果是自己编写的类等,必须写明入参 -->
update `user` set username = #{username}, password = #{password},age = #{age} where id = #{id}
</update>
<delete id="deleteUser" >
delete from `user` where id = #{id}
</delete>
<insert id="addUser" parameterType="com.oracle.pojo.User">
insert into user(username,password,age)values(#{username},#{password},#{age})
</insert>
</mapper>
注意Mybatis的默认需要自己手动提交事务。如果需要设置手动提交事务,我们在编写MybatisUtil的工具类时,将获取的的sqlSession对象的参数设置为true,就是这句代码啦 sqlSession = sqlSessionFactory.openSession(true);
七、编写测试类
编写单元测试类,来检验我们最后的成果,下面给出我的单元测试类样例
package com.oracle.test;
import com.oracle.dao.UserDao;
import com.oracle.daoImpl.UserDaoImpl;
import com.oracle.pojo.User;
import org.junit.Test;
public class testMybatis {
@Test
public void testLogin(){
UserDao userDao = new UserDaoImpl();
try {
User user = userDao.login("admin", "123");
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testAddUser() throws Exception {
UserDao userDao = new UserDaoImpl();
userDao.addUser(new User("张三", "12321", 18));
}
@Test
public void testDelete()throws Exception{
UserDao userDao = new UserDaoImpl();
int i = userDao.deleteUser(8);
System.out.println(i);
}
@Test
public void testUpdate() throws Exception{
UserDao userDao = new UserDaoImpl();
userDao.updateUser(new User(12,"李四","34234",20));
}
}