目录
- 一、用于写sql语句的注解
- 二、结果映射注解
- 三、实操案例
-
- [1. 增删改查用注解操作](#1. 增删改查用注解操作)
- [2. 多对一用注解操作 - 立即加载](#2. 多对一用注解操作 - 立即加载)
- [3. 多对一用注解操作 - 延迟加载](#3. 多对一用注解操作 - 延迟加载)
- [4. 一对多用注释操作 - 延迟加载](#4. 一对多用注释操作 - 延迟加载)
MyBatis除了可以在目录:resource -> mapper下创建配置文件,在配置文件写sql语句之外,还可以 直接在接口类中使用注解 。
一、用于写sql语句的注解
替代 XML 映射文件中的 <select>、<insert>、<update>、<delete>标签
@Select():用于写查询sql语句@Insert():用于写添加sql语句@Update():用于写修改sql语句@Delete():用于写删除sql语句
二、结果映射注解
@Results():定义结果映射@ResultMap():引用结果映射
三、实操案例
1. 增删改查用注解操作
-
SqlMapConfig.xml配置文件和jadb.properties属性配置
xml<configuration> <!--读取外部文件--> <properties resource="jdbc.properties"/> <!--开启延迟加载--> <settings> <!--开启延迟加载--> <setting name="lazyLoadingEnabled" value="true"/> <!--将积极加载改为消极加载及按需加载--> <setting name="aggressiveLazyLoading" value="false"/> <!--开启二级缓存--> <setting name="cacheEnabled" value="true"/> </settings> <!--配置类型别名--> <typeAliases> <package name="com.tx.entity"/> </typeAliases> <!--配置环境们--> <environments default="mysql"> <!--配置环境--> <environment id="mysql"> <!--配置事务的类型,使用本地事务策略--> <transactionManager type="JDBC"></transactionManager> <!--配置是否使用连接池 POOLED表示使用链接池,UNPOOLED表示不使用连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--加载映射文件--> <mappers> <package name="com.tx.mapper"/> </mappers> </configuration>bashjdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///mybatis_db jdbc.username=root jdbc.password=root -
编写UserMapper接口方法和注解
javapackage com.tx.mapper; import com.tx.entity.User; import org.apache.ibatis.annotations.*; import java.util.List; // 在mybatis中使用注解 // 注解代替USerMapper.xml文件 public interface UserMapper { // 查询所有方法 @Select(value = "select * from user") @Results(id = "userMap", value={ @Result(id = true, column = "id", property = "id"), @Result(column = "username", property = "username"), @Result(column = "birthday", property = "birthday"), @Result(column = "sex", property = "sex"), @Result(column = "address", property = "address"), }) public List<User> findAll(); // 通过id查找 @Select(value = "select * from user where id = #{uid}") @ResultMap(value = "userMap") public User findById(Integer uid); // 添加 @Insert(value="insert into user (username,birthday,sex,address) " + "values (#{username},#{birthday},#{sex},#{address})") public void insert(User user); // 修改 @Update("update user set username = #{username},birthday=#{birthday},sex=#{sex},address=#{address} where id = #{id}") public void update(User user); // 删除 @Delete("delete from user where id = #{id}") public void delete(Integer userId); // 查询数量 @Select("select count(*) from user") public Integer findByCount(); // 模糊查询 @Select("select * from user where username like #{username}") public List<User> findByUsername(String username); } -
编程测试代码
javapackage com.tx.test; import com.tx.entity.User; import com.tx.mapper.UserMapper; 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.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; public class Test01 { private InputStream in; private SqlSessionFactory factory; private SqlSession session; private UserMapper mapper; @Before public void init() throws IOException { // 加载主配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); // 创建工厂对象 factory = new SqlSessionFactoryBuilder().build(in); // 创建会话对象 session = factory.openSession(); mapper = session.getMapper(UserMapper.class); } @After public void destory() throws IOException { session.close(); in.close(); } @Test public void TestFindAll(){ List<User> list = mapper.findAll(); for (User user:list){ System.out.println(user); } } @Test public void testFindById() { User user = mapper.findById(41); System.out.println(user); } @Test public void testInsert() throws Exception { // 创建User对象 User user = new User(); user.setUsername("美美2"); user.setBirthday(new Date()); user.setSex("女"); user.setAddress("监狱"); // 保存 mapper.insert(user); session.commit(); } @Test public void testUpdate() throws Exception { // 先通过id查询 User user = mapper.findById(41); // 设置新的数据内容 user.setUsername("熊大"); user.setAddress("深林深处"); // 修改 mapper.update(user); session.commit(); } @Test public void testDelete() throws Exception { mapper.delete(42); session.commit(); } // 查询的是聚合函数 @Test public void testFindByCount() throws Exception { Integer count = mapper.findByCount(); System.out.println("总数量:"+count); } // 模糊查询 @Test public void testFindByUsername() throws Exception { // 第一种测试的方式 List<User> list = mapper.findByUsername("%王%"); for (User user : list) { System.out.println(user); } } }
2. 多对一用注解操作 - 立即加载
-
编写AccountMapper接口方法和注解
- 注意:使用user中的属性时,是property="user.username"这样调用。
javapackage com.tx.mapper; import com.tx.entity.Account; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import java.util.List; public interface AccountMapper { // 多对一查询 @Select("SELECT a.ID AS aid,a.UID,a.MONEY,u.* FROM account a,USER u WHERE a.UID = u.id") @Results(value= { @Result(id=true,column="aid",property="id"), @Result(column="uid",property="uid"), @Result(column="money",property="money"), @Result(column="id",property="user.id"), @Result(column="username",property="user.username"), @Result(column="birthday",property="user.birthday"), @Result(column="sex",property="user.sex"), @Result(column="address",property="user.address") }) public List<Account> findAll(); } -
编程测试代码
javapackage com.tx.test; import com.tx.entity.Account; import com.tx.mapper.AccountMapper; 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.IOException; import java.io.InputStream; import java.util.List; public class Test02 { private InputStream in; private SqlSessionFactory factory; private SqlSession session; @Before public void init() throws IOException { // 1. 加载主配置文件,目的是构建SqlSessionFactory对象 in = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2. 创建SqlSessionFactory(Sql会话工厂)对象 factory = new SqlSessionFactoryBuilder().build(in); // 3. 获取session对象,使用SqlSessionFactory工厂对象创建SqlSession对象 session = factory.openSession(); } @After public void destory() throws IOException { // 5. 释放资源 session.close(); in.close(); } // 4.1 多对一查询 - 立即加载 @Test public void testFindAll(){ // 4.1.1 通过session创建Mapper接口的代理对象 AccountMapper mapper = session.getMapper(AccountMapper.class); // 4.1.2 执行方法 List<Account> list = mapper.findAll(); for (Account account:list){ System.out.println(account); } }
3. 多对一用注解操作 - 延迟加载
-
编写AccountMapper1接口方法和注解
- 注意:在注释中,延迟如何写:
@Result(property = "user",javaType = User.class,column = "uid", one=@One(select = "com.tx.mapper.UserMapper.findById", fetchType = FetchType.LAZY)) - 多对一 使用的是
one=@One()
javapackage com.tx.mapper; import com.tx.entity.Account; import com.tx.entity.User; import org.apache.ibatis.annotations.One; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.mapping.FetchType; import java.util.List; public interface AccountMapper1 { // 多对一查询 @Select("select * from account") @Results(value= { @Result(id=true,column="aid",property="id"), @Result(column="uid",property="uid"), @Result(column="money",property="money"), @Result(property = "user",javaType = User.class,column = "uid", one=@One(select = "com.tx.mapper.UserMapper1.findById", fetchType = FetchType.LAZY)) }) public List<Account> findAll(); } - 注意:在注释中,延迟如何写:
-
编写UserMapper接口方法和注解
javapackage com.tx.mapper; import com.tx.entity.User; import org.apache.ibatis.annotations.Select; public interface UserMapper1 { @Select(value="select * from user where id = #{uid}") public User findById(Integer uid); } -
编程测试代码
java// 4.2 多对一查询 - 延迟加载 @Test public void testFindAll1(){ // 4.2.1 通过session创建Mapper接口的代理对象 AccountMapper1 mapper = session.getMapper(AccountMapper1.class); // 4.2.2 执行方法 List<Account> list = mapper.findAll(); for (Account account:list){ System.out.println(account.getMoney()); System.out.println(account.getUser()); } }
4. 一对多用注释操作 - 延迟加载
-
编写UserMapper2接口方法和注释
- 注意:在注释中,延迟如何写:
@Result(property = "accounts",column = "id", many = @Many(select = "com.tx.mapper.AccountMapper2.findByUId", fetchType = FetchType.LAZY)) - 一对多 使用的是
many = @Many()
javapackage com.tx.mapper; import com.tx.entity.User; import org.apache.ibatis.annotations.Many; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.mapping.FetchType; import java.util.List; public interface UserMapper2 { // 一对多 - 延迟加载 @Select(value="select * from user") @Results(id="userMap",value= { @Result(id=true,column="id",property="id"), @Result(column="username",property="username"), @Result(column="birthday",property="birthday"), @Result(column="sex",property="sex"), @Result(column="address",property="address"), @Result(property = "accounts",column = "id", many = @Many(select = "com.tx.mapper.AccountMapper2.findByUId", fetchType = FetchType.LAZY)) }) public List<User> findAll(); } - 注意:在注释中,延迟如何写:
-
编程AccountMapper2接口方法和注释
javapackage com.tx.mapper; import com.tx.entity.Account; import org.apache.ibatis.annotations.Select; import java.util.List; public interface AccountMapper2 { // 一对多 - 延迟加载 @Select("select * from account where uid = #{uid}") public List<Account> findByUId(Integer uid); } -
编写测试代码
java// 4.3 一对多查询 - 延迟加载 @Test public void testFindAll3() { UserMapper2 mapper = session.getMapper(UserMapper2.class); // 调用方法 List<User> list = mapper.findAll(); for (User user : list) { System.out.println(user.getUsername()); System.out.println(user.getAccounts()); } }