目录
-
CRUD操作
-
代码
-
package cn.lq.test; import cn.lq.dao.DaoUser; import cn.lq.domain.QueryCondition; import cn.lq.domain.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.apache.ibatis.io.Resources; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.List; /* author: lq time: 2020-04-14 18:52 */ public class TestMybatis { private InputStream is = null; private SqlSessionFactory factory = null; private SqlSession sqlSession = null; private DaoUser daoUser = null; /** * 初始化操作 */ @Before public void init() throws IOException { //1读取配置文件 is = Resources.getResourceAsStream("SqlMapConfig.xml");//Resources类使用的包是:import org.apache.ibatis.io.Resources; //2创建SqlSessionFactory工厂 factory = new SqlSessionFactoryBuilder().build(is); //3使用工厂生产SqlSession对象 sqlSession = factory.openSession(true);//true 设置自动提交事务, 不推荐使用自动题解事务 //4使用SQLSession创建dao的代理对象 daoUser = sqlSession.getMapper(DaoUser.class); //5使用代理对象执行方法 } /** * 提交事务 * 释放资源 */ @After public void destroy() throws IOException { //提交事务 // sqlSession.commit(); //6释放资源 is.close(); sqlSession.close(); } /** * mybatis入门 * * @throws IOException */ @Test public void testFindAll() throws IOException { List<User> users = daoUser.findAll(); for (User user : users) { System.out.println(user); } } /** * 测试 添加用户 * * @throws IOException */ @Test public void testAdd() throws IOException { User user = new User(null, "lq2", new Date(), "m", "hn"); System.out.println("user = " + user); daoUser.add(user); System.out.println("user = " + user); } /** * 测试 更新用户 * * @throws IOException */ @Test public void testUpdate() throws IOException { User user = new User(49, "lq1", new Date(), "f", "hn1"); daoUser.update(user); } /** * 测试 删除用户 * * @throws IOException */ @Test public void testDelById() throws IOException { daoUser.delById(46); } /** * 测试 根据id查询 * * @throws IOException */ @Test public void testFindById() throws IOException { User user = daoUser.findById(45); System.out.println("user = " + user); } /** * 测试 模糊查询 * * @throws IOException */ @Test public void testFindByUsername() throws IOException { String username ="王"; // % 要在传递参数的时候进行设置 List<User> users = daoUser.findByUsername("%" + username + "%"); for (User user : users) { System.out.println(user); } } /** * 测试 查询总记录数 * * @throws IOException */ @Test public void testFindTotalCount() throws IOException { int count = daoUser.findTotalCount(); System.out.println("count = " + count); } /** * 测试 模糊查询 * * @throws IOException */ @Test public void testFindByQueryCondition() throws IOException { User user = new User(); user.setUsername("%王%"); QueryCondition queryCondition = new QueryCondition(); queryCondition.setUser(user); List<User> byQueryCondition = daoUser.findByQueryCondition(queryCondition); for (User user1 : byQueryCondition) { System.out.println(user1); } } }
-
<?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="cn.lq.dao.DaoUser"> <resultMap id="userMap" type="user"> <!--必须先配置主键的对应关系--> <id property="uid" column="id"></id> <!--配置剩余非主键的对应关系--> <result property="userName" column="username"></result> </resultMap> <!--配置查询所有--> <!--属性id(方法名)和resultType(写全类名)是不能缺少的!--> <select id="findAll" resultType="user"> select * from user </select> <!--添加--> <insert id="add" parameterType="user"> <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER"> <!--keyProperty : 实体类的对应属性--> <!--keyColumn : 数据库表中对应的字段--> <!--order : 执行的先后顺序--> select last_insert_id(); </selectKey> insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address}); </insert> <!--更新--> <update id="update" parameterType="user"> update user set username=#{username}, birthday=#{birthday}, sex=#{sex}, address=#{address} where id=#{id} </update> <!--删除--> <delete id="delById" parameterType="int"> <!--因为传过来的参数只有一个, 所以参数名字可以随便写--> delete from user where id = #{uid} </delete> <!--根据id查询--> <select id="findById" parameterType="int" resultType="user"> select * from user where id=#{id} </select> <!--模糊查询--> <select id="findByUsername" parameterType="string" resultType="user"> select * from user where username like #{username} </select> <!--查询总记录数--> <select id="findTotalCount" resultType="int"> select count(*) from user </select> <!--模糊查询--> <select id="findByQueryCondition" parameterType="cn.lq.domain.QueryCondition" resultType="user"> select * from user where username like #{user.username} </select> </mapper>
-
-
-
保存操作的细节
- 我们再添加一个记录时, 会创建一个对应的实体类对象(user), 但是我们并不会去指定这个实体类对象的id, 因为这个id是在添加数据库的时候自动产生的. 比如说, 此时的user里面的属性是这样的:user={id=null, username="lq", age=22}, 在你执行完插入语句之后, user的id值仍然 是null. 如果说你想在执行完插入语句之后, 能够将自动生成的id值赋值给user里面的id值, 那么你就需要在映射配置文件里面添加一些语句, 代码如下:
-
<!--添加--> <insert id="add" parameterType="user"> <selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER"> <!--keyProperty : 实体类的对应属性--> <!--keyColumn : 数据库表中对应的字段--> <!--order : 执行的先后顺序--> select last_insert_id(); </selectKey> insert into user(username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address}); </insert>
-
- 我们再添加一个记录时, 会创建一个对应的实体类对象(user), 但是我们并不会去指定这个实体类对象的id, 因为这个id是在添加数据库的时候自动产生的. 比如说, 此时的user里面的属性是这样的:user={id=null, username="lq", age=22}, 在你执行完插入语句之后, user的id值仍然 是null. 如果说你想在执行完插入语句之后, 能够将自动生成的id值赋值给user里面的id值, 那么你就需要在映射配置文件里面添加一些语句, 代码如下:
-
OGNL表达式
-
概念
- Object Graphic Navigation Language: 对象图导航语言
- 它是通过对象取值的方法, 在写法上把get给省略了
-
用处
-
多条件查询
- 我们在查询的过程中可能会用多个实体类来作为查询的条件, 这个时候就可以用到上面的那个ognl表达式了
- 做法:
- 把多个实体类再封装到一个对象中去, 通过对象.的方式调用属性即可
-
-
-
resultMap
-
概念
- 当你的实体类的属性名和数据库表的字段名对应不上的时候, 你就可以在映射配置文件中定义一个这样的resultMap, 自己定义二者的对应关系, 然后, 如果哪一个sql语句需要用的这个自定义映射关系的话, 只需要把他的parameterType改成resultMap即可.
-
<resultMap id="userMap" type="user"> <!--必须先配置主键的对应关系--> <id property="uid" column="id"></id> <!--配置剩余非主键的对应关系--> <result property="userName" column="username"></result> </resultMap>
-
-
properties标签
-
作用
- 可以将配置数据库的信息单独独立出来成为一个properties文件
- 引用外部的数据库配置文件
-
-
url
-
概念
- 统一资源定位符, 可以再全网使用
- url包含: 协议 主机名 端口号 uri
- uri: 统一资源标识符
- 只可以在本机内使用
- uri: 统一资源标识符
-
获取本地资源的url
- 直接将文件拖进浏览器中, 在地址栏里面就可以复制到文件的url
-
-
typeAlias package
-
typeAlias
- 用来给实体类起别名
- 之前在指定参数是int类型时, 之所以可以仅仅写一个int, 而不用写int的全类名, 就是因为int已经被起了别名
- 用来给实体类起别名
-
package
- 可以直接给整个包下面的类起别名, 直接使用类名, 不区分大小写
-
<typeAliases> <!--给实体类起别名, type:实体类的全类名 alias:实体类的别名,并且在使用时可以不用区分大小写 --> <!--<typeAlias type="cn.lq.domain.User" alias="user"></typeAlias>--> <!--可以直接给整个包下面的类起别名, 直接使用类名, 不区分大小写--> <package name="cn.lq.domain"></package> </typeAliases>
-
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的文件 --> <mappers> <!--注意 路径是文件夹, 不是包, 所以间隔是 / 不是 . --> <!--<mapper resource="cn/lq/dao/DaoUser.xml"></mapper>--> <!--可以直接指定dao所在的包, 这样就不用再写mapper了, 也不用区分什么时候用class或resource了 --> <package name="cn.lq.dao"></package> </mappers>
-