mybatis
mybatis 是一款优秀的持久层框架
MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
持久层
Dao层,Service层,Controller层
- 完成持久化工作的代码块
- 层界限十分明显
作用
- 帮助程序员将数据存入数据库中
- 方便
- 传统jdbc太复杂。该技术简化,框架,自动化。
第一个mybatis程序
- 新建数据库
- 创建项目
- 创建模块
- 编写核心配置文件
- 编写配置类
编写代码
- 实体类
User
package com.dang.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String name;
private String pwd;
}
- Dao接口
userDao
package com.dang.dao;
import com.dang.pojo.User;
import java.util.List;
public interface UserDao {
List<User> userlist();
}
- 接口实现类
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="com.dang.dao.UserDao">
<select id="userlist" resultType="com.dang.pojo.User">
select * from db01.user
</select>
</mapper>
- 测试类
testUserDao
package com.dang;
import com.dang.dao.UserDao;
import com.dang.pojo.User;
import com.dang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class testUserDao {
@Test
public void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
List<User> list = userDao.userlist();
for (User user : list) {
System.out.println(user);
}
sqlSession.close();
}
}
- 运行结果
CRUD
namespace
namespace中的包名要和mapper一致
select
选择,查询语句;
-
id:对应namespace方法名
-
resultType:sql语句返回值
-
parameterType:参数类型
-
编写接口
/** * @return 查询所有用户 */ List<User> getuserlist(); /** * 根据id查询用户 * @param id * @return */ User getUserById(int id);
-
编写SQL语句
<select id="getuserlist" resultType="com.dang.pojo.User"> select * from db01.user </select> <select id="getUserById" resultType="com.dang.pojo.User" parameterType="int"> select * from db01.user where id= #{id} </select>
-
测试
/** * 查询所有用户 */ @Test public void test() { SqlSession sqlSession = MybatisUtils.getSqlSession(); try { Mapper userDao = sqlSession.getMapper(Mapper.class); List<User> list = userDao.getuserlist(); for (User user : list) { System.out.println(user); } } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } } /** * 根据id查询用户 */ @Test public void testgetUserById() { SqlSession sqlSession = MybatisUtils.getSqlSession(); Mapper mapper = sqlSession.getMapper(Mapper.class); User userById = mapper.getUserById(1); System.out.println(userById); sqlSession.close(); }
insert
-
编写接口
/** * 新增用户 */ int addUser(User user);
-
编写SQL语句
<insert id="addUser" parameterType="com.dang.pojo.User"> insert into db01.user(id,name,pwd)values (#{id},#{name},#{pwd}); </insert>
-
测试
/** * 增加员工 */ @Test public void testaddUser() { SqlSession sqlSession = MybatisUtils.getSqlSession(); Mapper mapper = sqlSession.getMapper(Mapper.class); int rea = mapper.addUser(new User(6, "ccc", "15558")); if (rea > 0) { System.out.println("添加成功"); } /** * 提交事务 */ sqlSession.commit(); sqlSession.close(); }
update
-
编写接口
/** * 修改用户 */ int updateUser(User user);
-
编写SQL语句
<update id="updateUser" parameterType="com.dang.pojo.User"> update db01.user set name =#{name},pwd=#{pwd} where id=#{id}; </update>
-
测试
/** * 修改员工 */ @Test public void textUpdateUser() { SqlSession sqlSession = MybatisUtils.getSqlSession(); Mapper mapper = sqlSession.getMapper(Mapper.class); mapper.updateUser(new User(6, "dang", "15586")); /** * 提交事务 */ sqlSession.commit(); sqlSession.close(); }
delete
-
编写接口
/** * 删除一个用户 */ int deleteUser(int id);
-
编写SQL语句
<delete id="deleteUser"> delete from db01.user where id=#{id}; </delete>
-
测试
/** * 删除一个员工 */ @Test public void textDeleteUser(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); Mapper mapper = sqlSession.getMapper(Mapper.class); mapper.deleteUser(6); /** * 提交事务 */ sqlSession.commit(); sqlSession.close(); }
Map
实体类或者数据库中的表,字段或者参数过多的情况下可以考虑使用Map!
/**
* 使用map新增用户
* @param map
* @return
*/
int addUser2(Map<String, Object> map);
<insert id="addUser2" parameterType="map">
insert into db01.user(id,name,pwd)values (#{userid},#{username},#{password});
</insert>
@Test
public void testaddUse2() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
Mapper mapper = sqlSession.getMapper(Mapper.class);
Map<String,Object > map=new HashMap<>();
map.put("userid",7);
map.put("username","daners");
map.put("password","16544");
mapper.addUser2(map);
/**
* 提交事务
*/
sqlSession.commit();
sqlSession.close();
}
Map传递参数,直接在sql中取出可以即可!
对象传递参数,直接在sql中取对象的属性即可!
只有一个基本类型参数的情况下,可以直接在sql中取到!
多个参数用Map或注解
模糊查询怎么写?
- java代码执行的时候,传递通配符%%
- 在sql拼接中使用通配符!