一.编程背景情况:
1.数据库:Mysql数据库
2.数据库表结构:userinfo表 列名:userid(主键),username,sex,birthday
3.Userinfo.java类。代码如下:
package com.xuexue.model.po;
import java.sql.Date;
public class Userinfo {
private Integer userid;
private String username;
private String sex;
private double sal;
private Date birthday;
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
二.代码实例:
1. 单个入参,返回值是一个对象
1.1 定义一个接口UserinfoMapper.java,写一个方法,根据userid查询出某个用户。代码如下:
public interface UserinfoMapper {
public Userinfo getUserinfoById(int userid);
}
一个表对应一个接口,一个接口对应一个xml文件,写在一个包内,xml文件命名一般与接口名相同
1.2 写一个与UserinfoMapper.java对应的UserinfoMapper.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.xuexue.model.mapp.UserinfoMapper">
<!--与UserinfoMapper.java连接 namespace属性的命名:包名.类名不带.java-->
<!--id="方法名" parameterType="传参的数据类型" resultType="返回值得数据类型"-->
<select id="getUserinfoById" parameterType="int" resultType="Userinfo">
select * from userinfo where userid=#{userid} <!-- sql语句 -->
</select>
</mapper>
注:查询的sql语句,用select标签,修改-->update,删除-->delete
1.3 写一个测试类,测试查询结果。代码如下:
//省略引包代码
public class Test1 {
public static void main(String[] args) {
//1.配置文件流,传参是MyBitis的配置文件
InputStream inputStream=null;
try {
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建session工厂,传参是配置MyBitis的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
//3.通过session获得接口的实现类
UserinfoMapper userinfoMapper = session.getMapper(UserinfoMapper.class);
//4.调用实现类方法
Userinfo u=userinfoMapper.getAllUserinfoById(1);
System.out.println(u.getUsername());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2. 没有入参,返回值是一个集合
2.1 在UserinfoMapper.java的接口中定义一个方法,查询出全部用户。代码如下:
public List<Userinfo> getAllUserinfo();
2.2 在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<select id="getAllUserinfo" resultType="Userinfo">
select * from userinfo<!-- sql语句 -->
</select>
注:没有传参,不用写parameterType属性
2.3 写一个测试类,测试查询结果。代码如下:
public class Test2 {
public static void main(String[] args) {
//1.配置文件流,传参是MyBitis的配置文件
InputStream inputStream=null;
try {
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建session工厂,传参是配置MyBitis的信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
//3.通过session获得接口的实现类
UserinfoMapper userinfoMapper = session.getMapper(UserinfoMapper.class);
//4.调用实现类方法
//声明一个list集合,调用对应方法,获得一个Userinfo类型的list集合
List<Userinfo> list=userinfoMapper.getAllUserinfo();
//遍历集合
for(Userinfo u:list){
System.out.println(u.getSal());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.模糊查询
3.1在UserinfoMapper.java的接口中定义一个方法,按照名字模糊查询出用户。代码如下:
public Userinfo getAllUserinfoByName(String username);
3.2在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<select id="getAllUserinfoByName" parameterType="string" resultType="Userinfo">
select * from userinfo where username like "%"#{username}"%"
</select>
注:注意模糊查询的sql语句的写法:"%"#{username}"%"
3.3写一个测试类,测试查询结果。代码如下:
//仅列出测试的代码
Userinfo u=userinfoMapper.getAllUserinfoByName("lixue");
System.out.println(u.getSal());
4.多个参数
4.1在UserinfoMapper.java的接口中定义一个方法,按照username和sex查找用户。代码如下:
public Userinfo getAllUserByCondition(String username,String sex);
4.2在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<!-- ###多参数,不写 parameterType,用0,1代表是方法中的第几个参数-->
<select id="getAllUserByCondition" resultType="Userinfo">
select * from userinfo where username=#{0} and sex=#{1}
</select>
4.3写一个测试类,测试查询结果。代码如下:
Userinfo u=userinfoMapper.getAllUserByCondition("lixue","w");
System.out.println(u.getSal());
5.传参是Map
5.1在UserinfoMapper.java的接口中定义一个方法,查询所有用户。代码如下:
public Userinfo getAllUserByCondition2(Map m);
5.2在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<!--入参是map-->
<select id="getAllUserByCondition2" parameterType="map" resultType="Userinfo">
select * from userinfo where username=#{username} and sex=#{sex}<!-- sql语句 -->
</select>
注:#{username}中的username是map中的key的名字
5.3写一个测试类,测试查询结果。代码如下:
Map m= new HashMap();
m.put("username", "lixue");
m.put("sex", "w");
Userinfo u=userinfoMapper.getAllUserByCondition2(m);
System.out.println(u.getSal());
6.入参是对象
6.1在UserinfoMapper.java的接口中定义一个方法,查询所有用户。代码如下:
public Userinfo getAllUserByCondition3(Userinfo u);
6.2在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<!-- 入参是对象 -->
<select id="getAllUserByCondition3" parameterType="Userinfo" resultType="Userinfo">
select * from userinfo where username=#{username} and sex=#{sex}
</select>
6.3写一个测试类,测试查询结果。代码如下:
Userinfo userinfo=new Userinfo();
userinfo.setUsername("lixue");
userinfo.setSex("w");
Userinfo u=userinfoMapper.getAllUserByCondition3(userinfo);
System.out.println(u.getSal());
7.添加用户
7.1在UserinfoMapper.java的接口中定义一个方法,添加用户。代码如下:
public void addUser(Userinfo u);
7.2在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<insert id="addUser" parameterType="Userinfo">
insert into userinfo values(null,#{username},#{sex},#{sal},#{birthday})
<!-- selectKey可以返回刚刚插入的数据的递增序列值keyProperty="id" 返回到Userinfo中的那个属性中 order有两个值,after,before,在插入语句的前面,或者是后面执行-->
<selectKey keyProperty="userid" order="AFTER" resultType="int">
select LAST_INSERT_ID()
</selectKey>
</insert>
7.3写一个测试类,测试查询结果。代码如下:
public class test8 {
@SuppressWarnings("null")
public static void main(String[] args) {
//1.创建一个sqlsessionfactory(用来创建数据库连接的)
InputStream inputStream=null;
SqlSession session = null;
try {
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.用过工程创建数据库连接
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
session = sqlSessionFactory.openSession();
//3.通过session获得接口的实现类,
UserinfoMapper userinfoMapper = session.getMapper(UserinfoMapper.class);
//4.调用实现类方法
Userinfo u= new Userinfo();
u.setUsername("xuemei");
u.setSal(10000);
u.setSex("m");
u.setBirthday(Date.valueOf("1995-12-12"));
userinfoMapper.addUser(u);
System.out.println(u.getUserid());
session.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.rollback();
}
}
}
注:手动提交,写上commit。rollback方法
8.修改用户信息
8.1在UserinfoMapper.java的接口中定义一个方法,修改用户。代码如下:
public void updateUser(Userinfo u);
8.2在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<update id="updateUser" parameterType="Userinfo">
update userinfo set username=#{username},sal=#{sal} where userid=#{userid}
</update>
8.3写一个测试类,测试查询结果。代码如下:
Userinfo u=new Userinfo();
u.setUsername("amei");
u.setSal(50000);
u.setUserid(2);
userinfoMapper.updateUser(u);
//同样需要提交和回滚方法,与添加用户一样,此处略去
9.删除用户
9.1在UserinfoMapper.java的接口中定义一个方法,删除用户。代码如下:
public void deleteUser(Userinfo u);
9.2在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<delete id="deleteUser" parameterType="int">
delete from userinfo where userid=#{userid}
</delete>
9.3写一个测试类,测试查询结果。代码如下:
Userinfo u=new Userinfo();
u.setUserid(2);
userinfoMapper.deleteUser(u);
//同样需要提交和回滚方法,与添加用户一样,此处略去
10.条件查询,动态拼接
10.1 在UserinfoMapper.java的接口中定义一个方法,查询用户。代码如下:
public List<Userinfo> getAllUserByCondition4(Userinfo u);
10.2 在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<select id="getAllUserByCondition4" parameterType="Userinfo" resultType="Userinfo">
select * from userinfo
<where>
<if test="userid!=null and userid!=''">
and userid=#{userid}
</if>
<if test="username!='' and username!=null">
and username=#{username}
</if>
<if test="sex!='' and sex!=null">
nd sex=#{sex}
</if>
<if test="sal!=null and sal!=''">
and sal=#{sal}
</if>
<if test="birthday!='' and birthday!=null">
and birthday=#{birthday}
</if>
</where>
</select>
注:在写拼接条件的时候不用加“,”MyBitis框架会自动添加
10.3 写一个测试类,测试查询结果。代码如下:
Userinfo u= new Userinfo();
u.setUserid(1);
List<Userinfo> list=userinfoMapper.getAllUserByCondition4(u);
for(Userinfo user:list){
System.out.println(user.getSal());
}
11.条件查询,动态拼接
11.1在UserinfoMapper.java的接口中定义一个方法,修改用户。代码如下:
public void updateUser2(Userinfo u);
11.2在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<update id="updateUser2" parameterType="Userinfo">
update userinfo
<set>
<if test="username!=null and username!=''">
username=#{username},
</if>
<if test="sex!=null and sex!=''">
sex=#{sex},
</if>
<if test="sal!=null and sal!=''">
sal=#{sal},
</if>
<if test="birthday!=null and birthday!=''">
birthday=#{birthday},
</if>
</set>
where userid=#{userid}
</update>
11.3写一个测试类,测试查询结果。代码如下:
Userinfo u=new Userinfo();
u.setUsername("meimeiya");
u.setSex("m");
u.setBirthday(Date.valueOf("2017-12-12"));
u.setSal(10000);
u.setUserid(3);
userinfoMapper.updateUser2(u);
//同样需要提交和回滚方法,与添加用户一样,此处略去
12.in(1,2,3)这样的查询语句,入参是list
12.1 在UserinfoMapper.java的接口中定义一个方法,查询用户。代码如下:
public List<Userinfo> getUsersByIds(List<Integer> userids);
12.2 在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<select id="getUsersByIds" resultType="Userinfo">
select * from userinfo where userid in
<!-- collection遍历的是什么,list,array,item是每次遍历出的值,open,遍历出的内容以什么开头,
separator遍历出的每一条数据已什么分隔,close以什么结尾-->
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}<!-- 遍历出的数据 -->
</foreach>
</select>
12.3写一个测试类,测试查询结果。代码如下:
List<Integer> userids=new ArrayList<>();
userids.add(1);
userids.add(3);
userids.add(4);
List<Userinfo> userinfo= userinfoMapper.getUsersByIds(userids);
for(Userinfo user:userinfo){
System.out.println(user.getSal());
}
13.in(1,2,3)这样的删除语句
13.1 在UserinfoMapper.java的接口中定义一个方法,删除用户。代码如下:
public void deleteUsersByIds(List<Integer> userids);
13.2 在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<delete id="deleteUsersByIds">
delete from userinfo where userid in
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
13.3 写一个测试类,测试查询结果。代码如下:
List<Integer> userids=new ArrayList<>();
userids.add(1);
userids.add(3);
userids.add(4);
userinfoMapper.deleteUsersByIds(userids);
//省去提交回滚代码
14. in(1,2,3)这样的查询语句,入参是[]
14.1 在UserinfoMapper.java的接口中定义一个方法,查询用户。代码如下:
public List<Userinfo> getUsersByIds2(Integer[] userids);
14.2 在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<select id="getUsersByIds2" resultType="Userinfo">
select * from userinfo where userid in
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
14.3 写一个测试类,测试查询结果。代码如下:
Integer a []={5,6};
List<Userinfo> userinfo= userinfoMapper.getUsersByIds2(a);
for(Userinfo user:userinfo){
System.out.println(user.getSal());
}
15.in(1,2,3) and sex=? 这样的查询语句,入参用map
15.1在UserinfoMapper.java的接口中定义一个方法,查询用户。代码如下:
public List<Userinfo> getUsers(Map m);
15.2 在UserinfoMapper.xml中写上对应的配置信息。代码如下:
<select id="getUsers" resultType="Userinfo">
select * from userinfo where sex=#{sex} and userid in
<!-- collection 是list集合中的一个key -->
<foreach collection="userids" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
15.3写一个测试类,测试查询结果。代码如下:
Map m=new HashMap();
m.put("sex","m");
List<Integer> userids=new ArrayList<Integer>();
userids.add(5);
userids.add(6);
m.put("userids",userids);
List<Userinfo> userinfo= userinfoMapper.getUsers(m);
for(Userinfo user:userinfo){
System.out.println(user.getSal());
}