mybatis提供了接口的动态代理,使得我们可以不用创建Dao实现类就可以实现对mybatis的使用
下面是使用的实例,完成CRUD基本操作
目录结构
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.oo</groupId>
<artifactId>Maven_mybatis2</artifactId>
<version>1.0-SNAPSHOT</version>
<!--打包方式-->
<packaging>jar</packaging>
<dependencies>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13-beta-3</version>
</dependency>
</dependencies>
</project>
全局配置文件(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">
<!--mybatis 的主配置文件-->
<configuration>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="mysql">
<!-- id:唯一标识 -->
<environment id="mysql">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<!--配置连接数据库的基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/text"/>
<property name="username" value="root"/>
<property name="password" value="12345"/>
</dataSource>
</environment>
</environments>
<!--全局配置文件SqlMapConfig.xml引入IUserDao.xml 即告诉 MyBatis 到哪里去找映射文件-->
<mappers>
<mapper resource="IUserDao.xml"></mapper><!-- 使用相对于类路径的资源引用 -->
</mappers>
</configuration>
实体类实现Serializable接口(User)
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String username;
private String birthday;
private String sex;
private String address;
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 getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
一个Dao接口(IUserDao)
import java.util.List;
public interface IUserDao {
//查询所有用户信息
List<User> findAll();
//根据用户id查询用户信息
User findUserById(int num);
//添加用户
void addUser(User user);
//删除用户
void deleUserById(int num);
//更新用户
void UpdteById (User user);
//模糊查询用户
List<User> findByName(String username);
}
一个Dao接口配置文件(IUserDao.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">
<!-- mapper:根标签,namespace:命名空间,必须为DAO(IUserDao)接口的全路径 -->
<mapper namespace="IUserDao">
<!--配置 查询结果和实体类名称属性名的对应关系-->
<!--在需返回值类型时将resultType="User"替换成resultMap="userMap"-->
<!--使用该方法会多解析该段mxl,运行速度变慢,编码方便
使用在sql中as取别名方式运行效率会更快,但编码不方便-->
<resultMap id="userMap" type="User">
<!--主键字段的对应-->
<id property="id" column="id"></id>
<!--非主键字段的对应-->
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
</resultMap>
<!-- statement,内容:sql语句。id:唯一标识,需要和方法名保持一致
resultType:sql语句查询结果集的封装类型,user即为数据库中的表
-->
<select id="findAll" resultType="User">
select * from user;
</select>
<select id="findUserById" resultType="User"><!--返回类型-->
SELECT * FROM user WHERE id=#{id}
</select>
<insert id="addUser" parameterType="User"><!--parameteType为参数类型-->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER" >
select last_insert_id()
</selectKey><!--设置可以获取id-->
insert into user (username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
<delete id="deleUserById">
DELETE FROM user where id=#{id}
</delete>
<update id="UpdteById" parameterType="User">
update user set username=#{username},address=#{address},
sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
<select id="findByName" parameterType="User" resultType="User">
select * from user where username like #{username}
</select>
</mapper>
测试类(mybatisTest.java)
import com.sun.xml.internal.ws.developer.UsesJAXBContext;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLOutput;
import java.util.List;
public class MybatisTest {
private InputStream in;
private SqlSession session;
private IUserDao userDao;
@Before
public void init() throws IOException {
//1读取配置全局文件
in= Resources.getResourceAsStream("SqlMapConfig.xml");
//2创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
//3使用工厂生产SQLSession对象
session=factory.openSession();
//4使用SQLSession创建Dao接口的代理对象
userDao=session.getMapper(IUserDao.class);
}
@After
public void foot() throws IOException {
session.commit();
//6释放资源
session.close();
in.close();
}
@Test
public void findAllText(){
//5使用代理对象执行方法
List<User> users=userDao.findAll();
for(User user:users){
System.out.println(user);
}
}
@Test
public void findByIdTest(){
User use=userDao.findUserById(42);
System.out.println(use);
}
@Test
public void addUserTest(){
User user=new User();
user.setUsername("大哥大");
user.setBirthday("2000-11-11");
user.setSex("男");
user.setAddress("中国");
userDao.addUser(user);
System.out.println(user);
}
@Test
public void DelUserTest(){
List<User> users=userDao.findAll();
boolean flag=true;
for(User user:users){
if(user.getId().equals(50)){//有43id,可以成功删除
flag=false;
}
}
if(!flag){
System.out.println("删除成功");
}else{
System.out.println("删除失败,不存在该id");
}
userDao.deleUserById(50);
}
@Test
public void updateUser(){
User user =new User();
user.setId(50);
user.setUsername("dgd");
user.setAddress("广东");
user.setSex("女");
user.setBirthday("2000-11-11");
userDao.UpdteById(user);
}
@Test
public void findByName(){
List<User> user=userDao.findByName("%王%");
for(User u:user){
System.out.println(u);
}
}
}
数据库
//创建表
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名称',
`sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
`birthday` varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生日',
`address` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 60 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
//插入数据
INSERT INTO `user` VALUES (41, '老王', '男', '1937-02-27', '广东');
INSERT INTO `user` VALUES (46, '老王', '女', '2000-03-07', '北京');
INSERT INTO `user` VALUES (51, '小老弟', '男', '2001-10-10', '中国');
INSERT INTO `user` VALUES (52, '大哥大', '男', '2019-08-09', '中国');
INSERT INTO `user` VALUES (54, '大王炸', '女', '2000-11-11', 'China');
INSERT INTO `user` VALUES (59, '红烧胖大海', '男', '2010-10-20', '中国');