代码部分
1、User.java
package com.qingruan.bean; import java.io.Serializable; public class User implements Serializable { private Integer userId; private String userName; private String userBirthday; private String userSex; private String userAddress; @Override public String toString() { return "User{" + "userId=" + userId + ", userName='" + userName + '\'' + ", userBirthday='" + userBirthday + '\'' + ", userSex='" + userSex + '\'' + ", userAddress='" + userAddress + '\'' + '}'; } public User() { } public User(Integer userId, String userName, String userBirthday, String userSex, String userAddress) { this.userId = userId; this.userName = userName; this.userBirthday = userBirthday; this.userSex = userSex; this.userAddress = userAddress; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserBirthday() { return userBirthday; } public void setUserBirthday(String userBirthday) { this.userBirthday = userBirthday; } public String getUserSex() { return userSex; } public void setUserSex(String userSex) { this.userSex = userSex; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } }
2、IUserDao.java
package com.qingruan.dao; import com.qingruan.bean.User; import org.apache.ibatis.annotations.*; import java.util.List; @CacheNamespace(blocking = true)//mybatis基于注解方式二级缓存 public interface IUserDao { @Select("select * from user") @Results(id="userMap",value = { @Result(id=true,column = "uid",property = "userId"), @Result(column = "username",property = "userName"), @Result(column = "birthday",property = "userBirthday"), @Result(column = "sex",property = "userSex"), @Result(column = "address",property = "userAddress") }) List<User> findAllUser(); @Select("select * from user where uid=#{userId}") @ResultMap("userMap") User findByUid(Integer uid); /** * keyProperty实体类对应的属性名称 * keyColumn表示插入数据以后,返回数据表中对应的字段名称 * statement表示定义查询的子语句 * resultType返回主键的类型 * before表示在插入之前执行,由于主键自增,所以写false * @param user * @return */ @Insert("insert into user(username,birthday,sex,address) value(#{userName},#{userBirthday},#{userSex},#{userAddress})") @SelectKey(keyProperty = "userId",keyColumn = "uid",resultType = Integer.class,before = false,statement = "select last_insert_id()") int saveUser(User user); @Update("update user set username=#{userName},birthday=#{userBirthday},sex=#{userSex},address=#{userAddress} where uid =#{userId}") int updateUser(User user); @Delete("delete from user where uid=#{userId}") int deleteUser(Integer uid); @Select("select count(*) from user") int findTotal(); @Select("select * from user where username like #{userName}") List<User> findByName(String userName); }
3、mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--配置properties文件--> <properties resource="jdbc.properties"></properties> <!--指定日志引用的是log4j--> <settings> <setting name="logImpl" value="LOG4J"/> <!--开启二级缓存--> <setting name="cacheEnabled" value="true"/> </settings> <!--可以设置多个运行环境,满足不同需要,例如 开发、测试、生产环境上有不同一配置 --> <environments default="mysql"> <environment id="mysql"> <!--事务管理类型主要有jdbc和managed,前者依赖于数据源获得的连接,后者依赖于容器 --> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <!-- 如果数据库设置为UTF-8,则URL参数连接需要添加?useUnicode=true&characterEncoding=UTF-8,如下 --> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!-- 告知mybaties映射配置的位置--> <mappers> <!--一、mapper标签配置class属性 二、package标签指定dao接口所在位置 --> <package name="com.qingruan.dao"/> </mappers> </configuration>
4、jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydata1?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=1234
5、MybatisTest.java
package com.qingruan.test; import com.qingruan.bean.Dept; import com.qingruan.bean.QueryVo; import com.qingruan.dao.IDeptDao; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class MyBatisTest { private InputStream is; private SqlSessionFactoryBuilder builder; private SqlSessionFactory sessionFactory; private SqlSession session; private IDeptDao dao; @Before //在测试方法执行之前执行 public void init() throws Exception{ is=Resources.getResourceAsStream("mybatis-config.xml"); //创建sqlSessionFacotory的构建着对象 builder=new SqlSessionFactoryBuilder(); //通过构建着对象创建工厂对象 sessionFactory = builder.build(is); //获得session对象 session = sessionFactory.openSession(); //使用session创建dao接口的代理对象 dao = session.getMapper(IDeptDao.class); } @After //在测试方法执行完成之后执行 public void destroy() throws Exception{ //提交事务 增删改后一定要控制事物的提交 session.commit(); //方式资源 session.close(); is.close(); } @Test public void testFindAll() throws Exception{ //读取mybatis主配置文件 //使用dao代理对象来执行查询所有的方法 List<Dept> depts = dao.findAllDept(); for (Dept dept : depts) { System.out.println(dept.toString()); } } @Test public void testFindById(){ SqlSession sqlSession1 = sessionFactory.openSession(); IDeptDao deptDao1 = sqlSession1.getMapper(IDeptDao.class); Dept dept = deptDao1.findById(1); System.out.println("第一次查询:"+dept); sqlSession1.close();//一级缓存消失 SqlSession sqlSession2 = sessionFactory.openSession(); IDeptDao deptDao2 = sqlSession2.getMapper(IDeptDao.class); Dept dept2 = deptDao2.findById(1); System.out.println("第二次查询:"+dept2); sqlSession2.close(); //如果sqlSession执行了commit操作(增删改查),清空sqlSession中的一级缓存, //保证每一次查询的数据都是最新的数据,避免脏读 //如redis缓存 cache缓存 } @Test public void testSaveDept(){ Dept dept = new Dept(); dept.setDeptName("后勤部"); dept.setDeptLoc("北京"); int result = dao.saveDept(dept); System.out.println("插入数据的主键:"+dept.getDno()); } @Test public void testUpdateDept(){ Dept dept = dao.findById(9); dept.setDeptName("新部门"); dept.setDeptLoc("湖北"); int result = dao.updateDept(dept); System.out.println(result+"行受影响"); } @Test public void testDeleteDept(){ int result = dao.deleteDept(9); System.out.println(result+"行受影响"); } @Test public void testLikeDept(){ List<Dept> depts = dao.findByDeptName("%部%"); for (Dept dept : depts) { System.out.println(dept); } } @Test public void testFindTotal(){ int total = dao.findTotal(); System.out.println("总记录数:"+total); } @Test public void testFindByDept(){ Dept dept = new Dept(); dept.setDeptName("%部%"); dept.setDeptLoc("上海"); List<Dept> depts = dao.findByDept(dept); for (Dept dept1 : depts) { System.out.println(dept1.toString()); } } @Test public void testFindIds(){ QueryVo vo = new QueryVo(); List<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(3); ids.add(7); vo.setIds(ids); List<Dept> depts = dao.findIds(vo); for (Dept dept : depts) { System.out.println(dept.toString()); } } }
运行结果

本文介绍了如何使用Mybatis的注解进行开发,并详细讲解了配置二级缓存的过程。通过User.java实体类、IUserDao接口、mybatis-config.xml配置文件、jdbc.properties数据库连接配置以及MybatisTest测试类的代码展示,展示了完整的Mybatis注解开发及二级缓存的实现步骤。运行结果显示了操作的成功与效果。

5082

被折叠的 条评论
为什么被折叠?



