MyBatis入门学习笔记之一
1.MyBatis介绍
MyBatis是一个优秀的持久性框架,它对jdbc的操作进行封装,是开发者只需关注sql本身,而不需花精力去处理注册驱动、创建连接,创建statement等繁杂的过程。
原理:MyBatis通过xml或注解的方式将要执行的各种statement配置起来,通过java对象和statement的sql进行映射生成最终执行的sql语句,最后由MyBatis框架执行sql语句映射到java对象并返回。
2.MyBatis入门
mybatis的核心架构
图片转载至服务器之家 连接:
MyBatis开发步骤
1.创建持久化po类。
2.创建全局配置文件SqlMapConfig.xml
3.编写映射文件Mapper.xml
4.在SqlMapConfig.xml中加载映射文件
5.编写测试程序
测试程序的步骤如下:
- 读取配置文件
-
通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂
-
通过SqlSessionFactory创建SqlSession
- 调用SqlSession中的操作数据库的方法
- 关闭SqlSession
案例:
1编写持久类
package oyb.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable{ private int id; private String username; private Date birthday; private String sex; private String address; @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
编写全局配置文件SqlMapConfig.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"> <configuration> <!--配置mybatis的环境信息--> <environments default="development"> <environment id="development"> <!--配置JDBC事务控制,由mybatis管理--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源,采用dbcp连接池--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatisday01?useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> </configuration>
在src目录下创建sqlmap这个包,在包里面创建User.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="user"> <!-- id:statement的id,要求在命名空间内唯一 parameterType:传入的参数类型 resultType:返回的类型 #{id}:表示该占位符待接收参数的名称为id。 --> <select id="findUserById" parameterType="int" resultType="oyb.domain.User"> SELECT * FROM USER WHERE id = #{id} </select> </mapper>
在SqlMapConfig.xml中配置映射
<mappers> <mapper resource="oyb/sqlmap/User.xml"></mapper>
</mappers>
测试类:
package oyb.test; 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 org.junit.Test; import oyb.domain.User; import java.io.IOException; import java.io.InputStream; public class test { @Test public void test() throws Exception { //读取配置文件 InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); //通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); //通过SqlSessionFactory创建SqlSession SqlSession sqlSession = sessionFactory.openSession(); //调用SqlSession操作数据库的方法 User user = sqlSession.selectOne("findUserById", 28); System.out.println(user); } }
插入用户,在Mapper.xml文件中
<insert id="insertUser" parameterType="oyb.domain.User"> INSERT INTO USER(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address})
</insert>
在test类中
sqlSession.insert("insertUser",new User("pengzhen",new Date(),"1","dongguan")); sqlSession.commit();
其他的操作类似,不做过多的介绍
3.mapper代理方式
在实际开发过程中,我们只需要编写mapper接口,mybatis会自动为mapper接口生成动态代理类
编写步骤
- 在工程中创建一个新的包,mapper,再创建一个名为UserMapper的接口
package oyb.mapper; import oyb.domain.User; public interface UserMapper { public void insertUser(User user); public User findUserById(int id); }
- 在mapper下创建UserMapper.xml文件,文件名一定要和UserMapper接口一样
<?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="oyb.mapper.UserMapper"> <!-- id:statement的id,要求在命名空间内唯一 parameterType:传入的参数类型 resultType:返回的类型 #{id}:表示该占位符待接收参数的名称为id。 --> <select id="findUserById" parameterType="int" resultType="oyb.domain.User"> SELECT * FROM USER WHERE id = #{id} </select> <insert id="insertUser" parameterType="oyb.domain.User"> INSERT INTO USER(username,birthday,sex,address) VALUES (#{username},#{birthday},#{sex},#{address}) </insert> </mapper>
全局配置文件
<mappers> <mapper resource="oyb/mapper/UserMapper.xml"></mapper> </mappers>
测试类
package oyb.test; 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 org.junit.Before; import org.junit.Test; import oyb.domain.User; import oyb.mapper.UserMapper; import java.io.IOException; import java.io.InputStream; import java.util.Date; public class test { SqlSessionFactory sessionFactory; @Before public void setup()throws Exception{ //读取配置文件 InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml"); //通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂 sessionFactory = new SqlSessionFactoryBuilder().build(is); } @Test public void test() throws Exception { SqlSession session = sessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); User user = new User(); user.setUsername("oybbbb"); userMapper.insertUser(user); session.commit(); session.close(); } }
可以在src目录下配置db.properties文件
driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatisday01?useUnicode=true&characterEncoding=utf8 name=root password=123456
全局配置文件就可以这样写
<?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"> <configuration> <properties resource="db.properties"></properties> <!--配置mybatis的环境信息--> <environments default="development"> <environment id="development"> <!--配置JDBC事务控制,由mybatis管理--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源,采用dbcp连接池--> <dataSource type="POOLED"> <property name="driver" value="${driverClass}"/> <property name="url" value="${url}"/> <property name="username" value="${name}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="oyb/mapper/UserMapper.xml"></mapper> <!-- <mapper resource="oyb/sqlmap/User.xml"></mapper>--> </mappers> </configuration>
5.MyBatis的映射文件
1.输入映射parametertype
上面的例子已经介绍了往parameterType传递简单类型以及持久对象类型,下面介绍如果parameterType是包装类型的情况
编写包装类
package oyb.vo; import oyb.domain.User; public class UserQueryVO { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
修改UserMapper.xml文件
<select id="findUserList" parameterType="userQueryVO" resultType="user"> SELECT * FROM USER WHERE sex = #{user.sex} AND username LIKE '%${user.username}%' </select>
编写测试类
@Test public void test3() throws Exception { SqlSession session = sessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); UserQueryVO vo = new UserQueryVO(); User user = new User(); user.setUsername("oy"); user.setSex("2"); vo.setUser(user); List<User> userList = userMapper.findUserList(vo); System.out.println(userList); session.close(); }
2.输出映射resultType
简单类型跟持久化类型上面的例子已经讲到了,而持久类pojo列表和pojo对象是一样的都是类名。
6.动态SQL
if标签:作为判断传入的参数
where标签
修改UserMapper.xml文件
<select id="findUserList" parameterType="userQueryVO" resultType="user"> SELECT * FROM USER <where> <if test="user != null"> <if test="user.sex != null and user.sex != '' "> sex = #{user.sex} </if> <if test="user.username != null and user.username != '' "> AND username LIKE '%${user.username}%' </if> </if> </where> </select>
foreach的遍历
案例查询指定id的用户
UserQueryVO
package oyb.vo; import oyb.domain.User; import java.util.List; public class UserQueryVO { private User user; private List<Integer>ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
UserMapper.xml
<select id="findUserList" parameterType="userQueryVO" resultType="user"> SELECT * FROM USER <where> <if test="ids !=null and ids.size >0"> <foreach collection="ids" item="id" open="And id IN (" close=")" separator=","> ${id} </foreach> </if> </where> </select>
测试方法
@Test public void test4() throws Exception { SqlSession session = sessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); UserQueryVO vo = new UserQueryVO(); List<Integer> ids = new ArrayList<Integer>(); ids.add(34); ids.add(10); ids.add(16); vo.setIds(ids); System.out.println(userMapper.findUserList(vo)); session.close(); }