使用步骤
1.导入jar包
除了mybatis的jar包外,还需要动态代理用到的jar包,数据库要用到的jar包
2.建立源代码文件夹,并在其下建立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">
<!--配置项主要有三项:别名,应用环境,mapper文件位置-->
<configuration>
<!--对完全限定名较长的类,可在这里对其起别名(一般取类名),供mapper文件使用-->
<typeAliases>
<typeAlias type="com.success.entity.User" alias="User"/>
<typeAlias type="com.success.entity.News" alias="News"/>
</typeAliases>
<!--对应用环境的配置,因为同一个项目可能需要在不同的环境下运行-->
<environments default="dev">
<!--对开发环境使用的事务管理器和数据源进行配置-->
<environment id="dev">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@198.9.1.158:1521:cnrjmam"/>
<property name="username" value="mam42"/>
<property name="password" value="password"/>
</dataSource>
</environment>
<!--对测试环境使用的事务管理器和数据源进行配置-->
<environment id="test">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mydb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--明确所有mapper文件的位置-->
<mappers>
<mapper resource="com/success/mapper/usermapper.xml"/>
<mapper resource="com/success/mapper/newsmapper.xml"/>
</mappers>
</configuration>
3.根据数据库设计在src中建立mapper包(或dao包),编写mapper文件
示例①usermapper.xml
<!--mapper包相当于DAO包,通过对它的调用来实现对数据的增删改查-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper文件的命名空间只要保证唯一性可以随意起,但如果还要写它对应的接口时,则需要规范命名-->
<mapper namespace="com.success.mapper.UserMapper">
<!--
对于select以外的三种操作,很简单:只需要采用相应的结点,写sql语句,配置id和字段类型
字段类型有两类:①int,String,long型:适用于sql语句中只需要一个变量的情况
②对象:适用于sql语句中需要多个变量的情况(sql语句引用时,只需要写其属性名)
-->
<insert id="save" parameterType="User">
INSERT INTO t_user(username,PASSWORD) VALUES(#{username},#{password})
</insert>
<delete id="del" parameterType="long">
delete from t_user where id = #{id}
</delete>
<update id="edit" parameterType="User">
update t_user set username = #{username},password = #{password} where id = #{id}
</update>
<!--
对于查询语句,分两类情况
①要查询的对象其属性中【不包含】其他对象或其他对象的集合:只使用select一个结点即可
要查询的是对象时:resultType为对象的别名
要查询的是对象集合时: resultType为对象的list
-->
<select id="findById" parameterType="long" resultType="User">
SELECT id,username,password FROM t_user WHERE id = #{id}
</select>
<!--
②要查询的对象其属性中【包含】其他对象或其他对象的集合:需要使用resultMap结点与select结点配合使用,要注意保证resultMap结点的id属性值与select的resultMap属性值相同
resultMap有id,type两个属性,结点下有四类子节点:id与result(都有column与property两个属性,前者表示sql语句查询出的结果集中的列名,后者表示对象的属性名,两者要相对应),collection(有property与ofType属性)与association(有property,column,javaType属性,column表示表格中引用其他表的列名)
包含其他对象的集合时:
-->
<select id="findByIdwithNews" parameterType="long" resultMap="findUser">
SELECT t_user.id,username,PASSWORD,t_news.id AS newsid,title,user_id
FROM
t_user LEFT JOIN t_news
ON
t_user.id = t_news.user_id
WHERE t_user.id = #{id}
</select>
<resultMap type="User" id="findUser">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<collection property="newsList" ofType="News">
<id column="newsid" property="id"/>
<result column="title" property="title"/>
<result column="user_id" property="user_id"/>
</collection>
</resultMap>
</mapper>
示例②newsmapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.success.mapper.NewsMapper">
<!-- 表示使用缓存 -->
<cache/>
<select id="findById" resultMap="findByNews" parameterType="long">
SELECT t_news.id,title,user_id,t_user.id AS userid,username,PASSWORD
FROM t_news
LEFT JOIN t_user
ON t_news.user_id = t_user.id
WHERE t_news.id = #{id}
</select>
<select id="findAll" resultType="list" resultMap="findByNews">
SELECT t_news.id,title,user_id,t_user.id AS userid,username,PASSWORD
FROM t_news
LEFT JOIN t_user
ON t_news.user_id = t_user.id
</select>
<resultMap type="News" id="findByNews">
<id property="id" column="id"/>
<result property="title" column="title"/>
<result property="user_id" column="user_id"/>
<association property="user" column="user_id" javaType="User">
<id property="id" column="userid"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</association>
</resultMap>
</mapper>
4.测试类
一种写法:
package com.success.test;
import java.io.Reader;
import java.util.List;
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.success.entity.News;
public class TestCRUD {
public static void main(String[] args) throws Exception {
Reader reder = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reder);
// true可要可省,若要,则表示每执行一次session的CRUD方法就提交一次;
// 若省去,则表示只有在调用session的commit方法后才将上面的操作一起提交。
SqlSession session = factory.openSession(true);
// 相当于一个crud方法的位置,实际上是mapper配置文件的相应结点,
// 根据id为findAll找到的,还有一个备用参数,用于传sql需要的参数
List<News> list = session.selectList("com.success.mapper.NewsMapper.findAll");
for(News news : list) {
System.out.println(news.getId() + "\t" + news.getTitle()
+ "\t" + news.getUser().getUsername());
}
//查找单个对象
/*News news = (News) session.selectOne("com.mapper.NewsMapper.findById", 1L);
System.out.println(news.getTitle());
System.out.println(news.getUser().getUsername());*/
//查找单个对象
/*
User user = (User) session.selectOne("com.mapper.UserMapper.findByIdwithNews", 1L);
System.out.println(user.getUsername());
for(News news : user.getNewsList()) {
System.out.println(news.getTitle() + "\t" + news.getId());
}
*/
//添加和删除方法
/*User user = new User();
user.setId(25);
user.setPassword("Mybatis");
user.setUsername("Struts2");
int rows = session.update("com.mapper.UserMapper.edit", user);
System.out.println(rows);*/
/*int rows = session.delete("com.mapper.UserMapper.del", 27);
System.out.println(rows);*/
session.close();
}
}
另一种写法:
public class AnotherTest {
public static void main(String[] args) throws Exception {
Reader reder = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reder);
// true可要可省,若要,则表示每执行一次session的CRUD方法就提交一次;
// 若省去,则表示只有在调用session的commit方法后才将上面的操作一起提交。为了和上边对照,这里省去
SqlSession session = factory.openSession();
User user = new User();
user.setPassword("Mybatis");
user.setUsername("springmvc");
//【这里是重点】——根据mapper文件的命名空间,建立相应的接口,要保证名称(接口名,参数类型,结果类型)一一对应
UserMapper mapper = session.getMapper(UserMapper.class);
int rows = mapper.save(user);
System.out.println(rows);
session.commit();
User user2 = mapper.findById(8);
System.out.println(user2.getUsername());
session.close();
}
}