Mybatis注解开发步骤
1.在pom.xml中配置相应文件
1)mybatis
2)mysql-connector-java
3)log4j
4)junit
2.准备User实体类
对应数据库中的信息进行一个封装
setter:给该方法赋值
getter:可以调用该方法
tostring:返回以一个字符串表示的Number对象值,如果方法使用了原生数据类型作为参数,返回原生数据类型的String对象值
3.创建dao接口
实现各种功能如增删改查等:
List findAll(); void saveUser(User user);
4.创建配置文件
1)添加约束
2)配置环境
3)引入外部配置文件(jdbcConfig.properties、log4j.properties)
4)配置带有注解的dao所在位置
<!--配置别名-->
<typeAliases>
<package name="com.itheima.domain"></package>
</typeAliases>
<!-- 配置环境-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!-- 指定带有注解的dao接口所在位置 -->
<mappers>
<package name="com.itheima.dao"></package>
</mappers>
5.在dao中加入注解
mybatis中crud有四个注解:@select @insert @update @delete
例:@Select(“select * from account”)
List findAll();
6.生产测试类
//1.获取字节输入流
InputStream in = Resources.getResourceAsStream(“SqlMapConfig.xml”);
//2.根据字节输入流构建SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.根据SqlSessionFactory生产一个SqlSession
SqlSession session = factory.openSession();
//4.使用SqlSession获取Dao的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.执行Dao方法
List users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
或者:
private InputStream in;
private SqlSessionFactory factory;
private SqlSession session;
private IAccountDao accountDao;
@Before
public void init() throws Exception{
in = Resources.getResourceAsStream("SqlMapConfig.xml");
factory = new SqlSessionFactoryBuilder().build(in);
session = factory.openSession();
accountDao = session.getMapper(IAccountDao.class);
}
@After
public void destroy() throws Exception{
session.commit();
session.close();
in.close();
}
@Test
public void findAll(){
List<Account> accounts = accountDao.findAll();
for (Account account : accounts){
System.out.println("----每个用户信息----");
System.out.println(account);
System.out.println(account.getUser());
}
}
一对多的查询
需要在两个不同的dao中添加results注解
column为数据库字段名,porperty为实体类属性名,jdbcType为数据库字段数据类型,id为是否为主键。
@One的用法。当我们需要通过查询到的一个字段值作为参数,去执行另外一个方法来查询关联的内容,而且两者是一对一关系时,可以使用@One注解来便捷的实现。
@One的用法。当我们需要通过查询到的一个字段值作为参数,去执行另外一个方法来查询关联的内容,而且两者是一对一关系时,可以使用@One注解来便捷的实现。
@Results(id=“accountMap”,value = {
@Result(id=true,column = “id”,property = “id”),
@Result(column = “uid”,property = “uid”),
@Result(column = “money”,property = “money”),
@Result(property = “user”,column = “uid”,
one=@One(select=“com.itheima.dao.IUserDao.findById”,
fetchType= FetchType.EAGER))
})
另一个dao
@Results(id=“userMap”,value={
@Result(id=true,column = “id”,property = “userId”),
@Result(column = “username”,property = “userName”),
@Result(column = “address”,property = “userAddress”),
@Result(column = “sex”,property = “userSex”),
@Result(column = “birthday”,property = “userBirthday”),
@Result(property = “accounts”,column = “id”,
many = @Many(select = “com.itheima.dao.IAccountDao.findAccountByUid”,
fetchType = FetchType.LAZY))
})