Mybatis - Day01
注意! mybatis默认不提交事务,所以在每次修改,增加,删除之后都要手动提交
-
注意:这里我们userMapping 映射我们最好跟我们的Dao层是同级的 所以我们也创建一个it.heima的目录
-
Mybatis实现数据库的查询 (先导坐标)
-
第一步:先创建一个user类 给出set get方法
-
第二步:创建一个userMapping.xml配置文件 在里面编写我们需要的sql语句 注意这里是是resultType 不是resultMap
<?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="userMapper"> <!--调用的时候是userMapper.findAll 来调用这个sql语句 resultMap里面的是你得到的结果封装成这个对象--> <select id="findAll" resultType="com.itheima.pojo.User"> select * from user </select> </mapper>
-
第三步:创建一个数据源配置文件(sqlMapConfig.xml文件) 里面连接userMapping.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> <!--数据源环境--> <environments default="develpment"> <!--表示默认使用id为devlement的环境配置--> <environment id="develpment"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="xjj168"/> </dataSource> </environment> </environments> <!--加载Mapping映射文件--> <mappers> <mapper resource="com\itheima\mapping\UserMapping.xml"></mapper> </mappers> </configuration>
-
第四步:编写程序测试
@Test public void test() throws IOException { //得到核心配置文件sqlMapConfig.xml InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); //创建session工厂对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); //获得session回话对象 SqlSession sqlSession = sqlSessionFactory.openSession(); //执行操作 参数为namespace.id List<User> userList = sqlSession.selectList("userMapper.findAll"); for (User user : userList) { System.out.println(user); } }
先获取核心配置文件,在创建session工厂对象,然后获得session会话对象,执行操作
-
-
增加user操作
注意! 注释里面的#{}也默认占了一个占位符(下面这种注释里面有#{}就会报错)
<!--增加user--> <!--这里是参数类型,你增加一个用户,肯定是传进来一个参数user ,所以这里是参数类型,不是结果类型--> <insert id="save" parameterType="com.itheima.pojo.User"> /*这里采用${}的方式来获取你传进来的user的username属性和password属性*/ insert into user values(#{id},#{username},#{password}) </insert>
正确的xml文件是 注释里面没有#{}, 这里是parameterType属性来表示你要插入的类型
<!--增加user--> <!--这里是参数类型,你增加一个用户,肯定是传进来一个参数user ,所以这里是参数类型,不是结果类型--> <insert id="save" parameterType="com.itheima.pojo.User"> /*这里采用的方式来获取你传进来的user的username属性和password属性*/ insert into user values(#{id},#{username},#{password}) </insert>
//执行增加user操作 因为目前没有客户端所以手动创建一个user对象 User user = new User(); user.setUsername("tom"); user.setPassword("adc"); //之后经行操作 sqlSession.insert("userMapper.save",user); //千万注意! mybatis默认不主动提交事务 所以我们需要手动提交 sqlSession.commit(); sqlSession.close();
-
删除操作
<!--删除操作--> <!--你要传进来的参数的类型--> <delete id="delete" parameterType="com.itheima.pojo.User"> /*老师的parameterType="java.long.Integer"> */ delete from user where id = #{id} </delete>
//获取session会话对象 SqlSession sqlSession = sqlSessionFactory.openSession(); User user = new User(); user.setId(3); //执行操作 sqlSession.update("userMapper.delete",user); sqlSession.commit(); sqlSession.close();
-
抽取jdbc.properties文件(resource里面是jdbc问的路径)
<!--导入jdbc.properties文件--> <properties resource="jdbc.properties"></properties> <!--数据源环境--> <environments default="development"> <!--表示默认使用id为development的环境配置--> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/>
-
在sqlMappingConfig文件中为我们映入的UserMapper.xml中 执行sql语句是需要传入的type定义一个别名
sqlMappingConfig文件 (注意typeAliases 和configuration之间的顺序)
<!--定义User一个别名,这样他在映射文件写type的时候就只需要用别名即可--> <typeAliases> <typeAlias type="com.itheima.pojo.User" alias="user"></typeAlias> </typeAliases>
上面定义了别名那么UserMapper.xml文件的type可以写成user
<select id="findAll" resultType="user"> select * from user </select>
-
如果在获取session会话对象的时候给传入true 则会帮你自动提交
//获取session会话对象 SqlSession sqlSession = sqlSessionFactory.openSession(true); User user = new User(); user.setUsername("lzx"); user.setPassword("sss"); user.setId(2); //执行操作 sqlSession.update("userMapper.update",user); // sqlSession.commit();
让Mybatis自动给你创建实现类
-
以前写Dao层的时候,我们需要一个接口,一个实现类,现在有了Mybatis只要准寻他的规则,就自动帮我们创建实现类
规则:
-
接口中定义的方法的返回值,必须和UserMapper.xml中你的sql语句的结果返回类型一样(比如通过id查一个人,返回值必须是user,接口的返回值也要是user)
<select id="findById" parameterType="int" resultType="user"> select * from user where id=#{id} </select>
-
接口中定义的方法的方法名,必须和UserMapper.xml中你的sql语句的id的值一样
-
你想要Mybatis给你创建实现类的接口的权限的名必须和UserMapper.xml中的namespace名字一样
<mapper namespace="com.itheima.dao.UserMapper">
-
接口中传入的参数的类型,必须和UserMapper.xml中你的sql语句的parameterType的类型一样
parameterType="int"
-
接口的方法例子
public List<User> findAll(); public User findById(int id); public void save(User user); public void deleteById(int id); public void updateById(User user);
-
UserMapper.xml的例子
<mapper namespace="com.itheima.dao.UserMapper"> <!--查询操作--> <select id="findAll" resultType="user"> select * from user </select> <!--根据id进行查询--> <select id="findById" parameterType="int" resultType="user"> select * from user where id=#{id} </select> <!--增加一个用户--> <insert id="save" parameterType="user" > insert into user(username,password) values(#{username},#{password}) </insert> <!--删除一个用户--> <delete id="deleteById" parameterType="int"> delete from user where id=#{id} </delete> <!--跟新用户--> <update id="updateById" parameterType="user" > update user set username = #{username} where id = #{id} </update> </mapper>
-
-
上面规则都正确了怎么调用呢?(注意这里getMapper中参入的参数是你要创建的实现类的接口.class)
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //这里是参数是Dao层的接口,传入之后会自动帮你生成一个代理实现类 UserMapper mapper = sqlSession.getMapper(UserMapper.class); //生成的实现类 ,你直接调用方法即可 List<User> userList = mapper.findAll(); System.out.println(userList); User user = mapper.findById(1); System.out.println(user);
动态的sql语句
-
以前的sql语句我们通过id=? 来查找一个人 没有id 来查找全部人, 现在 我们动态的将两个方法结合在一起
-
使用动态的sql 不仅可以查找单个人,也可以查找所有人,
-
我们查找单个人的sql语句是
select * from user where id=?或者select * from user where id=?and username=? and password=?
-
我们查找全部sql
select * from user
-
现在讲两者集合在一起 用if 来判断 是否等于0或者null 如果where里面有值,那么 where 判断语句就出现变成select * from user where id=?and username=? and password=?,如果 id username ,password 三个都没值,那么where就自动消失 变成了select * from user
注意! if之间有个and
<mapper namespace="com.itheima.mapper.UserMapper"> <select id="findUser" parameterType="user" resultType="user"> select * from user <where> <if test="id!=0"> and id=#{id} </if> <if test="username!=null"> and username=#{username} </if> <if test="password!=null"> and password=#{password} </if> </where> </select>
-
-
查询一个区间的user
-
查询id 等于一个区间内的user
-
接口方法为
List<User> queryBetween(List<Integer> ids);
-
sql语句为
<select id="queryBetween" parameterType="list" resultType="user"> select * from user <where> <foreach collection="list" open="id in(" close=")" item="id" separator=","> #{id} </foreach> </where> </select>
-
测试
ArrayList<Integer> ids = new ArrayList<Integer>(); ids.add(1); ids.add(4); ids.add(6); List<User> userList = mapper.queryBetween(ids); System.out.println(userList); }
-