一、Mybatis
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
二、入门实例
2.1 环境搭建
引入数据库jar包及Mybatis的核心jar包和依赖包
2.2 数据库创建
CREATE DATABASE mybatisdemo;
USE mybatisdemo;
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(10),
sex VARCHAR(4),
birthday DATE
);
INSERT INTO USER(username,sex,birthday) VALUES ('陈星星','男','1992/06/16');
INSERT INTO USER(username,sex,birthday) VALUES ('小逗逗','女','1993/11/25');
2.3 创建配置文件
src下新建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:3305/mybatisdemo" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 引入mapper文件的位置 -->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
</configuration>
sqlmap package下新建User.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">
<!-- 写sql语句的位置-->
<!-- 命名空间 ,方便和其他JavaBean类的语句名称区分-->
<mapper namespace="users">
<!-- 通过id查询用户 -->
<select id="findUserById" parameterType="Integer" resultType="cn.cf.domain.User">
select * from user where id = #{id}
</select>
</mapper>
2.4 实体类创建
User.java
package cn.cf.domain;
import java.util.Date;
public class User {
private Integer id;
private String username;
private String sex;
private Date birthday;
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + "]";
}
}
2.5 测试类创建
TestDemo.java
package cn.cf.test;
import java.io.IOException;
import java.io.InputStream;
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 org.junit.Test;
import cn.cf.domain.User;
/**
* 测试类
* @author cf
*
*/
public class TestDemo {
@Test
public void test() throws IOException {
//1.加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//2.创建工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.创建sesion
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.执行sql语句
User user = sqlSession.selectOne("users.findUserById", 1);
System.out.println(user);
}
}
结果如下:
三、其他CRUD语句
3.1 插入数据
User.xml
<!-- 添加用户 -->
<insert id="insertUser" parameterType="cn.cf.domain.User">
insert into user(username, sex, birthday)
values(#{username}, #{sex}, #{birthday});
</insert>
TestDemo.java
// 插入新用户
@Test
public void testInsertUser() throws Exception {
// 1.加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2.创建工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3.创建sesion
SqlSession sqlSession = sqlSessionFactory.openSession();
// 创建新的实体类实例
User user = new User();
user.setUsername("斯密");
user.setSex("男");
String date = "1900-10-02";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthday = sdf.parse(date);
user.setBirthday(birthday);
// 4.执行sql语句
sqlSession.insert("users.insertUser", user);
// 提交事务
sqlSession.commit();
}
3.2 修改数据
User.xml
<!-- 修改数据 -->
<update id="updateUserById" parameterType="cn.cf.domain.User">
update user
set username = #{username}, sex = #{sex}, birthday = #{birthday}
where id = #{id}
</update>
TestDemo.java
// 更新用户
@Test
public void testUpdateUser() throws Exception {
// 1.加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2.创建工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3.创建sesion
SqlSession sqlSession = sqlSessionFactory.openSession();
// 根据id查找user
User user = sqlSession.selectOne("users.findUserById", 3);
//修改user信息
user.setUsername("亚当斯密");
// 4.执行sql语句
sqlSession.update("users.updateUserById", user);
// 提交事务
sqlSession.commit();
}
3.3 删除数据
命名空间还是改回包名,上述,不改为包名出错了。
User.xml
<!-- 删除数据 -->
<delete id="deleteUserById" parameterType="Integer">
delete from user where id = #{v}
</delete>
TestDemo.java
// 删除用户
@Test
public void testDeleteUser() throws Exception {
// 1.加载核心配置文件
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2.创建工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3.创建sesion
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.执行sql语句,删除用户
sqlSession.delete("cn.cf.domain.User.deleteUserById", 3);
// 提交事务
sqlSession.commit();
}
结果:
可以看到SQL语句是写在配置文件中的,方便维护。结果集也是定义配置文件中。