前提:配置好Mybatis文件
增加
1.在dao接口类中填写方法:
//2.保存账户
void saveUser(User user);
2.在Resources目录下与dao接口类对应的xml文件(映射文件)中完善所需的查询语句(sql),查询条件(parameterType),查询返回类型(resultType):
<resultMap id="userMap" type="huang.domain.User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</resultMap>
<!-- 上面是自定义的结果值返回对应列表 -->
<insert id="saveUser" parameterType="huang.domain.User">
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="Integer">
select last_insert_id();
</selectKey>
insert into usertable(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address});
</insert>
注意: sql查询中,有一个查询是:
select LAST_INSERT_ID();
这个查询的目的是查询最近插入的最新ID,为了在mybaits中实现这个操作,使用了selectKey标签,通过kerPorperty指向类中的id,通过keyColum指向表中的id,然后通过order表面该方法什么时候执行,通过resultType,将查询后的结果,封装在User中的keyProperty指向的Id中。
注意: 其中出现的resultMap存在的目的是解决表中列名和java实体类中变量名不一致 其中的id标签指向表中的主键,其余的使用result标签对应,property对应类中变量名,column对应表中的列名,然后在查询中,通过resultMap属性指向该resultMap标签的id。第二种解决办法是 直接在sql查询语句中对所有的java实体类的变量名进行取别名,别名对应变量名,速度更快,但是第一种方式,效率更高
3.测试该方法:
@Test
public void testSaveUser() throws IOException {
//1。创建user,完成user赋值
User user = new User();
user.setUsername("xxx");
Date date = new Date(2000-1-24);
user.setBirthday(date);
user.setAddress("湖南省");
user.setSex("男");
//7.执行方法
System.out.println("保存操作之前"+user);
mapper.saveUser(user);
System.out.println("保存操作之后"+user);
}
@Before
public void init() throws IOException {
//2.获取配置信息,
in = Resources.getResourceAsStream("mybatisConfig.xml");
//3.读取配置信息,创建构造者
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.通过构造者创建工厂
SqlSessionFactory factory = builder.build(in);
//5.通过工厂获取session对象
session = factory.openSession();
//6.通过session对象获取mapper映射对象
mapper = session.getMapper(IUserDao.class);
}
@After
public void destory() throws IOException {
session.commit();//如果不commit事务,则表中不会有数据
//8。释放资源
in.close();
session.close();
}
查询
1.dao接口类中写方法:
//1。查询所有
// @Select("select * from usertable")
List<User> findAll();
//5.通过id查询
User findById(Integer id);
2.在映射路径下的xml文件中写mapper,如下:
<mapper namespace="huang.dao.IUserDao">
<resultMap id="userMap" type="huang.domain.User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</resultMap>
<!-- 查询所有部分-->
<select id="findAll" resultMap="userMap">
select * from usertable
</select>
<!--根据id查询-->
<select id="findById" parameterType="java.lang.Integer" resultMap="userMap">
select * from usertable where id = #{uid}
</select>
3.写测试类(去除init方法和destory方法):
public void testFindAll() throws IOException {
List<User> all = mapper.findAll();
for (User user : all) {
System.out.println(user);
}
}
@Test
public void testFindById(){
User user = mapper.findById(8);
System.out.println(user);
}
更新
1.dao层接口类中写方法:
//3.修改账号
void updateUser(User user);
2.映射文件中填写实现部分
<update id="updateUser" parameterType="huang.domain.User">
update usertable set username=#{username},address=#{address},sex=#{sex} where id =#{id};
</update>
3.填写测试类(去除初始化方法和结束方法)
@Test
public void testUpdateUser(){
User user = new User();
user.setUsername("xxx");
user.setAddress("xxx");
user.setSex("女");
user.setId(8);
mapper.updateUser(user);
}
删除
1.dao接口类中填写方法:
//4.删除账户
void deleteUser(Integer userId);
2.映射文件中填写实现部分:
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from usertable where id=#{uid};
</delete>
3.测试部分:
@Test
public void testDeleteUser(){
mapper.deleteUser(11);
}
模糊查询
1.dao接口类中填写方法:
//6.模糊查询含“川”的地址
List<User> findAddress(String address);
2.映射文件中实现方法:
<select id="findAddress" parameterType="java.lang.String" resultType="huang.domain.User">
select address from usertable where address like #{address}
</select>
3.使用时,“%”号最好不使用在映射文件中,而是调用方法时,才在参数中加上百分号;例如:
@Test
public void testFindAddress(){
List<User> users = mapper.findAddress("%川%");
for (User user : users) {
System.out.println(user);
}
}
封装查询条件进行查询
1.创建查询条件类:
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2.在dao接口类中填写方法:
//8,根据查询条件类传递参数进行查询
List<User> findByQueryVo(QueryVo vo);
3.在映射文件中实现方法:
<select id="findByQueryVo" parameterType="huang.domain.QueryVo" resultType="huang.domain.User">
select * from usertable where address like #{user.address}
</select>
使用了OGNL表达式,由parameType中填写的类,在#{}中,可以直接使用其内部的成员变量,封装查询条件的本质是将多个查询条件作为成员变量存放在一个类中,再通过#{}中的OGNL表达方式获取所需的条件
4.测试部分:
@Test
public void findByQueryVo(){
QueryVo queryVo = new QueryVo();
User user = new User();
user.setAddress("%川%");
queryVo.setUser(user);
List<User> users = mapper.findByQueryVo(queryVo);
for (User user1 : users) {
System.out.println(user1);
}
}
聚合函数的使用
1.dao接口类填写方法:
//7.聚合函数,查询所有用户的个数
int countUser();
2.映射文件中实现:
<select id="countUser" resultType="java.lang.Integer">
select count(id) from usertable
</select>
3.测试部分:
@Test
public void testCountUser(){
int countUser = mapper.countUser();
System.out.println(countUser);
}
乱码问题
问题:
解决:在mybatis的主配置文件中,设置url,在最后加上:
?useUnicode=true&characterEncoding=UTF-8
整体如下:
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8"/>
由于没有设置使用的编码方式,所以会出现乱码,只需要指定编码即可