MyBatis做简单的增删改查,超级详细,保证一看就会
工具:
idea
环境:
mysql
步骤:
1.导入相关的jar包
2.将需要的包结构建好
3.配置文件中,配置数据库相关信息,引入mapper.xml文件
4.写sql语句
5.测试
- 单个插入
- 批量插入
- 通过id进行 查询
- 查询所有信息
- 通过username进行模糊查询
- 单个删除
- 批量删除
- 修改
准备工作先做好,导jar包,需要的项目结构
1.导入相关的jar包
这里通过maven来管理jar包,在pom.xml中进行配置
需要的jar包
mysql的包
mybayis的包
junit的测试包
<?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>org.fh</groupId>
<artifactId>mybaits_first</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>mybaits_first</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>4.1.7.RELEASE</spring.version>
<hibernate.version>4.3.11.Final</hibernate.version>
</properties>
<dependencies>
<!-- 配置mybaits-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mysql数据库的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- java单元测试框架 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.将需要的包结构建好
1.maper类
2.实体类
3.SqlMapConfig.xml文件,里边配置数据库相关的,包括引入相关的mapper文件
4.相关的mapper.xml文件
5.测试类
如图:
3.配置文件中,配置数据库相关信息,引入mapper.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">
<transactionManager type="JDBC" />
<!-- 配置数据库连接信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/1908a" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<!--引入映射文件-->
<mapper resource="mapper/userMapper.xml"/>
</mappers>
</configuration>
准备工作已做好,开始做基础的增删改查
增加
单个增加
UserMapper.java中,写一个新增的有参数,无返回值的方法
userMapper.xml文件
超级全面的注释,看不懂多看几遍,绝对明白了
userMapper.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,
namespace的值习惯上设置成【包名+sql映射文件名】,这样就能够保证namespace的值是唯一的
例如:namespace="org.fh.mapper.dept.DeptMapper"就是org.fh.mapper.dept(包名)+DeptMapper(DeptMapper.xml文件去除后缀) -->
<mapper namespace="com.fh.mapper.UserMapper">
<!--单个新增-->
<!--insert标签:定义一个插入方法
id:sql语句唯一标识
parameterType:指定传入参数类型(对应javaBean类型,写原始型会自动包装为包装类)
resultType:返回结果类型
#{}:{}中默认是model类中的属性名,占位符,起到占位作用,如果传入的是原始型,那么括号中的变量名称可以随意定义 -->
<insert id="insertUser" parameterType="com.fh.model.User" useGeneratedKeys="true" keyProperty="id">
<!-- 执行 LAST_INSERT_ID,返回自增的主键 keyProperty:keyProperty中的值与model中的id属性名保持一致
order:相当于insert语句的执行顺序,在insert前执行时before,
之后是afterresultType:keyProperty中属性的类型
可以不写
-->
<selectKey resultType="int" order="AFTER" keyProperty="userId">select LAST_INSERT_ID() </selectKey>
<!--
t_user_idea数据库表名
(user_id,user_name,user_sex)与数据库字段名一样
(#{userId},#{username},#{sex}与实体类中的属性名保持一致-->
insert into t_user_idea(user_id,user_name,user_sex) values
(#{userId},#{username},#{sex})
</insert>
</mapper>
此处用junit测试是否成功
UserMapperTest.java
@Test
public void insetUserTest() throws IOException {
//从项目的resources文件夹,获取配置信息(url,username,password,mysqlDriver,ClothingMapper.xml文件路径)
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建工厂(连接mysql数据库)
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession sqlSession=factory.openSession();
// //进行赋值
User user = new User();
// dept.setDeptId(1);
user.setUsername("部门22");
user.setSex(1);
//第一个参数:所调用的sql语句:namespace+‘.’+SqlID
//第二个参数:传入的参数
int count = sqlSession.insert("com.fh.mapper.UserMapper.insertUser",user);
//手动提交事务,因为mysql自动提交时间不确定。
sqlSession.commit();
System.out.println("插入数据条数:"+count);
//关闭session会话
sqlSession.close();
}
单个插入完成
批量插入
UserMapper.java
//批量插入
int batchInsertUser(List<User> userList);
userMapper.xml
<!--批量新增-->
<insert id="batchInsertUser" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
<!-- 执行 LAST_INSERT_ID,返回自增的主键 keyProperty:
order:相当于insert语句的执行顺序,在insert前执行时before,
之后是afterresultType:keyProperty中属性的类型
可以不写
-->
insert into t_user_idea(user_id,user_name,user_sex) values
<foreach collection="list" item="user" index="index" separator=",">
(#{user.userId},#{user.username},#{user.sex})
</foreach>
</insert>
测试
UserMapperTest.java
/**
* 批量插入
* @throws IOException
*/
@Test
public void batchInsertUserTest() throws IOException {
//从项目的resources文件夹,获取配置信息(url,username,password,mysqlDriver,ClothingMapper.xml文件路径)
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建工厂(连接mysql数据库)
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession sqlSession=factory.openSession();
// //进行赋值
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUsername("username" + i);
user.setSex(1);
userList.add(user);
}
//第一个参数:所调用的sql语句:namespace+‘.’+SqlID
//第二个参数:传入的参数
int count = sqlSession.insert("com.fh.mapper.UserMapper.batchInsertUser",userList);
//手动提交事务,因为mysql自动提交时间不确定。
sqlSession.commit();
System.out.println("插入数据条数:"+count);
//关闭session会话
sqlSession.close();
}
批量插入完成
未完待更新
通过id查询数据
UserMapper.java
//通过ID进行查询
User findUserById(Integer userId);
userMapper.xml
<!--根据id查询信息-->
<!--select标签:定义一个查询方法
id:sql语句唯一标识
parameterType:指定传入参数类型(对应javaBean类型,写原始型会自动包装为包装类)
resultType:返回结果类型
#{}:{}中默认是model类中的属性名,占位符,起到占位作用,如果传入的是原始型,那么括号中的变量名称可以随意定义 -->
<select resultType="com.fh.model.User" parameterType="integer" id="findUserById">
select user_id as userId,user_name as username,user_sex as sex from t_user_idea where user_id = #{userId}
</select>
UserMapperTest.java
@Test
public void findUserByIdTest() throws IOException {
//从项目的resources文件夹,获取配置信息(url,username,password,mysqlDriver,ClothingMapper.xml文件路径)
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建工厂(连接mysql数据库)
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession sqlSession=factory.openSession();
//第一个参数:所调用的sql语句:namespace+‘.’+SqlID
//第二个参数:传入的参数
//这里调用的是selectOne方法,只能查询一条指定的数据,
// 如果用它查询多条数据,会报异常(查询多条要用selectList)
User user = sqlSession.selectOne("com.fh.mapper.UserMapper.findUserById",11);
System.out.println(user);
//关闭session会话
sqlSession.close();
}
结果:
查询所有信息
UserMapper.java
//查询所有信息
User findAllUser();
userMapper.xml
<!--查询所有信息-->
<select resultType="com.fh.model.User" id="findAllUser">
select user_id as userId,user_name as username,user_sex as sex from t_user_idea
</select>
测试
UserMapperTest.java
/**
* 查询所有信息
* @throws IOException
*/
@Test
public void findAllUserTest() throws IOException {
//从项目的resources文件夹,获取配置信息(url,username,password,mysqlDriver,ClothingMapper.xml文件路径)
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建工厂(连接mysql数据库)
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession sqlSession=factory.openSession();
//第一个参数:所调用的sql语句:namespace+‘.’+SqlID
//第二个参数:传入的参数
//这里调用的是selectOne方法,只能查询一条指定的数据,
// 如果用它查询多条数据,会报异常(查询多条要用selectList)
List<User> userList = sqlSession.selectList("com.fh.mapper.UserMapper.findAllUser");
for (User user:userList) {
System.out.println(user);
}
//关闭session会话
sqlSession.close();
}
结果:
通过username进行模糊查询
UserMapper.java
//通过name进行模糊查询
User findUserByUserName(String username);
userMapper.xml
<!--根据username模糊查询User信息-->
<select id="findUserByUserName" resultType="com.fh.model.User" parameterType="String">
<!--
错误1:
如果使用select * from 必须保证数据库字段名和属性名保持一样
select * from t_dept where dept_name like concat("%",#{deptName},"%")
错误2:
数据库字段名和属性名不一样:通过as进行设置
select dept_id,dept_name,dept_sex from t_dept where dept_name like concat("%",#{deptName},"%")
-->
select user_id as userId,user_name as username,user_sex as sex from t_user_idea where user_name like concat("%",#{username},"%")
</select>
UserMapperTest.java
/**
* 通过name进行模糊查询
* @throws IOException
*/
@Test
public void findUserByUserNameTest() throws IOException {
String resource="SqlMapConfig.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//连接上数据库
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//开启会话
SqlSession sqlSession = factory.openSession();
//第一个参数定位带ClothingMapper.xml的findClothingByName方法
//第二个参数的是findClothingByName方法的参数
List<User> userList = sqlSession.selectList("com.fh.mapper.UserMapper.findUserByUserName","2");
for (User user:userList) {
System.out.println(user);
}
System.out.println(userList.size());
}
结果:
通过username和sex进行条件查询
UserMapper.java
//通过username和sex进行模糊查询
User queryUserByNameAndSexList(User user);
userMapper.xml
<!--条件查询-->
<select id="queryUserByNameAndSexList" parameterType="com.fh.model.User" resultType="com.fh.model.User">
<!--
错误1:
如果使用select * from 必须保证数据库字段名和属性名保持一样,这样子是查不出来数据的
select * from t_dept where dept_name like concat("%",#{deptName},"%")
错误2:
数据库字段名和属性名不一样:通过as进行设置,如下就是错误的,查不出来数据
select dept_id,dept_name,dept_sex from t_dept where dept_name like concat("%",#{deptName},"%")
-->
select user_id as userId,user_name as username,user_sex as sex from t_user_idea
<where>
<if test=" username != null and username != '' ">
and user_name like concat('%',#{username},'%')
</if>
<if test="sex != null">
and user_sex = #{sex}
</if>
</where>
</select>
测试
UserMapperTest.java
/**
* 通过username和sex进行条件查询
* @throws IOException
*/
@Test
public void queryUserByNameAndSexListTest() throws IOException {
String resource="SqlMapConfig.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//连接上数据库
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
//开启会话
SqlSession sqlSession = factory.openSession();
//模糊查询的条件
User user = new User();
user.setUsername("1");
user.setSex(1);
//第一个参数定位带ClothingMapper.xml的findClothingByName方法
//第二个参数的是findClothingByName方法的参数
List<User> userList = sqlSession.selectList("com.fh.mapper.UserMapper.queryUserByNameAndSexList",user);
for (User user1:userList) {
System.out.println(user1);
}
System.out.println(userList.size());
}
删除数据
UserMapper.java
//通过ID删除数据
void deleteUserById(Integer userId);
userMapper.xml
<!--删除数据-->
<delete id="deleteUserById" parameterType="int">
delete from t_user_idea where user_id = #{userId}
</delete>
测试
UserMapperTest.java
/**
* 删除
* @throws IOException
*/
@Test
public void deleteDeptTest() throws IOException {
//从项目的resources文件夹,获取配置信息(url,username,password,mysqlDriver,ClothingMapper.xml文件路径)
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建工厂(连接mysql数据库)
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession sqlSession=factory.openSession();
//第一个参数:所调用的sql语句:namespace+‘.’+SqlID
//第二个参数:传入的参数
//这里调用的是selectOne方法,只能查询一条指定的数据,
// 如果用它查询多条数据,会报异常(查询多条要用selectList)
sqlSession.delete("com.fh.mapper.UserMapper.deleteUserById",8);
sqlSession.commit();
//关闭session会话
sqlSession.close();
}
修改
UserMapper.java
//修改
void updateUser(User user);
userMapper.xml
<!--修改数据-->
<update id="updateUser" parameterType="com.fh.model.User">
update t_user_idea
set user_name=#{username},user_sex=#{sex}
where user_id = #{userId}
</update>
测试
UserMapperTest.java
/**
* 修改
* @throws IOException
*/
@Test
public void updateDeptTest() throws IOException {
//从项目的resources文件夹,获取配置信息(url,username,password,mysqlDriver,ClothingMapper.xml文件路径)
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建工厂(连接mysql数据库)
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession sqlSession=factory.openSession();
//第一个参数:所调用的sql语句:namespace+‘.’+SqlID
//第二个参数:传入的参数
User user = new User();
//必须写id,这样才可以修改
user.setUserId(7);
user.setUsername("张三");
user.setSex(0);
sqlSession.update("com.fh.mapper.UserMapper.updateUser",user);
sqlSession.commit();
//关闭session会话
sqlSession.close();
}
批量删除
UserMapper.java
//批量删除
int deleteUserByIds(List<Integer> idList);
userMapper.xml
<!--批量删除-->
<delete id="deleteUserByIds" parameterType="list">
delete from t_user_idea
where user_id in
<!--
open:循环开始拼接的字符
close:循环结束拼接的字符
-->
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
测试
UserMapperTest.java
/**
* 批量删除
*/
@Test
public void deleteUserByIdsTest() throws IOException {
//从项目的resources文件夹,获取配置信息(url,username,password,mysqlDriver,ClothingMapper.xml文件路径)
String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//创建工厂(连接mysql数据库)
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂创建会话
SqlSession sqlSession=factory.openSession();
ArrayList<Integer> idList = new ArrayList<>();
idList.add(13);
idList.add(14);
idList.add(15);
//第一个参数:所调用的sql语句:namespace+‘.’+SqlID
//第二个参数:传入的参数
//int row = sqlSession.deleteUserByIds("com.fh.mapper.UserMapper.deleteUserById",idList);
int row = sqlSession.delete("com.fh.mapper.UserMapper.deleteUserByIds",idList);
sqlSession.commit();
//关闭session会话
sqlSession.close();
}