Mybatis的注解开发
其实就是用注解代替xml文件,因为读取XML文件太慢,使用注解开发就省去了这一步很方便
单表的crud操作
首先我们会借助到一些注解
- @Results 这个使用来连接实体类的
- @Result 用来书写实体类里面的属性和数据库中字段的对应
直接写在接口里面
//@Results 等价于 resultMap
// @Result 相当于 result和id的组合
@Results(
id = "userMap",//这个就是唯一标识,后来直接使用这个标识就可以了
value = {
//主键id才有写true 不是主键的id就不要用写了
@Result ( id = true , property = "userId",column = "id"),
@Result ( property = "userName",column = "username"),
@Result ( property = "userAge",column = "age"),
@Result ( property = "userAddress",column = "address"),
@Result ( property = "userGender",column = "gender"),
@Result ( property = "userRid",column = "u_rid"),
@Result ( property = "userDid",column = "u_did"),
@Result( property = "department",
column = "u_did",
one = @One(select = "com.zhiyou100.dao.IDepartmentDao.queryDepartmentById")
)
}
)
- @Select 查询用到的注解
//查询所有的用户信息
@Select("select * from user")//但是我们实体类里面,属性和表哦字段不一样,所以不能直接匹配
List<User> queryAllUsers();
- @Insert 插入需要使用的标签
- @SelectKey 查询主键
//添加一条数据 得到新增数据的id值
@Insert("insert into user (username,age,address,gender) value(#{userName},#{userAge},#{userAddress},#{userGender}) ")
//查询主键,等价于 xml中的selectKey中的标签
// keyColumn 表示将查询结果赋值给数据库表中哪一列
// keyProperty 表示查询结果赋值给代码中的哪个对象
// resultType 填入 keyProperty 的 Java 类型 这里要填写包装类的.class
// before 可以设置为 true 或false。要运行的SQL语句。
/*
before=true表示插入之前进行查询,可以将查询结果赋给keyProperty和keyColumn,赋给keyColumn相当于更改数据库。
before=false表示先插入,再查询,这时只能将结果赋给keyProperty。
*/
//statementType 要运行的SQL语句,它的返回值通过resultType来指定
@SelectKey(keyColumn = "id" ,keyProperty = "userId" ,resultType = Integer.class ,before = false,statement = "SELECT LAST_INSERT_ID()")//SELECT LAST_INSERT_ID()意思是返回新增数据的id值
int addUser(User user);
- @Update 修改会用到的注解
//更新数据库
@Update("update user set username = #{userName},age = #{userAge},address = #{userAddress} , gender = #{userGender} where id = #{userId} ")
int updateUser(User user);
- @Delete 删除会用到的注解
//根据id值删除用户信息
@Delete("delete from user where id = #{userId}")
int deleteUserById(int id);
- @ResultMap 用来把Results带入到我们要使用的方法中
//引入上面的userMap 相当于 select 标签里面的resultMap
@ResultMap("userMap")//这样就把上面的userMap引入了
//根据id值查询信息
@Select("select * from user where id = #{id}")
User queryUserById(int id);
- @SelectProcide 实现sql的动态拼接
下面是直接取测试类里面测试直接跳过xml配置文件
/**
* 测试查询所有用户信息
*/
@Test
public void testQueryAllUsers(){
List<User> users = userDao.queryAllUsers();
for (User user : users) {
System.out.println(user);
}
}
//通过id查询
@Test
public void testQueryUserById(){
User user = userDao.queryUserById(5);
System.out.println(user);
}
//添加用户数据 问题
@Test
public void testAddUser(){
User user = new User();
user.setUserAddress("十五大街");
user.setUserAge(15);
user.setUserGender("男");
user.setUserName("马达过");
int i = userDao.addUser(user);
System.out.println("影响数据库的行数"+i);
System.out.println("新增用户id值" + user.getUserId());
}
//测试更新数据库 问题
@Test
public void testUpdateYUserById(){
User user = new User();
user.setUserName("马达不过");
user.setUserGender("女");
user.setUserAge(111);
user.setUserAddress("十四大姐");
user.setUserId(11);
int i = userDao.updateUser(user);
//根据用户名查询
List<User> users = userDao.queryUserByUserName("马");
System.out.println(users);
System.out.println(i);
}
//根据id值删除用户信息
@Test
public void testDeleteUserById(){
int i = userDao.deleteUserById(9);
System.out.println(i);
}
//测试用户总数
@Test
public void testUserTotal(){
int i = userDao.queryTotal();
System.out.println(i);
}
//测试模糊查询
@Test
public void test(){
List<User> users = userDao.queryUserByUserName("涂");
System.out.println(users);
}
private IUserDao userDao;
private InputStream is;
private SqlSession sqlSession;
@Before
public void init() throws IOException {
// 准备mybatis核心配置文件的路径 类路径 classpath 存放在本地磁盘中classes目录里面的路径
String path = "mybatis-config.xml";
// 使用mybatis内置IO类 Resources
is = Resources.getResourceAsStream(path);
// 通过构建者类去构建SqlSessionFactory工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
// 通过工厂生产SqlSession对象
//sqlSession = factory.openSession(true);// setAutoCommit(false) ---> start transaction
sqlSession = factory.openSession();// setAutoCommit(false) ---> start transaction
// 使用SqlSession对象 调用getMapper方法 获取对应接口代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After
public void release() throws IOException {
sqlSession.commit(); // 提交事务 让修改的数据进行持久化,存储到磁盘中
is.close();
sqlSession.close();
}