前言:Mybaits是一个ORM(对象关系映射)框架,将对象和数据表之间一一映射,使我们可以像操作对象一样操作数据。
因为本篇涉及插入数据,所以在上一篇的基础上对actor实体类增加两个构造方法
同时为了去除那些冗余的操作,将打开session的代码封装到一个方法中
public actor() {
}
public actor(Integer actor_id, String first_name, String last_name, Date last_update) {
this.actor_id = actor_id;
this.first_name = first_name;
this.last_name = last_name;
this.last_update = last_update;
}
private static SqlSession load(){
String xml="config.xml";
InputStream is=SelectActor.class.getClassLoader().getResourceAsStream(xml);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
return session;
}
一、增删改查
以下有些地方可能不太理解,如<
、 #{xxx}
等,这是小于符号,以及#取值, parameterType=“int” resultType="dao.actor"这些是输入值类型,返回值类型,文后会有讲解
select
mapper文件
<select id="actorselect" parameterType="int" resultType="dao.actor">
select * from actor where actor_id <#{xxx}
</select>
<select id="selectOne" parameterType="int" resultType="dao.actor">
select * from actor where actor_id=#{x}
</select>
java代码
@Test
public void selectOne(){
//sql语句映射,需要映射文件名加sql语句id值
String statement="mapper.map.selectOne";
SqlSession session=load();
actor name=session.selectOne(statement,3);
System.out.println(name);
}
@Test
public void actorSelect(){
//sql语句映射,需要映射文件名加sql语句id值
String statement="mapper.map.actorselect";
SqlSession session=load();
List<actor> names= session.selectList(statement,9);
System.out.println(names.get(2));
}
语句二中查询值用列表存储了,因为此时在mapper中设置了小于号,得到了一个范围的数据,除了列表还有map类型
update
mapper
这里取值用了$
符号,在处理简单类型
时使用$符号,那么值必须为value,而使用#
时可以是任意值
<update id="actorupdate" parameterType="int">
update actor set first_name="Jam" where actor_id=${value}
</update>
java代码
JDBC手动提交事务
@Test
public void actorUpdate(){
String statement="mapper.map.actorupdate";
SqlSession sqlSession=load();
int count=sqlSession.update(statement,3);
sqlSession.commit();
System.out.println("有"+count+"行受到影响");
}
delete
mapper
<delete id="actorDelete" parameterType="int">
delete from actor where actor_id=#{x}
</delete>
java代码
@Test
public void actorDelete(){
String statement="mapper.map.actorDelete";
SqlSession sqlSession=load();
int count=sqlSession.delete(statement,3);
sqlSession.commit();
System.out.println("有"+count+"行受到影响");
}
insert
mapper
在处理引用类型时,必须使用字段名
<insert id="actorInsert" parameterType="dao.actor">
insert into actor(actor_id,first_name,last_name,last_update)
values (#{actor_id},#{first_name},#{last_name},#{last_update})
</insert>
java代码
这里我们new了有个对象,吧这个对象插入了表中,所以actor中的两个构造方法是必须的
@Test
public void actorInsert(){
String statement="mapper.map.actorInsert";
SqlSession sqlSession=load();
actor name=new actor(3,"曹","jim",new Date());
int count=sqlSession.insert(statement,name);
sqlSession.commit();
System.out.println("有"+count+"行受到影响");
}
二、映射类型
parameterType="int" resultType="dao.actor" resulultMap=""
这里由两个参数,输入类型,返回类型,在Mybatis中都要写全名,但是也提供了别名,比如这里的int其实就是一个别名,是Intager的别名,mybitis已经把简单类型起好了别名,但是dao.actor
这就是全面,没有在confnig,xml
中设置别名的都要写全称,具体属性在文末
三、#和$的区别
两者在注入上有区别,以及取值用了$符号,在处理简单类型时使用,那么值必须为value,而使用#时可以是任意值
四、sql语句符号
因为sql语句写在映射文件中,而映射文件是xml文件,所以要满足xml约束
& &
< <
> >
" "
' &apos
小于等于 a<=b a <= b a <![CDATA[<= ]]>b
大于等于 a>=b a >= b a <![CDATA[>= ]]>b
不等于 a!=ba <![CDATA[ <> ]]>b a <![CDATA[!= ]]>b
如下语句
<select id="actorname" parameterType="int" resultType="dao.actor">
select * from actor where actor_id <#{xxx}
</select>
此时多个数据需要容器
List<actor> names= session.selectList(statement,18);