作者的个人分享网:分享时刻【www.itison.cn】
MyBatis注解方式与xml文件方式配合实现单表操作、一对一
首先,配置文件configuration.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.mybatisdemo1.dao.UserDao" />
</mappers>
</configuration>
用注解的方式进行单表操作非常简单,以下是一个单表操作的实例,这种简单的单表操作直接写注解就可以,不需要进行配置resultMap映射结果集,甚至可以不需要UserDao.xml文件(但是如上在configuration.xml中映射的不是resource,而是class),增删改都是类似的相应的sql语句加上传参。
数据映射接口UserDao.java如下
package com.mybatisdemo1.dao;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.mybatisdemo1.bean.Page;
import com.mybatisdemo1.bean.User;
/**
* 数据访问接口
* @author LIU
* @version 1.0 2017-11-6
*/
public interface UserDao {
/**
* 用参数传参
*TODO
*LIU
* @param userId
* @return
*下午1:11:10
*/
@Select("select * from user where id=#{id}")
public User getUserById(@Param("id") int id);
/**
* 用对象传参
*TODO
*LIU
* @param user
* @return
*下午1:10:37
*/
@Select("select * from user where id=#{id}")
public User getUserByUser(User user);
/**
* 查询所有
*TODO
*LIU
* @return
*下午1:10:31
*/
@Select("select * from user")
public List<User> getUser();
/**
* 分页查询
*TODO
*LIU
* @param min
* @param max
* @return
*下午1:04:28
*/
@Select("select * from user limit #{start},#{currCount}")
public List<User> getUser2(Page page);
}
测试单表查询的结果:
package com.mybatisdemo1.test;
import java.io.IOException;
import java.io.InputStream;
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 com.mybatisdemo1.bean.User;
import com.mybatisdemo1.dao.UserDao;
/**
* 测试类
* @author LIU
* @version 1.0 2017-11-6
*/
public class Test {
public static void main(String[] args) {
InputStream resourceAsStream;
try {
// 读取配置文件mybatis.xml
resourceAsStream = Resources.getResourceAsStream("configuration.xml");
// 将配置文件给mybatis
SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 根据配置文件获取到一个sqlSession做数据库持久化
SqlSession sqlSession = build.openSession();
// 操作UserDao
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = mapper.getUserById(1);
System.out.println(user.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在测试的过程中,log4j.properties只是用于打印日志,可以看到执行过程和结果
log4j.properties如下:
# Rules reminder:
# DEBUG < INFO < WARN < ERROR < FATAL
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# My logging configuration...
log4j.logger.org.mybatis.jpetstore=DEBUG
## Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p %d %C: %m%n
一对一查询的时候在调用方法的时候只需要调用getUser2(int id)方法,但是插入的时候必须要先调用addIdcard(IdCard i)插入idCard表,后调用addUser2(User2 u2)插入person表
注解方式实现一对一:
package com.mybatisdemo1.dao;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.mybatisdemo1.bean.IdCard;
import com.mybatisdemo1.bean.User2;
/**
* 数据访问接口
* @author LIU
* @version 1.0 2017-11-6
*/
public interface User2Dao {
/**
* 一对一的查询
*TODO
*LIU
* @param id
* @return
*下午3:29:11
*/
@Select("select * from user where id = #{id}")
@Results(
{
@Result(column="id",property="id",id=true),
@Result(column="userName",property="userName"),
@Result(column="password",property="password"),
@Result(column="cardId",property="idCard",one=@One(select="getIdCard"))
}
)
public User2 getUser2(int id);
@Select("select * from idCard where id = #{cardId}")
@Results(
{
@Result(column="id",property="cardId",id=true),
@Result(column="num",property="num")
}
)
public IdCard getIdCard();
/**
* 联表一对一插入
*TODO
*LIU
* @param i
*下午3:28:27
*/
@Insert("insert into idcard (num) VALUES (#{num})")
@Options(useGeneratedKeys=true,keyProperty="card_id")
public void addIdcard(IdCard i);
@Insert("insert into user(userName,password,cardId) VALUES (#{username},#{age},#{idCard.cardId})")
@Options(useGeneratedKeys=true,keyProperty="id")
public void addUser2(User2 u2);
}
测试项目目录结构: