Mybatis学习记录(1)
1.Mybatis介绍
Mybatis是apache的一个开源项目iBatis,Mybatis是一个优秀的持久层框架,他对jdbc的操作数据库的过程进行封装,使开发者只需要关注sql本身,不需要花费精力去处理例如注册驱动,创建connection,创建statement,手动设置参数,结果集检索等jdbc复杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement,preparedStatement,CallableStatement)配安置起来,并通过java对象和statement中的sql进行映射生成最终执行sql语句,最后由mybatis框架执行sql,并将结果映射成java对象返回。
2.jdbc编程问题
(1)数据库连接创建,释放频繁造成系统资源浪费,从而影响系统性能。(使用连接池可以解决此问题)
(2)Sql语句在代码中硬编码,造成代码不亦伟乎,实际应用中sql变化的可能较大,sql变动需要改变java代码。
(3)使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
(4)对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护。(将数据库记录封装成pojo对象解析比较方便)
3.Mybatis架构
(1)mybatis配置SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。
此文件需要在SqlMapConfig.xml中加载。
(2)通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
(3)由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行。
(4)mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
(5)Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
(6)Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,
输入参数映射就是jdbc编程中对preparedStatement设置参数。
(7)Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中
对结果的解析处理过程。
4.使用Mybatis的入门程序
先配置核心文件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> <!-- 和spring整合后 environments配置将废除 链接Mysql时,spring管理连接 jdbcTemplate c3p0--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理 --> <transactionManager type="JDBC" /> <!-- 数据库连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/javaweb_mybatis?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- Mapper的位置 --> <mappers> <mapper resource="sqlMap/User.xml"/> </mappers> </configuration>
建立pojo对象
package com.javaweb.mybatis.model; import java.io.Serializable; public class User implements Serializable{ /** * user表的pojo对象 */ private static final long serialVersionUID = 1L; private String id; private String userName; private String userAge; private String userSex; private String userAddress; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserAge() { return userAge; } public void setUserAge(String userAge) { this.userAge = userAge; } public String getUserSex() { return userSex; } public void setUserSex(String userSex) { this.userSex = userSex; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } @Override public String toString() { // TODO Auto-generated method stub return "User [id=" + id + ", username=" + userName + ", sex=" + userSex + ", userAge=" + userAge + ", userAddress=" + userAddress + "]"; } }
配置sql映射文件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"> <!-- 写sql语句 --> <mapper namespace="test"> </mapper>
(1)根据id查询用户
/* * 根据id查询用户 */ @Test public void testmybatis() throws Exception{ //加载核心配置文件 String resource="sqlMapConfig.xml"; InputStream in=Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); User user = sqlSession.selectOne("test.findUserById", "1"); System.out.println(user); }
User.xml
<mapper namespace="test"> <!-- 通过id查询用户 --> <select id="findUserById" parameterType="String" resultType="com.javaweb.mybatis.model.User"> select * from mybatis_user where id= #{v} </select> </mapper>
(2)根据用户名模糊查询用户列表
/* * 根据用户名模糊查询用户列表 */ @Test public void testmybatis2() throws Exception{ //加载核心配置文件 String resource="sqlMapConfig.xml"; InputStream in=Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); List<User> userlist = sqlSession.selectList("test.findUserByUserName", "王"); for(User user2 :userlist){ System.out.println(user2); } }
User.xml
<!-- 根据用户名模糊查询用户列表 #{}表示占位符 select * from mybatis_user where id= ? ${}表示字符串拼接 select * from mybatis_user where username like --> <select id="findUserByUserName" parameterType="String" resultType="com.javaweb.mybatis.model.User"> select * from mybatis_user where username like '%${value}%' </select>
(3)添加用户
/* * 添加用户 */ @Test public void testmybati3() throws Exception{ //加载核心配置文件 String resource="sqlMapConfig.xml"; InputStream in=Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql语句 User user =new User(); user.setId("4"); user.setUserName("李四"); user.setUserAge("22"); user.setUserSex("男"); user.setUserAddress("芜湖"); int i = sqlSession.insert("test.addUser",user); sqlSession.commit(); }
User.xml
<!-- 添加用户 --> <insert id="addUser" parameterType="com.javaweb.mybatis.model.User"> insert into mybatis_user (id,userName,userSex,userAge,userAddress) values(#{id},#{userName},#{userSex},#{userAge},#{userAddress}) </insert>
(4)更新用户
/* * 更新用户 */ @Test public void testmybati4() throws Exception{ //加载核心配置文件 String resource="sqlMapConfig.xml"; InputStream in=Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql语句 User user =new User(); user.setId("2"); user.setUserName("张三2"); user.setUserAge("22"); user.setUserSex("男"); int i = sqlSession.update("test.updateUserById",user); sqlSession.commit(); }
User.xml
<!-- 更新用户 --> <update id="updateUserById" parameterType="com.javaweb.mybatis.model.User"> update mybatis_user set username= #{userName},userAge = #{userAge},userSex =#{userSex} where id = #{id} </update>
(5)删除用户
/* * 删除用户 */ @Test public void testmybati5() throws Exception{ //加载核心配置文件 String resource="sqlMapConfig.xml"; InputStream in=Resources.getResourceAsStream(resource); //创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); //创建SqlSession SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql语句 User user=new User(); user.setId("4"); int i = sqlSession.delete("test.deleteUserById",user); sqlSession.commit(); }
User.xml
<!-- 删除用户 --> <delete id="deleteUserById" parameterType="String"> delete from mybatis_user where id = #{id} </delete>