什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
官方推荐xml
mybatis传递多个参数
1、序号传递多个参数
Mapper
/**
* 传递单个参数
* @param id
* @return
*/
User getUserById(Integer id);
xml
<select id="getUserById" parameterType="java.lang.Integer"
resultType="com.by.pojo.User">
select * from user where id=#{id}
</select>
test
@Test
public void testGetUserById() throws IOException {
//加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
//创建sqlSession
SqlSession sqlSession = sessionFactory.openSession();
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
User user= userMapper.getUserById(43);
System.out.println(user);
}
2、注解传递多个参数---【推荐】
Mapper
/**
* 注解传递多个参数
* @param id
* @param username
* @return
*/
User getUser2(@Param("id") Integer id,@Param("username") String username);
xml
@Test
public void testGetUser2() throws IOException {
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
User user= userMapper.getUser2(43,"俞莲舟");
System.out.println(user);
}
test
@Test
public void testGetUser2() throws IOException {
//加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new
SqlSessionFactoryBuilder().build(inputStream);
//创建sqlSession
SqlSession sqlSession = sessionFactory.openSession();
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
User user= userMapper.getUser2(43,"俞莲舟");
System.out.println(user);
3、pojo传递多个参数---【推荐】
/**
* 对象传递多个参数
* @param user
* @return
*/
User getUser3(User user);
<select id="getUser3" parameterType="com.by.pojo.User" resultType="com.by.pojo.User">
select * from user where id=#{id} and username=#{username}
</select>
@Test
public void testGetUser3() throws IOException {
//加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlSession
SqlSession sqlSession = sessionFactory.openSession();
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
User userParam=new User();
userParam.setId(43);
userParam.setUsername("俞莲舟");
User user = userMapper.getUser3(userParam);
System.out.println(user);
}
4、map传递多个参数
/**
* map传递多个参数
* @param map
* @return
*/
User getUser4(Map<String,Object>map);
<select id="getUser4" parameterType="java.util.Map" resultType="com.by.pojo.User">
select * from user where id=#{id} and username=#{username}
</select>
@Test
public void testGetUser4() throws IOException {
//加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlSession
SqlSession sqlSession = sessionFactory.openSession();
UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
Map<String, Object>map=new HashMap<>();
map.put("id",43);
map.put("username","俞莲舟");
User user=userMapper.getUser4(map);
System.out.println(user);
}
5、delete
void deleteUserById(Integer id);
<delete id="deleteUserById" parameterType="java.lang.Integer">
delete form user where id=#{id}
</delete>
@Test
public void testDeleteUserById() throws IOException {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.deleteUserById(43);
sqlSession.commit();
}
6、update
void updateUserById(User user);
<update id="updateUserById" parameterType="com.by.pojo.User">
UPDATE user
SET username=#{username}, password=#{password}, birthday=#{birthday}, sex=#{sex}, address=#{address}
WHERE id=#{id}
</update>
@Test
public void testUpdateUserById(){
//加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlSession
SqlSession sqlSession = sessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("郭襄");
user.setPassword("111");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("峨眉山");
user.setId(42);
userMapper.updateUserById(user);
sqlSession.commit();
}
7、新增
void addUser(User user);
<insert id="addUser"parameterType="com.by.pojo.User">
insert into user(username,password,birthday,sex,address) VALUES(#{username},#{password},#{birthday},#{sex},#{address})
</insert>
@Test
public void testAddUser(){
//加载mybatis-config.xml
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlSession
SqlSession sqlSession = sessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("周芷若");
user.setPassword("111");
user.setBirthday(new Date());
user.setSex("女");
user.setAddress("峨眉山");
userMapper.addUser(user);
System.out.println("返回自增id:"+user.getId());
sqlSession.commit();
}
${}和#{}的区别
sql注入 底层 jdbc类型转换 单个简单类型的参数
$ 不防止 Statement 不转换 value
# 防止 preparedStatement 转换 任意
结论:除模糊匹配外,杜绝使用${}
自定义MyBatis
MyBatis运行原理图
MyBatis的核心对象
运行原理步骤图解及流程解析
MyBatis的核心对象
运行原理步骤图解及流程解析
Resources
加载配置文件,有一种是使用类加载进行加载,我们通过这个类的类加载器进行资源的加载。
List item
SqlSessionFactoryBuilder
构建SqlSessionFactory工厂对象需要的对象。采用了构建者模式,屏蔽了对象构建的细节。
SqlSessionFactory
创建SqlSession对象所用。使用工厂模式创建,目的就是解耦合。
SqlSession
创建代理对象,使用了代理模式。
Executor
操作数据库
MappedStatement
存储SQL语句、参数、输出结果类型