lyz的自学笔记
一、使用注解开发
1、面向接口开发
在真正的开发中,很多时候会选择面向接口编程
根本原因:解耦可扩展,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好
1、关于接口的理解
- 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离
2、 接口应有两类:
- 第一类是对一个个体的抽象,他可对应为一个抽象体
- 第二类是对一个个体某一方面的抽象,即形成一个抽象面
- 一个体有可能有多个抽象面,抽象体育抽象面是区别的
3、三个面向的区别
- 面向对象:以对象为单位,考虑他的属性和方法
- 面向过程:以一个具体的流程(事务过程)为单位,考虑它的实现
- 接口设计与非接口设计是针对复用技术而言的,与面对象向(过程)不是一个问题,更多的体现就是对系统整体的架构
2、使用注解开发
(1)、配置接口UserMapper,在抽象方法上面使用注解
@Select("select * from user")
List<User> getUsers();
(2)、因为使用的是注解开发,也就不需要映射文件了,但还是需要去mybatis配置文件中注册
<mappers>
<mapper class="com.lyz.dao.UserMapper" />
</mappers>
(3)、测试
@Test
public void Test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> users = mapper.getUsers();
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
(4)、结果,因为数据库字段名和实体类属性名不一致,导致免疫查询到password
使用注解来映射简单语句会使代码更加简洁,然而对于稍微复杂一点的语句,注解就力不从心了,并且显得更加混乱,所以如果要完成复杂的事情,最好使用XML类映射语句
3、Mybatis的执行流程
(1)创建SqlSessionFactoryBuilder实例
(2)解析配置文件流XMLConfigBuilder
(3)Configuration所有的配置信息
(4)SqlSessionFactory实例化
(5)transaction事务管理器
(6)创建executor执行器
(7)创建SqlSession
(8)实现CRUD,成功则继续下一步,不成功就会回滚
(9)查看是否成功,成功则继续,不成功就会回滚
(10)提交事务,并且关闭连接
4、使用注解实现CRUD
我们可以在工具类创建的时候设置自动提交,也就是在使用openSession()方法的时候给一个参数,值为true,但是真正开发的时候不要使用自动提交,不然可能会出现问题
例:查询
(1)修改Mybatis工具类
public static SqlSession getSqlSession(){
return sqlsessionfactory.openSession(true);
}
(2)在接口中创建一个抽象方法(当方法中有多个基本数据类型的参数时,就必须使用@Param注解为参数起别名,那么在使用sql语句的时候参数使用的必须也是自己起的别名)
@Select("select * from user where id=#{id} and name=#{name}")
User getUserById(@Param("id") int id, @Param("name") String name);
(3)测试
@Test
public void Test1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User par = mapper.getUserById(1, "张三");
System.out.println(par);
sqlSession.close();
}
(4)结果
例:插入
(1)在接口中定义一个抽象方法,使用@Insert注解实现数据的插入
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);
(2)测试
@Test
public void addUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.addUser(new User(7,"hello","123456"));
System.out.println(i);
sqlSession.close();
}
例:修改
(1)在接口中定义一个抽象方法
@Update("update user set name=#{name},pwd=#{password} where id = #{id}")
int updateUser(User user);
(2)测试
@Test
public void updateUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.updateUser(new User(7,"赵九","123456"));
System.out.println(i);
sqlSession.close();
}
例:删除
(1)在接口中定义一个删除的抽象方法
@Delete("delete from user where id = #{id}")
int deleteUser(int id);
(2)测试
@Test
public void deleteUser(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
int i = mapper.deleteUser(7);
System.out.println(i);
sqlSession.close();
}
关于@Param()注解
- 基本数据类型的参数或者String类型,需要加上(只有一个基本数据类型不用加)
- 引用数据类型不需要加
- 我们在SQL中引用的就是我们在@Param中设定的属性名