目录
mybatis 的使用 —— 准备
下载完 mybatis
以后,将其核心包和依赖包导入工程即可 ;不过 mybatis
也依赖于 log4j
因此,需要再导入一个 log4j
的配置文件 ;
mybatis 的使用 —— 搭建好工程结构
创建一个配置包(config
),在里面进行 mybatis
的配置,其中全局配置(sqlMapConfig.xml
) 就放在这个包下面。
还有一个 sqlMap
包,这里是放置 sql
的配置文件的 ;
mybatis 的使用 —— 创建 sqlMapCnfig.xml
全局配置文件
在 config
包下面创建创建全局配置文件,全局配置文件的名字是任意的,可随便取名;
<?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 配置将废除-->
<environments default="development">
<environment id="development">
<!--事务管理,暂时有mybatis管-->
<transactionManager type="JDBC"/>
<!--数据源 暂时也由 mybatis 管理,以后都由 spring 来管理-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatisDay01?charset=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
mybatis 的使用 —— 根据用户 id 查询用户
首先在
sqlMap
包下面,创建映射文件
映射文件的名字,有2种写法:一种是
xxx.xml
;另一种是xxxMap.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="test"> <select id="selectBlog" parameterType="int" resultType="xin.ijava.pojo.User"> select * from User where id = #{id} </select> </mapper>
namespace
:名称空间,用来隔离 sql 语句id
:是表示映射文件中的sql
语句,由于最后sql
语句被封装到mappedStatement
对象中,因此,id
也可以看做是statement
对象的id
;#{}
:mybatis
中的占位符 ;#{id}
:这里的id
是接受输入参数的名字,当输入参数类型是java基本类型
的时候,id
可以随便取名字。当输入参数类型是pojo
时候,名字必须是输入参数的名字;parameterType
:输入参数类型 ;resultType
:输出结果类型,表示将单条
结果映射成对应的java对象类型
;不管返回的多条记录还是单条记录,它只关心单条或者多条中的单条返回的是什么类型 ;在
sqlMapCnfig.xml
中加载映射文件<!--加载映射文件--> <mappers> <!--地址从src包开始写,用斜杠代替--> <mapper resource="xin/ijava/config/sqlmap/User.xml"/> </mappers>
java 代码编写
package xin.ijava.mybatis; 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 xin.ijava.pojo.User; import java.io.IOException; import java.io.InputStream; /** * @author An */ public class MybatisTest { @Test public void findUserByIdTest() throws IOException { // 1、读取全局配置文件,传入会话工厂,以便创建会话,也可以使用 mybatis 的 Resources.getResourceAsStream("") ;读取 // 参数,都是从src开始写; // InputStream inputStream = MybatisTest.class.getClassLoader().getResourceAsStream("xin/ijava/config/sqlMapConfig.xml"); InputStream inputStream = Resources.getResourceAsStream("xin/ijava/config/sqlMapConfig.xml") ; // 2、创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream) ; // 3、创建会话 SqlSession sqlSession = factory.openSession() ; // 4、操作数据库 // selectOne :查询一条记录 User user = sqlSession.selectOne("test.findUserById",1); // 5、关闭会话 sqlSession.close(); System.out.println(user); } }
mybatis 的使用 —— 根据用户 name 查询用户(模糊查询 )
配置映射关系文件
<!--模糊查询--> <!-- ${value} :表示拼接字符串,它不加任何的修饰,进行拼接,会引起 sql注入攻击 ; 如果是接受基本类型,则里面的参数名,必须是 value ; --> <select id="findUsersByName" parameterType="java.lang.String" resultType="xin.ijava.pojo.User"> SELECT * FROM User where name LIKE '%${value}%' </select>
java
测试代码@Test public void findUsersByName() throws IOException { InputStream inputStream = Resources.getResourceAsStream("xin/ijava/config/sqlMapConfig.xml") ; SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = factory.openSession() ; // selectList :查询出多条记录 ; List<User> users = sqlSession.selectList("test.findUsersByName","小明") ; System.out.println(users); }
mybatis 的使用 —— 插入用户
配置映射关系
<!--插入用户--> <insert id="insertUser" parameterType="xin.ijava.pojo.User"> -- 主键返回 -- keyProperty:表示将主键赋给 pojo 的哪一个属性 -- order:表示该sql 相对于下面的 sql 的执行顺序 -- resultType :返回值类型 <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> INSERT into user(name,sex,birthday,address) VALUES (#{name},#{sex},#{birthday},#{address}) </insert>
这里面有个
主键返回
问题;我们一般都设置了主键自增长,这样我们插入进去的对象的id
,我们是没有赋值的,我们需要将自增长的id
赋给对象的id
;在
mybatis
中,按照上面的方法,可以完成主键返回
操作 ;其中主键返回
操作,一定要放在insert
之后 ;java 测试代码
@Test public void insertUser() throws IOException { InputStream inputStream = Resources.getResourceAsStream("xin/ijava/config/sqlMapConfig.xml") ; SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = factory.openSession() ; User user = new User(); user.setName("YAZ"); user.setSex("1"); // mybatis 支持java基本类型的转换的 user.setBirthday(new Date()); user.setAddress("苏州 张家港"); sqlSession.insert("test.insertUser",user) ; // 提交 sqlSession.commit(); sqlSession.close(); System.out.println(user.getId()); // 主键已经被赋值给 User 对象 }
mybatis 的使用 —— 删除用户
配置映射关系
<!--删除用户--> <delete id="deleteUserById" parameterType="java.lang.Integer"> DELETE FROM user WHERE id = #{id} </delete>
java 测试代码
@Test public void deleteUser() throws IOException { InputStream inputStream = Resources.getResourceAsStream("xin/ijava/config/sqlMapConfig.xml") ; SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = factory.openSession() ; sqlSession.delete("test.deleteUserById",2) ; // 提交 sqlSession.commit(); sqlSession.close(); }
mybatis 的使用 —— 更新用户
配置映射关系
<!--更新用户--> <update id="updateUserById" parameterType="xin.ijava.pojo.User"> UPDATE USER SET name = #{name},sex = #{sex},birthday = #{birthday},address = #{address} WHERE id = #{id} </update>
java 测试代码
@Test public void updateUserById() throws IOException { InputStream inputStream = Resources.getResourceAsStream("xin/ijava/config/sqlMapConfig.xml") ; SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = factory.openSession() ; User user = new User(); user.setId(3); user.setName("YAZ"); user.setSex("1"); // mybatis 支持java基本类型的转换的 user.setBirthday(new Date()); user.setAddress("苏州 吴侬软语"); sqlSession.update("test.updateUserById",user) ; // 提交 sqlSession.commit(); sqlSession.close(); }
小结
我们一路写下来,已经发现,mybatis
主要就在于 配置映射关系
,自己控制 sql
语句 ;