MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
本文介绍如何使用mybatis操作mysql数据库(未使用spring)。
1、安装mysql数据库,创建表user。
建表语句:
CREATE TABLE `user` ( `id` bigint(255) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(50) DEFAULT NULL COMMENT '姓名', `age` varchar(50) DEFAULT NULL COMMENT '年龄', `sex` varchar(50) DEFAULT '性别', PRIMARY KEY (`id`), KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
2、代码中新增下列代码和配置文件:
3、修改pom.xml文件,增加mysql和mybatis依赖包:
<!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <!-- mybatis驱动包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency>
4、增加mybatis配置:
mybatisCfg.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> <!-- 指定数据库连接信息的位置 --> <properties resource="mybatisConfig/database.properties"></properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <mappers> <!--引入映射文件 --> <mapper resource="mybatis/UserMapper.xml" /> </mappers> </configuration>
database.properties:
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mytestdatabase?characterEcoding=utf-8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true username=qiaozhong password=1
5、编写mybatis工具类MybatisUtil.java:
package mybatis.mybatisUtils; import java.io.InputStream; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public abstract class MybatisUtil { private static SqlSessionFactory factory=null; public static SqlSessionFactory getSqlSessionFactory(){ if(factory==null){ // 获得环境配置文件流 InputStream config = MybatisUtil.class.getClassLoader().getResourceAsStream("mybatisConfig/mybatisCfg.xml"); // 创建sql会话工厂 factory = new SqlSessionFactoryBuilder().build(config); } return factory; } //获得会话 public static SqlSession getSession(){ return getSqlSessionFactory().openSession(true); } /** * 获得得sql会话 * @param isAutoCommit 是否自动提交,如果为false则需要sqlSession.commit();rollback(); * @return sql会话 */ public static SqlSession getSession(boolean isAutoCommit){ return getSqlSessionFactory().openSession(isAutoCommit); } }
6、创建数据表的DO文件user.java:
package mybatis.DO; public class User { private Long id; private String name; private String age; private String sex; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public String getAge() { return age; } public void setAge(String age) { this.age = age == null ? null : age.trim(); } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex == null ? null : sex.trim(); } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]"; } }
7、编写dao层接口以及dao接口的实现类:
UserMapper.java
package mybatis.dao; import java.util.List; import mybatis.DO.User; public interface UserMapper { int deleteByPrimaryKey(Long id); int insert(User record); User selectByPrimaryKey(Long id); List<User> selectAll(); int updateByPrimaryKey(User record); }
UserMapperImpl.java
package mybatis.daoImpl; import java.util.List; import mybatis.DO.User; import mybatis.dao.UserMapper; import mybatis.mybatisUtils.MybatisUtil; import org.apache.ibatis.session.SqlSession; public class UserMapperImpl implements UserMapper { /** * 实现图书类型数据访问 * */ @Override public List<User> selectAll(){ //获得会话对象 SqlSession session=MybatisUtil.getSession(); try { //通过MyBatis实现接口BookTypeDAO,返回实例 UserMapper UserMapper=session.getMapper(UserMapper.class); return UserMapper.selectAll(); } catch(Exception e){ e.printStackTrace(); return null; } finally { session.close(); } } @Override public int deleteByPrimaryKey(Long id) { //获得会话对象 SqlSession session=MybatisUtil.getSession(); try { //通过MyBatis实现接口BookTypeDAO,返回实例 UserMapper UserMapper=session.getMapper(UserMapper.class); return UserMapper.deleteByPrimaryKey(id); } catch(Exception e){ e.printStackTrace(); return 0; } finally { session.close(); } } @Override public int insert(User record) { //获得会话对象 SqlSession session=MybatisUtil.getSession(); try { //通过MyBatis实现接口BookTypeDAO,返回实例 UserMapper UserMapper=session.getMapper(UserMapper.class); return UserMapper.insert(record); } catch(Exception e){ e.printStackTrace(); return 0; } finally { session.close(); } } @Override public User selectByPrimaryKey(Long id) { //获得会话对象 SqlSession session=MybatisUtil.getSession(); try { //通过MyBatis实现接口BookTypeDAO,返回实例 UserMapper UserMapper=session.getMapper(UserMapper.class); return UserMapper.selectByPrimaryKey(id); } catch(Exception e){ e.printStackTrace(); return null; } finally { session.close(); } } @Override public int updateByPrimaryKey(User record) { //获得会话对象 SqlSession session=MybatisUtil.getSession(); try { //通过MyBatis实现接口BookTypeDAO,返回实例 UserMapper UserMapper=session.getMapper(UserMapper.class); return UserMapper.updateByPrimaryKey(record); } catch(Exception e){ e.printStackTrace(); return 0; } finally { session.close(); } } }
8、编写测试类MybatisTest.java:
package mybatis.test; import mybatis.DO.User; import mybatis.dao.UserMapper; import mybatis.daoImpl.UserMapperImpl; public class MybatisTest { public static void main(String[] args) { try { UserMapper userMapper = new UserMapperImpl(); User user = new User(); user.setId(1L); user.setName("name1"); user.setAge("25"); user.setSex("male"); userMapper.insert(user); System.out.println(1/0); User user2 = new User(); user2.setId(2L); user2.setName("name2"); user2.setAge("28"); user2.setSex("female"); userMapper.insert(user2); } catch (Exception e) { e.printStackTrace(); } } }
测试结果:
第一个insert语句成功插入数据表;执行System.out.println(1/0)语句,抛异常,不能以0为分母;第二个inset语句没有执行。
结果分析:
1、已成功连接本地数据库执行insert操作。
2、当方法抛出异常时候,第一个insert操作并没有回滚,说明没有事务管理。