测试时封装代码:
public class Mytest {
private InputStream in;
private SqlSession sqlSession;
private Userdao userdao;
@Before
public void init() throws Exception {
//1.读取配置文件
in= Resources.getResourceAsStream("SqlMapConfig.xml");
//2.获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.获取Sqlsession对象
sqlSession = factory.openSession();
//4.使用Sqlsession创建接口的代理对象
userdao = sqlSession.getMapper(Userdao.class);
//Userdao userdao = sqlSession.getMapper(Userdao.class);
}
//@After
public void des() throws IOException {
//6.释放资源
sqlSession.commit();
sqlSession.close();
//in.close();
}
}
1.1查询(select)
1.1.1查询user表所有用户信息
a.在持久层添加查询方法
public interface Userdao {
//查找用户所有信息
List<User> findAll();
}
b.在用户的映射文件配置
<select id="findAll" resultType="com.pojo.User">
select * from user
</select>
c.测试
//查询所有对象
@Test
public void testfindall() throws Exception {
//56.使用代理对象查询所有方法
List<User> users = userdao.findAll();
for (User user : users) {
System.out.println(user);
}
des();
}
d.结果
1.1.2根据id查询user表中用户信息
a.在持久层添加查询方法
public interface UserDao {
User findById(Integer integer);
}
b.在用户的映射文件配置
<select id="findById" parameterType="Integer" resultType="com.pojo.User">
select * from user where id =#{
uid}
</select>
c.测试
//查询指定id
@Test
public void testfinbyid() throws Exception {
//56.使用代理对象查询所有方法
User user = userdao.findById(52);
System.out.println(user);
des();
}
1.2插入(insert)
a.在持久层添加插入方法
public interface UserDao {
//插入
void insertUser(User user);
}
b.在用户的映射文件配置
<insert id="insertUser" parameterType="com.pojo.User">
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id();
</selectKey>
insert into user (username,birthday,sex,address)values(#{
username},#{
birthday},#{
sex},#{
address})
</insert>
这样配置可以显示id。
c.测试
//插入数据
@Test
public void testinsertuser() throws Exception {
User user=new User();
user.setUsername("liuweiqi");
user.setSex("女");
user.setAddress("北京");
user.setBirthday(new Date());
userdao.insertUser(user);
des();
System.out.println(user);
}
1.3更新(update)
a.在持久层添加更新方法
public interface UserDao {
//更新
int updateUser(User user);
}
b.在用户的映射文件配置
<update id="updateUser" parameterType="com.pojo.User">
update user set username=#{
username},birthday=#{
birthday},sex=#{
sex},address=#{
address} where id=#{
id}
</update>
c.测试
@Test
public void testupdateUser() throws IOException {
User user = userdao.findById(52);
user.setUsername("傻逼");
user.setSex("公");
user.setAddress("泰国");
int res = userdao.updateUser(user);
System.out.println(res);
des();
}
1.4删除(delete)
a.在持久层添加删除方法
public interface UserDao {
//删除
int deleteUser(Integer userid);
}
b.在用户的映射文件配置
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{
id}
</delete>
c.测试
//删除指定编号
@Test
public void testdeleteUser() throws Exception {
int res = userdao.deleteUser(51);
des();
System.out.println(res);
}
2.1模糊查询第一种方式
#{username}中#{}实现向preparedStatement占位符设置值,自动进行java类型和jdbc类型转换,可以有效防止sql注入。
a.在持久层添加查询方法
public interface UserDao {
List<User> findByName(String name);
}
b.在用户的映射文件配置
<select id="findByName" parameterType="String" resultType="com.pojo.User">
select * from user where username like #{
username}
</select>
c.测试
//查询指定名字
@Test
public void testfindbyname() throws Exception {
//56.使用代理对象查询所有方法
List<User> users = userdao.findByName("%王%");
for (User user : users) {
System.out.println(user);
}
des();
}
select * from user where username like "%${value}%"
${value}是固定的,基于statement,不进行java和jdbc的类型转换。
2.3查询使用聚合函数
a.在持久层添加查询方法
public interface UserDao {
//聚合函数查询总数
int findTotal();
}
b.在用户的映射文件配置
<select id="findTotal" resultType="Integer">
select count(*) from user;
</select>
c.测试
//查询总数
@Test
public void testfindtotal() throws Exception {
int res = userdao.findTotal();
des();
System.out.println(res);
}
3.1parameterType
文档说明:将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
传递的参数可以是基本类型,也可以是引用类型,还可以是实体类型(如User),还可以是实体类的包装类。如果注册了别名,可以直接用别名。
实体类的包装类:
a.编写QueryVo
public class QueryVo implements Serializable {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
b.在持久层添加查询方法
public interface UserDao {
//根据QueryVo查询用户信息
List<User> findByVo(QueryVo vo);
}
b.在用户的映射文件配置
<select id="findByVo" resultType="user" parameterType="com.pojo.QueryVo">
select * from user where username like #{
user.username}
</select>
c.测试
//根据Vo查询所有对象
@Test
public void testfindbyvo() throws Exception {
QueryVo vo =new QueryVo();
User user =new User();
user.setUsername("%王%");
vo.setUser(user);
List<User> users = userdao.findByVo(vo);
for (User u : users) {
System.out.println(u);
}
des();
}
d.结果
3.2resultType
文档说明:期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。
支持基本类型和实体类型。如果注册了别名,可以直接用别名。
3.3resultMap
对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。
建立查询的列名和实体类名不一致时建立对应关系。
a.定义resultMap
<resultMap id="usermap" type="com.pojo.User">
<id column="id" property="userId"></id>
<result column="username" property="userName"></result>
<result column="sex" property="userSex"></result>
<result column="birthday" property="userBirthday">
<result column="address" property="userAddress"></result>
</resultMap>
<select id="findAll" resultMap="usermap">
select * from user
</select>
typeAliases
在SqlMapConfig.xml中配置
<!--指定别名-->
<typeAliases>
<!--单个别名-->
<typeAlias type="com.pojo.User" alias="user"></typeAlias>
<!--扫描整个包下的类-->
<package name="com.pojo"></package>
</typeAliases>
指定别名后就不用了再写com.pojo.User了,别名就是类名,直接写user,首字母不区分大小写了。