Mybatis自定义框架(只需了解)
为了更好地了解Mybatis的运行机制,我们将自己定义一个Mybatis,
构建一个属于自己的Mybatis持久层框架,将会涉及到的一些知识点:
工厂模式(Factory 工厂模式)、
构造者模式(Builder 模式)、
代理模式,反射,自定义注解,注解的反射, xml 解析,
数据库元数据,元数据的反射等。
Mybatis运行流程分析:
Mybatis实现CRUD
在入门(一)案例中我们用Mybatis初步实现了数据查询功能,
下面我们将学习剩下的数据库功能CRUD的操作,
由于操作不是很繁琐,所以这里只贴出代码以及一些重点
添加用户
IUserDao.java
/**
* 保存用户操作
*/
void saveUser(User user);
IUserDao.xml
select last_insert_id();
INSERT INTO USER(username,address,sex,birthday)VALUES
(#{username},#{address},#{sex},#{birthday});
这里涉及到一个新的属性parameterType
用于对应数据库与实体类属性
#{}
操作符相当于我们之前values(?,?,?)
的操作,对应实体类中的属性
MybatisTest.java
@Test
public void testSaveUser() throws Exception{
User user = new User();
user.setUsername("mybatis save");
user.setAddress("这里是数据库");
user.setSex("男");
user.setBirthday(new Date());
//5.执行保存方法
userDao.saveUser(user);
//提交事务
session.commit();
}
这里切记得进行这里切记得对Sqlsession
进行数据库的事务提交,
不然数据将无法正常添加到数据库
更新用户
IUserDao.java
/**
* 更新用户
*/
void updataUser(User user);
IUserDao.xml
UPDATE user SET username=#{username},address=#{address},sex=#{sex},
birthday=#{birthday} WHERE id=#{id}
MybatisTest.java
@Test
public void testSaveUser() throws Exception{
User user = new User();
user.setId(55);
user.setUsername("mybatis save");
user.setAddress("数据库被我改啦");
user.setSex("男");
user.setBirthday(new Date());
//5.执行保存方法
userDao.updataUser(user);
}
更新操作跟添加操作差不多就不强调了
删除用户
IUserDao.java
/**
* 删除用户
*/
void deleteUser(Integer userId);
IUserDao.xml
DELETE FROM user WHERE id = #{id}
这里#{id}
因为只要一个参数,
所以无论怎么命名都与Integer userId
相对应
MybatisTest.java
@Test
public void testDeleteUser() throws Exception{
//5.执行保存方法
userDao.deleteUser(43);
}
查询一个用户
IUserDao.java
/**
* id查询用户
*/
User findById(Integer userId);
IUserDao.xml
MybatisTest.java
@Test
public void testFindOne() throws Exception{
//5.执行保存方法
User user = userDao.findById(50);
System.out.println(user);
}
模糊查询
IUserDao.java
/**
* 姓名模糊查询
*/
List findByName(String username);
IUserDao.xml
执行模糊查询时必须得到实现方法中添加%
或者使用Mybatis特有方法${value}
实现模糊查询,
但value
是固定写法不能改变其参数名,
并且这种方式内部是采用SQL语句拼接
的方式,
灵活性不高,所以不推荐使用
#{}是预编译处理,${}是字符串替换。
处理#{}
时,会将sql
中的#{}
替换为?
号,调用PreparedStatement
的set
方法来赋值;
处理${}
时,就是把${}
替换成变量的值
使用#{}
可以有效的防止SQL
注入,提高系统安全。
MybatisTest.java
public void testFindByName() throws Exception{
//5.执行保存方法
List users = userDao.findByName("%王%");
for(User user : users){
System.out.println(user);
}
}